68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
# Copyright 2019 Akretion France (http://www.akretion.com)
|
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
|
# 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
|
|
|
|
def _create_payment_entry(self, amount):
|
|
move = super()._create_payment_entry(amount)
|
|
if hasattr(self, 'sale_id') and self.sale_id:
|
|
for line in move.line_ids:
|
|
if line.sale_id and line.account_id.internal_type == 'receivable':
|
|
line._sale_down_payment_hook()
|
|
return move
|
|
|
|
|
|
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 hasattr(self, 'sale_id') and 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
|