from odoo import api, fields, models class ContractContract(models.Model): _inherit = 'contract.contract' payment_mode_id = fields.Many2one( comodel_name='account.payment.mode', string='Payment Mode', domain=[('payment_type', '=', 'inbound')], index=True, ) @api.onchange('partner_id') def on_change_partner_id(self): self.payment_mode_id = self.partner_id.customer_payment_mode_id.id @api.multi def _prepare_invoice(self, date_invoice, journal=None): invoice_vals = super(ContractContract, self)._prepare_invoice( date_invoice=date_invoice, journal=journal) if self.payment_mode_id: invoice_vals['payment_mode_id'] = self.payment_mode_id.id invoice = self.env['account.invoice'].new(invoice_vals) invoice._onchange_payment_mode_id() invoice_vals = invoice._convert_to_write(invoice._cache) return invoice_vals @api.model def _finalize_invoice_creation(self, invoices): """ This override preserves the payment mode when calling the partner's onchange. """ payment_modes_by_invoice = {} for invoice in invoices: payment_modes_by_invoice[invoice] = invoice.payment_mode_id res = super(ContractContract, self)._finalize_invoice_creation( invoices) for invoice in invoices: invoice.payment_mode_id = payment_modes_by_invoice.get(invoice) return res