From b0bde0e002f5321f7462f520d545876cdc14fd2e Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Tue, 14 Oct 2025 15:22:46 +0700 Subject: (andri) add cab reimburse + fix view realisasi --- .../models/advance_payment_request.py | 143 +++++++++++++++++++-- indoteknik_custom/security/ir.model.access.csv | 2 +- .../views/advance_payment_request.xml | 37 +++++- .../views/advance_payment_settlement.xml | 13 +- 4 files changed, 174 insertions(+), 21 deletions(-) diff --git a/indoteknik_custom/models/advance_payment_request.py b/indoteknik_custom/models/advance_payment_request.py index c511f2e7..5c6d59c4 100644 --- a/indoteknik_custom/models/advance_payment_request.py +++ b/indoteknik_custom/models/advance_payment_request.py @@ -72,18 +72,18 @@ class AdvancePaymentRequest(models.Model): ('payment', 'Payment'), ], string='Status Pembayaran', default='pending', tracking=3) - name_approval_departement = fields.Char(string='Approval Departement', tracking=True) - name_approval_ap = fields.Char(string='Approval AP', tracking=True) + name_approval_departement = fields.Char(string='Approval Departement') + name_approval_ap = fields.Char(string='Approval AP') email_ap = fields.Char(string = 'Email AP') - name_approval_pimpinan = fields.Char(string='Approval Pimpinan', tracking=True) + name_approval_pimpinan = fields.Char(string='Approval Pimpinan') 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) + position_department = fields.Char(string='Position Departement') + position_ap = fields.Char(string='Position AP') + position_pimpinan = fields.Char(string='Position Pimpinan') approved_by = fields.Char(string='Approved By', tracking=True, track_visibility='always') @@ -151,6 +151,29 @@ class AdvancePaymentRequest(models.Model): compute='_compute_settlement_name' ) + total_reimburse = fields.Monetary( + string='Total Reimburse', + compute='_compute_total_reimburse' + ) + + @api.depends('reimburse_line_ids.total') + def _compute_total_reimburse(self): + for request in self: + request.total_reimburse = sum(request.reimburse_line_ids.mapped('total')) + + def action_open_create_reimburse_cab(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'Buat Jurnal Reimburse', + 'res_model': 'create.reimburse.cab.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_request_id': self.id, + } + } + @api.depends('settlement_ids') def _compute_has_settlement(self): for rec in self: @@ -903,19 +926,19 @@ class AdvancePaymentSettlement(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) + name_approval_departement = fields.Char(string='Approval Departement') + name_approval_ap = fields.Char(string='Approval AP') + name_approval_pimpinan = fields.Char(string='Approval Pimpinan') 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) + position_department = fields.Char(string='Position Departement') + position_ap = fields.Char(string='Position AP') + position_pimpinan = fields.Char(string='Position Pimpinan') - approved_by = fields.Char(string='Approved By', tracking=True, track_visibility='always') + approved_by = fields.Char(string='Approved By', track_visibility='always') status = fields.Selection([ ('pengajuan1', 'Menunggu Approval Departement'), @@ -955,6 +978,19 @@ class AdvancePaymentSettlement(models.Model): move_id = fields.Many2one('account.move', string='Journal Entries', domain=[('move_type', '=', 'entry')]) is_cab_visible = fields.Boolean(string='Is Journal Uang Muka Visible', compute='_compute_is_cab_visible') + user_id = fields.Many2one( + 'res.users', + string='Diajukan Oleh', + related='pum_id.user_id', + readonly=True + ) + applicant_name = fields.Many2one( + 'res.users', + string='Nama Pemohon', + related='pum_id.applicant_name', + readonly=True + ) + def action_toggle_check_attachment(self): ap_user_ids = [23, 9468] if self.env.user.id not in ap_user_ids: @@ -1298,6 +1334,87 @@ class AdvancePaymentCreateBill(models.TransientModel): apr.move_id = move.id # jika ada field untuk menampung move_id + return { + 'name': _('Journal Entry'), + 'view_mode': 'form', + 'res_model': 'account.move', + 'type': 'ir.actions.act_window', + 'res_id': move.id, + 'target': 'current', + } + +class CreateReimburseCabWizard(models.TransientModel): + _name = 'create.reimburse.cab.wizard' + _description = 'Wizard untuk Membuat Jurnal Reimburse' + + # Field untuk menampung ID request yang sedang diproses + request_id = fields.Many2one('advance.payment.request', string='Pengajuan', readonly=True) + + # Field untuk memilih salah satu dari dua bank Anda + account_id = fields.Many2one( + 'account.account', + string='Bank Intransit (Credit)', + required=True, + # Domain untuk membatasi pilihan hanya pada ID 573 dan 389 + domain="[('id', 'in', [573, 389])]" + ) + + # Field untuk menampilkan total agar pengguna bisa konfirmasi + total_reimburse = fields.Monetary( + string='Total Reimburse', + related='request_id.total_reimburse', + readonly=True + ) + currency_id = fields.Many2one(related='request_id.currency_id', readonly=True) + + def action_create_reimburse_cab(self): + """Metode ini yang akan membuat Journal Entry (CAB).""" + self.ensure_one() + request = self.request_id + + # --- Validasi --- + if request.move_id: + raise UserError("Jurnal sudah pernah dibuat untuk pengajuan ini.") + if not request.reimburse_line_ids: + raise UserError("Tidak ada rincian reimburse yang bisa dijurnalkan.") + + lines = [] + partner_id = request.user_id.partner_id.id + + # 1. Buat Jurnal DEBIT dari setiap baris reimburse + for line in request.reimburse_line_ids: + if not line.account_id: + raise UserError(f"Jenis Biaya pada baris '{line.description}' belum diisi oleh AP.") + + lines.append((0, 0, { + 'account_id': line.account_id.id, + 'partner_id': partner_id, + 'name': line.description, + 'debit': line.total, + 'credit': 0, + })) + + # 2. Buat satu Jurnal CREDIT ke bank yang dipilih di wizard + lines.append((0, 0, { + 'account_id': self.account_id.id, + 'partner_id': partner_id, + 'name': f'Reimburse {request.number}', + 'debit': 0, + 'credit': request.total_reimburse, + })) + + # 3. Buat Journal Entry + move = self.env['account.move'].create({ + 'ref': request.number, + 'date': fields.Date.context_today(self), + 'journal_id': 11, # PENTING: Ganti 11 dengan ID Journal "Miscellaneous" Anda + 'line_ids': lines, + }) + + # 4. Tautkan journal yang baru dibuat ke request + request.move_id = move.id + + # 5. Buka tampilan form journal yang baru dibuat return { 'name': _('Journal Entry'), 'view_mode': 'form', diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 893d3110..86313ea5 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -197,7 +197,7 @@ access_advance_payment_settlement_line,access.advance.payment.settlement.line,mo access_advance_payment_usage_line,access.advance.payment.usage.line,model_advance_payment_usage_line,,1,1,1,1 access_advance_payment_create_bill,access.advance.payment.create.bill,model_advance_payment_create_bill,,1,1,1,1 access_advance_payment_request_reject,access.advance.payment.request.reject,model_advance_payment_request_reject,,1,1,1,1 - +access_create_reimburse_cab_wizard_user,create.reimburse.cab.wizard user,model_create_reimburse_cab_wizard,,1,1,1,1 access_purchasing_job_seen,purchasing.job.seen,model_purchasing_job_seen,,1,1,1,1 access_tukar_guling_all_users,tukar.guling.all.users,model_tukar_guling,base.group_user,1,1,1,1 diff --git a/indoteknik_custom/views/advance_payment_request.xml b/indoteknik_custom/views/advance_payment_request.xml index 74ed296d..6b14e631 100644 --- a/indoteknik_custom/views/advance_payment_request.xml +++ b/indoteknik_custom/views/advance_payment_request.xml @@ -35,6 +35,11 @@ string="Make CAB" class="btn-info" attrs="{'invisible': ['|', ('status', 'not in', ['approved']), ('is_cab_visible', '=', True)]}"/> +