summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-07-23 09:40:56 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-07-23 09:40:56 +0700
commit7e6927b4fd7bcd9981ce56f3fc24f8a1b685be0d (patch)
tree7e51e30d35141f87ebc5ed7ed45a7ef5f8eb2f40
parentfbb10e5244efae7e459d26b92c81c5eda07b93ea (diff)
(andri) add validasi urutan approval pengajuan & realisasi PUM
-rw-r--r--indoteknik_custom/models/down_payment.py138
-rw-r--r--indoteknik_custom/views/down_payment_realization.xml4
2 files changed, 138 insertions, 4 deletions
diff --git a/indoteknik_custom/models/down_payment.py b/indoteknik_custom/models/down_payment.py
index e43d2a0c..afb8ca73 100644
--- a/indoteknik_custom/models/down_payment.py
+++ b/indoteknik_custom/models/down_payment.py
@@ -60,9 +60,17 @@ class DownPayment(models.Model):
('payment', 'Payment'),
], string='Status Pembayaran', default='pending', tracking=3)
- name_approval_departement = fields.Char(string='Approval Departement')
- name_approval_ap = fields.Char(string='Approval AP')
- name_approval_pimpinan = fields.Char(string='Approval Pimpinan')
+ name_approval_departement = fields.Char(string='Approval Departement', tracking=True)
+ name_approval_ap = fields.Char(string='Approval AP', tracking=True)
+ name_approval_pimpinan = fields.Char(string='Approval Pimpinan', tracking=True)
+
+ date_approved_department = fields.Datetime(string="Date Approved Department")
+ date_approved_ap = fields.Datetime(string="Date Approved AP")
+ date_approved_pimpinan = fields.Datetime(string="Date Approved Pimpinan")
+
+ position_department = fields.Char(string='Position Departement', tracking=True)
+ position_ap = fields.Char(string='Position AP', tracking=True)
+ position_pimpinan = fields.Char(string='Position Pimpinan', tracking=True)
departement_type = fields.Selection([
('sales', 'Sales'),
@@ -192,30 +200,71 @@ class DownPayment(models.Model):
# return
def action_approval_check(self):
+ jakarta_tz = pytz.timezone('Asia/Jakarta')
+ now = datetime.now(jakarta_tz).replace(tzinfo=None)
+ formatted_date = now.strftime('%d %B %Y %H:%M')
+
for rec in self:
+ if not rec.departement_type:
+ raise UserError("Field 'departement_type' wajib diisi sebelum approval.")
+
approver_id = rec._get_departement_approver()
+
if rec.status == 'pengajuan1':
if self.env.user.id != approver_id:
raise UserError("Hanya approver departement yang berhak menyetujui tahap ini.")
rec.name_approval_departement = self.env.user.name
+ rec.date_approved_department = now
+
+ # Mapping posisi berdasarkan departement_type
+ department_titles = {
+ 'sales': 'Sales Manager',
+ 'merchandiser': 'Merchandiser Manager',
+ 'marketing': 'Marketing Manager',
+ 'logistic': 'Logistic Manager',
+ 'procurement': 'Procurement Manager',
+ 'fat': 'Finance & Accounting Manager',
+ 'hr_ga': 'HR & GA Manager',
+ }
+ rec.position_department = department_titles.get(rec.departement_type, 'Departement Manager')
+
rec.status = 'pengajuan2'
+ rec.message_post(
+ body=f"Approval <b>Departement</b> oleh <b>{self.env.user.name}</b> "
+ f"pada <i>{formatted_date}</i>."
+ )
+
elif rec.status == 'pengajuan2':
if self.env.user.id != 23: # ID user AP
raise UserError("Hanya AP yang berhak menyetujui tahap ini.")
rec.name_approval_ap = self.env.user.name
+ rec.date_approved_ap = now
+ rec.position_ap = 'Finance AP'
rec.status = 'pengajuan3'
+ rec.message_post(
+ body=f"Approval <b>AP</b> oleh <b>{self.env.user.name}</b> "
+ f"pada <i>{formatted_date}</i>."
+ )
+
elif rec.status == 'pengajuan3':
if self.env.user.id != 7: # ID user Pimpinan
raise UserError("Hanya Pimpinan yang berhak menyetujui tahap ini.")
rec.name_approval_pimpinan = self.env.user.name
+ rec.date_approved_pimpinan = now
+ rec.position_pimpinan = 'Pimpinan'
rec.status = 'approved'
+ rec.message_post(
+ body=f"Approval <b>Pimpinan</b> oleh <b>{self.env.user.name}</b> "
+ f"pada <i>{formatted_date}</i>."
+ )
+
else:
raise UserError("Status saat ini tidak bisa di-approve lagi.")
- rec.message_post(body=f"Approval oleh {self.env.user.name} pada tahap {rec.status}")
+ # rec.message_post(body=f"Approval oleh {self.env.user.name} pada tahap <b>{rec.status}</b>.")
def action_reject(self):
@@ -347,6 +396,18 @@ class RealizationDownPayment(models.Model):
note_approval = fields.Text(string='Note Persetujuan', tracking=3)
+ name_approval_departement = fields.Char(string='Approval Departement', tracking=True)
+ name_approval_ap = fields.Char(string='Approval AP', tracking=True)
+ name_approval_pimpinan = fields.Char(string='Approval Pimpinan', tracking=True)
+
+ date_approved_department = fields.Datetime(string="Date Approved Department")
+ date_approved_ap = fields.Datetime(string="Date Approved AP")
+ date_approved_pimpinan = fields.Datetime(string="Date Approved Pimpinan")
+
+ position_department = fields.Char(string='Position Departement', tracking=True)
+ position_ap = fields.Char(string='Position AP', tracking=True)
+ position_pimpinan = fields.Char(string='Position Pimpinan', tracking=True)
+
status = fields.Selection([
('draft', 'Draft'),
('pengajuan1', 'Menunggu Approval Departement'),
@@ -528,6 +589,75 @@ class RealizationDownPayment(models.Model):
'res_id': move.id,
'target': 'current',
}
+
+ def action_approval_check(self):
+ jakarta_tz = pytz.timezone('Asia/Jakarta')
+ now = datetime.now(jakarta_tz).replace(tzinfo=None)
+ formatted_date = now.strftime('%d %B %Y %H:%M')
+
+ for rec in self:
+ if not rec.departement_type:
+ raise UserError("Field 'departement_type' wajib diisi sebelum approval.")
+
+ approver_id = rec._get_departement_approver()
+
+ if rec.status == 'pengajuan1':
+ if self.env.user.id != approver_id:
+ raise UserError("Hanya approver departement yang berhak menyetujui tahap ini.")
+ rec.name_approval_departement = self.env.user.name
+ rec.date_approved_department = now
+
+ # Mapping posisi berdasarkan departement_type
+ department_titles = {
+ 'sales': 'Sales Manager',
+ 'merchandiser': 'Merchandiser Manager',
+ 'marketing': 'Marketing Manager',
+ 'logistic': 'Logistic Manager',
+ 'procurement': 'Procurement Manager',
+ 'fat': 'Finance & Accounting Manager',
+ 'hr_ga': 'HR & GA Manager',
+ }
+ rec.position_department = department_titles.get(rec.departement_type, 'Departement Manager')
+
+ rec.status = 'pengajuan2'
+
+ rec.message_post(
+ body=f"Approval <b>Departement</b> oleh <b>{self.env.user.name}</b> "
+ f"pada <i>{formatted_date}</i>."
+ )
+
+ elif rec.status == 'pengajuan2':
+ if self.env.user.id != 23: # ID user AP
+ raise UserError("Hanya AP yang berhak menyetujui tahap ini.")
+ rec.name_approval_ap = self.env.user.name
+ rec.date_approved_ap = now
+ rec.position_ap = 'Finance AP'
+ rec.status = 'pengajuan3'
+
+ rec.message_post(
+ body=f"Approval <b>AP</b> oleh <b>{self.env.user.name}</b> "
+ f"pada <i>{formatted_date}</i>."
+ )
+
+ elif rec.status == 'pengajuan3':
+ if self.env.user.id != 7: # ID user Pimpinan
+ raise UserError("Hanya Pimpinan yang berhak menyetujui tahap ini.")
+ rec.name_approval_pimpinan = self.env.user.name
+ rec.date_approved_pimpinan = now
+ rec.position_pimpinan = 'Pimpinan'
+ rec.status = 'approved'
+
+ rec.message_post(
+ body=f"Approval <b>Pimpinan</b> oleh <b>{self.env.user.name}</b> "
+ f"pada <i>{formatted_date}</i>."
+ )
+
+ else:
+ raise UserError("Status saat ini tidak bisa di-approve lagi.")
+
+ # rec.message_post(body=f"Approval oleh {self.env.user.name} pada tahap <b>{rec.status}</b>.")
+
+
class DownPaymentApOnly(models.TransientModel):
_name = 'down.payment.ap.only'
diff --git a/indoteknik_custom/views/down_payment_realization.xml b/indoteknik_custom/views/down_payment_realization.xml
index 64b3af91..e20a5e66 100644
--- a/indoteknik_custom/views/down_payment_realization.xml
+++ b/indoteknik_custom/views/down_payment_realization.xml
@@ -9,6 +9,10 @@
type="object"
string="Validasi"
class="btn-primary"/>
+ <button name="action_approval_check"
+ type="object"
+ string="Checking/Approval"
+ attrs="{}"/>
<button name="action_cab"
type="object"
string="AP Only"/>