# -*- 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.sudo().is_centralized and p.company_id != p.journal_id.sudo().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.sudo().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: journal_sudo = payment.journal_id.sudo() parent_company = journal_sudo.parent_company_id parent_journal = journal_sudo.parent_journal_id parent_rk_account = journal_sudo.parent_intercompany_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)) parent_journal_sudo = parent_journal.sudo() parent_rk_account_sudo = parent_rk_account.sudo() 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_sudo.name} (ID: {parent_journal_sudo.id})") print(f" Parent RK: {parent_rk_account_sudo.code} (ID: {parent_rk_account_sudo.id})") # Create the mirroring entry in Parent using sudo parent_move = self.env['account.move'].sudo().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_sudo.default_account_id.id, 'credit': payment.amount, 'partner_id': payment.partner_id.id, 'company_id': parent_company.id, 'display_type': False, }), ] }) parent_move.sudo().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) journal_sudo = self.journal_id.sudo() if journal_sudo.is_centralized and self.company_id != journal_sudo.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') == journal_sudo.default_account_id.id: line_vals['account_id'] = journal_sudo.branch_intercompany_account_id.id return res