82 lines
4.2 KiB
Python
82 lines
4.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import models, api, fields, _
|
|
from odoo.exceptions import UserError
|
|
|
|
class AccountPayment(models.Model):
|
|
_inherit = 'account.payment'
|
|
|
|
def action_post(self):
|
|
# 1. Capture info before super() because we might need to create extra moves
|
|
centralized_payments = self.filtered(lambda p: p.journal_id.is_centralized and p.company_id != p.journal_id.parent_company_id)
|
|
|
|
# 2. Call super() to post the original payment(s)
|
|
# We need to make sure the original payment uses the RK account instead of Bank account if it's centralized
|
|
for payment in centralized_payments:
|
|
if not payment.journal_id.branch_intercompany_account_id:
|
|
raise UserError(_("Please configure the Branch Inter-company Account on journal %s", payment.journal_id.name))
|
|
|
|
# We override the journal's account temporarily for the liquidity line
|
|
res = super().action_post()
|
|
|
|
# 3. Handle Centralized entries in Parent
|
|
for payment in centralized_payments:
|
|
parent_company = payment.journal_id.parent_company_id
|
|
parent_journal = payment.journal_id.parent_journal_id
|
|
parent_rk_account = payment.journal_id.parent_intercompany_account_id
|
|
|
|
print(f">>> DEBUG: Centralized Payment for {payment.name}")
|
|
print(f" Company: {payment.company_id.id}, Parent Co: {parent_company.id}")
|
|
print(f" Parent Journal: {parent_journal.name} (ID: {parent_journal.id})")
|
|
print(f" Parent RK: {parent_rk_account.code} (ID: {parent_rk_account.id})")
|
|
|
|
if not parent_journal or not parent_rk_account:
|
|
raise UserError(_("Please configure the Parent Journal and RK Account on journal %s", payment.journal_id.name))
|
|
|
|
# Create the mirroring entry in Parent
|
|
# Debit: Parent RK (Receivable from Branch)
|
|
# Credit: Bank
|
|
parent_move = self.env['account.move'].with_company(parent_company).create({
|
|
'move_type': 'entry',
|
|
'date': payment.date,
|
|
'company_id': parent_company.id,
|
|
'journal_id': parent_journal.id,
|
|
'ref': f"Centralized Payment: {payment.name} ({payment.company_id.name})",
|
|
'line_ids': [
|
|
(0, 0, {
|
|
'name': payment.memo or f"Centralized Payment: {payment.name}",
|
|
'account_id': parent_rk_account.id,
|
|
'debit': payment.amount,
|
|
'partner_id': payment.partner_id.id,
|
|
'company_id': parent_company.id,
|
|
'display_type': False,
|
|
}),
|
|
(0, 0, {
|
|
'name': payment.memo or f"Centralized Payment: {payment.name}",
|
|
'account_id': parent_journal.default_account_id.id,
|
|
'credit': payment.amount,
|
|
'partner_id': payment.partner_id.id,
|
|
'company_id': parent_company.id,
|
|
'display_type': False,
|
|
}),
|
|
]
|
|
})
|
|
parent_move.action_post()
|
|
print(f" Parent Move Posted: {parent_move.name}")
|
|
|
|
return res
|
|
|
|
def _prepare_move_line_default_vals(self, write_off_line_vals=None, force_balance=None):
|
|
"""
|
|
Override to use the Branch RK account for the liquidity line
|
|
when the payment is centralized.
|
|
"""
|
|
res = super()._prepare_move_line_default_vals(write_off_line_vals, force_balance)
|
|
if self.journal_id.is_centralized and self.company_id != self.journal_id.parent_company_id:
|
|
# The first line is usually the liquidity line in outbound payments
|
|
# or the counterpart line. Odoo 17+ uses _seek_for_lines to identify them.
|
|
# But here we can just update the account if it matches the journal's default.
|
|
for line_vals in res:
|
|
if line_vals.get('account_id') == self.journal_id.default_account_id.id:
|
|
line_vals['account_id'] = self.journal_id.branch_intercompany_account_id.id
|
|
return res
|