# Copyright 2019 Akretion France (http://www.akretion.com) # @author Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import fields, models from odoo.tools import float_round class AccountPayment(models.Model): _inherit = "account.payment" sale_id = fields.Many2one("sale.order", string="Sale Order") def action_validate_invoice_payment(self): if self.sale_id: self.post() else: return super(AccountPayment, self).action_validate_invoice_payment() def _get_counterpart_move_line_vals(self, invoice=False): res = super(AccountPayment, self)._get_counterpart_move_line_vals( invoice=invoice ) if self.sale_id: res["sale_id"] = self.sale_id.id return res class AccountAbstractPayment(models.AbstractModel): _inherit = "account.abstract.payment" def default_get(self, fields_list): res = super(AccountAbstractPayment, self).default_get(fields_list) if self._context.get("active_model") == "sale.order" and self._context.get( "active_id" ): so = self.env["sale.order"].browse(self._context["active_id"]) res.update( { "amount": so.amount_total, "currency_id": so.currency_id.id, "payment_type": "inbound", "partner_id": so.partner_invoice_id.commercial_partner_id.id, "partner_type": "customer", "communication": so.name, "sale_id": so.id, } ) return res def _compute_payment_amount(self, invoices=None, currency=None): amount = super(AccountAbstractPayment, self)._compute_payment_amount( invoices=invoices, currency=currency ) if self.sale_id: payment_currency = currency if not payment_currency: payment_currency = self.sale_id.currency_id amount = float_round( self.sale_id.amount_total - self.sale_id.amount_down_payment, precision_rounding=payment_currency.rounding, ) return amount