from odoo import models, fields, api, _ from odoo.exceptions import UserError class HrExpensePaymentWizard(models.TransientModel): _name = 'hr.expense.payment.wizard' _description = 'Expense Payment Wizard' expense_sheet_id = fields.Many2one('hr.expense.sheet', required=True) amount = fields.Monetary(string='Payment Amount', required=True, readonly=True) currency_id = fields.Many2one('res.currency', related='expense_sheet_id.currency_id') company_id = fields.Many2one('res.company', related='expense_sheet_id.company_id') partner_id = fields.Many2one( 'res.partner', string='Vendor', required=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ) journal_id = fields.Many2one( 'account.journal', string='Payment Journal', required=True, domain="[('type', 'in', ('bank', 'cash')), ('company_id', '=', company_id)]" ) payment_method_line_id = fields.Many2one( 'account.payment.method.line', string='Payment Method', required=True, domain="[('journal_id', '=', journal_id), ('payment_type', '=', 'outbound')]" ) payment_date = fields.Date(string='Payment Date', default=fields.Date.context_today, required=True) @api.onchange('journal_id') def _onchange_journal_id(self): if self.journal_id: available_payment_methods = self.journal_id.outbound_payment_method_line_ids if available_payment_methods: self.payment_method_line_id = available_payment_methods[0].id else: self.payment_method_line_id = False def action_create_payment(self): self.ensure_one() # Find 118101 account uang_muka_account = self.env['account.account'].search([ ('code', '=', '118101'), ('company_id', '=', self.company_id.id) ], limit=1) if not uang_muka_account: raise UserError(_("Account 118101 Uang Muka Operasional not found for this company!")) payment_vals = { 'date': self.payment_date, 'amount': self.amount, 'payment_type': 'outbound', 'partner_type': 'supplier', 'partner_id': self.partner_id.id, 'journal_id': self.journal_id.id, 'currency_id': self.currency_id.id, 'payment_method_line_id': self.payment_method_line_id.id, 'ref': self.expense_sheet_id.name, 'destination_account_id': uang_muka_account.id, } payment = self.env['account.payment'].create(payment_vals) payment.action_post() # Link the payment's move to the expense sheet payment.move_id.write({'expense_sheet_id': self.expense_sheet_id.id}) # Update sheet status to Paid self.expense_sheet_id.write({ 'state': 'done', 'amount_residual': 0.0, 'payment_state': 'paid' }) # Our custom logic will push it to 'wait_post' if realization is pending self.expense_sheet_id.action_recompute_state() return {'type': 'ir.actions.act_window_close'}