diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-07-23 09:40:56 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-07-23 09:40:56 +0700 |
| commit | 7e6927b4fd7bcd9981ce56f3fc24f8a1b685be0d (patch) | |
| tree | 7e51e30d35141f87ebc5ed7ed45a7ef5f8eb2f40 | |
| parent | fbb10e5244efae7e459d26b92c81c5eda07b93ea (diff) | |
(andri) add validasi urutan approval pengajuan & realisasi PUM
| -rw-r--r-- | indoteknik_custom/models/down_payment.py | 138 | ||||
| -rw-r--r-- | indoteknik_custom/views/down_payment_realization.xml | 4 |
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"/> |
