77 lines
3.6 KiB
Python
77 lines
3.6 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from collections import defaultdict
|
||
|
from odoo import models, tools, _
|
||
|
from odoo.exceptions import UserError
|
||
|
|
||
|
|
||
|
class PosSession(models.Model):
|
||
|
_inherit = 'pos.session'
|
||
|
|
||
|
def _loader_params_pos_payment_method(self):
|
||
|
result = super()._loader_params_pos_payment_method()
|
||
|
result['search_params']['fields'].append('is_online_payment')
|
||
|
return result
|
||
|
|
||
|
def _accumulate_amounts(self, data):
|
||
|
data = super()._accumulate_amounts(data)
|
||
|
amounts = lambda: {'amount': 0.0, 'amount_converted': 0.0}
|
||
|
|
||
|
split_receivables_online = defaultdict(amounts)
|
||
|
currency_rounding = self.currency_id.rounding
|
||
|
for order in self._get_closed_orders():
|
||
|
for payment in order.payment_ids:
|
||
|
amount = payment.amount
|
||
|
if tools.float_is_zero(amount, precision_rounding=currency_rounding):
|
||
|
continue
|
||
|
date = payment.payment_date
|
||
|
payment_method = payment.payment_method_id
|
||
|
payment_type = payment_method.type
|
||
|
|
||
|
if payment_type == 'online':
|
||
|
split_receivables_online[payment] = self._update_amounts(split_receivables_online[payment], {'amount': amount}, date)
|
||
|
|
||
|
data.update({'split_receivables_online': split_receivables_online,})
|
||
|
return data
|
||
|
|
||
|
def _create_bank_payment_moves(self, data):
|
||
|
data = super()._create_bank_payment_moves(data)
|
||
|
|
||
|
split_receivables_online = data.get('split_receivables_online')
|
||
|
MoveLine = data.get('MoveLine')
|
||
|
|
||
|
online_payment_to_receivable_lines = {}
|
||
|
|
||
|
for payment, amounts in split_receivables_online.items():
|
||
|
split_receivable_line = MoveLine.create(self._get_split_receivable_op_vals(payment, amounts['amount'], amounts['amount_converted']))
|
||
|
account_payment = payment.online_account_payment_id
|
||
|
payment_receivable_line = account_payment.move_id.line_ids.filtered(lambda line: line.account_id == account_payment.destination_account_id)
|
||
|
online_payment_to_receivable_lines[payment] = split_receivable_line | payment_receivable_line
|
||
|
|
||
|
data['online_payment_to_receivable_lines'] = online_payment_to_receivable_lines
|
||
|
return data
|
||
|
|
||
|
def _get_split_receivable_op_vals(self, payment, amount, amount_converted):
|
||
|
partner = payment.online_account_payment_id.partner_id
|
||
|
accounting_partner = self.env["res.partner"]._find_accounting_partner(partner)
|
||
|
if not accounting_partner:
|
||
|
raise UserError(_("The partner of the POS online payment (id=%d) could not be found", payment.id))
|
||
|
partial_vals = {
|
||
|
'account_id': accounting_partner.property_account_receivable_id.id,
|
||
|
'move_id': self.move_id.id,
|
||
|
'partner_id': accounting_partner.id,
|
||
|
'name': '%s - %s (%s)' % (self.name, payment.payment_method_id.name, payment.online_account_payment_id.payment_method_line_id.payment_provider_id.name),
|
||
|
}
|
||
|
return self._debit_amounts(partial_vals, amount, amount_converted)
|
||
|
|
||
|
def _reconcile_account_move_lines(self, data):
|
||
|
data = super()._reconcile_account_move_lines(data)
|
||
|
online_payment_to_receivable_lines = data.get('online_payment_to_receivable_lines')
|
||
|
|
||
|
for payment, lines in online_payment_to_receivable_lines.items():
|
||
|
if payment.online_account_payment_id.partner_id.property_account_receivable_id.reconcile:
|
||
|
lines.filtered(lambda line: not line.reconciled).reconcile()
|
||
|
|
||
|
return data
|