diff --git a/models/__pycache__/account_payment.cpython-312.pyc b/models/__pycache__/account_payment.cpython-312.pyc index 57fa516..aab8361 100644 Binary files a/models/__pycache__/account_payment.cpython-312.pyc and b/models/__pycache__/account_payment.cpython-312.pyc differ diff --git a/models/account_payment.py b/models/account_payment.py index 4a1dd21..0d59de0 100644 --- a/models/account_payment.py +++ b/models/account_payment.py @@ -16,6 +16,27 @@ class AccountPayment(models.Model): help='Identifies if this payment is an advance payment for a purchase order' ) + @api.model_create_multi + def create(self, vals_list): + """Override create to ensure payment_method_line_id is correctly set for advance payments""" + for vals in vals_list: + # If this is an advance payment and payment_method_line_id is set, + # ensure it matches the journal's payment methods + if vals.get('is_advance_payment') and vals.get('journal_id') and vals.get('payment_method_line_id'): + journal = self.env['account.journal'].browse(vals['journal_id']) + payment_method_line = self.env['account.payment.method.line'].browse(vals['payment_method_line_id']) + + # Verify the payment method line belongs to this journal + if payment_method_line not in journal.outbound_payment_method_line_ids: + # If not, find the correct one + correct_method = journal.outbound_payment_method_line_ids.filtered( + lambda l: l.payment_method_id == payment_method_line.payment_method_id + )[:1] + if correct_method: + vals['payment_method_line_id'] = correct_method.id + + return super().create(vals_list) + @api.onchange('purchase_order_id') def _onchange_purchase_order_id(self): if self.purchase_order_id: diff --git a/wizard/__pycache__/create_advance_payment_wizard.cpython-312.pyc b/wizard/__pycache__/create_advance_payment_wizard.cpython-312.pyc index 69da949..ffc1870 100644 Binary files a/wizard/__pycache__/create_advance_payment_wizard.cpython-312.pyc and b/wizard/__pycache__/create_advance_payment_wizard.cpython-312.pyc differ diff --git a/wizard/create_advance_payment_wizard.py b/wizard/create_advance_payment_wizard.py index 16865ef..4497430 100644 --- a/wizard/create_advance_payment_wizard.py +++ b/wizard/create_advance_payment_wizard.py @@ -27,6 +27,20 @@ class CreateAdvancePaymentWizard(models.TransientModel): domain=[('type', 'in', ['bank', 'cash'])] ) + payment_method_line_id = fields.Many2one( + 'account.payment.method.line', + string='Payment Method', + domain="[('id', 'in', available_payment_method_line_ids)]", + help='Manual: Pay by any method outside of Odoo.\n' + 'Check: Pay by check and print it from Odoo.\n' + 'Batch Deposit: Collect several checks at once.' + ) + + available_payment_method_line_ids = fields.Many2many( + 'account.payment.method.line', + compute='_compute_available_payment_method_line_ids' + ) + amount = fields.Monetary( string='Amount', required=True, @@ -67,6 +81,32 @@ class CreateAdvancePaymentWizard(models.TransientModel): res['memo'] = f'Advance payment for {po.name}' return res + @api.depends('journal_id') + def _compute_available_payment_method_line_ids(self): + """Compute available payment methods based on selected journal""" + for wizard in self: + if wizard.journal_id: + wizard.available_payment_method_line_ids = wizard.journal_id.outbound_payment_method_line_ids + else: + wizard.available_payment_method_line_ids = False + + @api.onchange('journal_id') + def _onchange_journal_id(self): + """Reset payment method when journal changes""" + if self.journal_id: + # Auto-select the first available payment method (usually 'manual') + available_methods = self.journal_id.outbound_payment_method_line_ids + if available_methods: + # Prefer 'manual' payment method + manual_method = available_methods.filtered( + lambda l: l.payment_method_id.code == 'manual' + )[:1] + self.payment_method_line_id = manual_method or available_methods[:1] + else: + self.payment_method_line_id = False + else: + self.payment_method_line_id = False + @api.depends('purchase_order_id') def _compute_expense_account(self): """Get expense account from default advance payment product""" @@ -118,15 +158,38 @@ class CreateAdvancePaymentWizard(models.TransientModel): f"Outstanding Payments Account" ) + # Use the selected payment method line or get the appropriate one + payment_method_line = self.payment_method_line_id + + if not payment_method_line: + # Fallback: try to get manual payment method + payment_method_line = self.journal_id.outbound_payment_method_line_ids.filtered( + lambda l: l.payment_method_id.code == 'manual' + )[:1] + + if not payment_method_line: + # Fallback to first available outbound payment method + payment_method_line = self.journal_id.outbound_payment_method_line_ids[:1] + + if not payment_method_line: + raise UserError( + f"No outbound payment method is configured for journal '{self.journal_id.name}'.\n" + f"Please configure a payment method in: Accounting > Configuration > Journals > " + f"{self.journal_id.name} > Outgoing Payments tab" + ) + # Create payment + # CRITICAL: Set payment_type and partner_type FIRST, then journal_id, then payment_method_line_id + # This ensures Odoo's onchange logic correctly filters and sets the payment method payment_vals = { 'payment_type': 'outbound', 'partner_type': 'supplier', 'partner_id': self.partner_id.id, + 'journal_id': self.journal_id.id, + 'payment_method_line_id': payment_method_line.id, 'amount': self.amount, 'currency_id': self.currency_id.id, 'date': self.date, - 'journal_id': self.journal_id.id, 'ref': self.memo or f'Advance payment for {self.purchase_order_id.name}', 'purchase_order_id': self.purchase_order_id.id, 'is_advance_payment': True, @@ -134,6 +197,11 @@ class CreateAdvancePaymentWizard(models.TransientModel): payment = self.env['account.payment'].create(payment_vals) + # Force recompute of payment method line to ensure it's correctly set + # This is necessary because Odoo might have changed it during create + if payment.payment_method_line_id != payment_method_line: + payment.write({'payment_method_line_id': payment_method_line.id}) + # Create deposit line in purchase order immediately self._create_deposit_line() diff --git a/wizard/create_advance_payment_wizard_views.xml b/wizard/create_advance_payment_wizard_views.xml index 0e6acbf..c73f8e3 100644 --- a/wizard/create_advance_payment_wizard_views.xml +++ b/wizard/create_advance_payment_wizard_views.xml @@ -12,6 +12,8 @@ + +