diff --git a/models/__init__.py b/models/__init__.py index 85099a1..0661266 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -5,4 +5,5 @@ from . import ir_http from . import pos_payment_method from . import pos_session from . import pos_order +from . import account_move diff --git a/models/account_move.py b/models/account_move.py new file mode 100644 index 0000000..e6c1759 --- /dev/null +++ b/models/account_move.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +from odoo import models, api, fields, _ +from odoo.exceptions import UserError + +class AccountMove(models.Model): + _inherit = 'account.move' + + def action_post(self): + res = super().action_post() + + # 1. Handle Centralized entries in Parent when payment moves are posted + for move in self: + payments = move.payment_ids or move.origin_payment_id + if not payments: + continue + + centralized_payments = payments.filtered( + lambda p: p.journal_id.sudo().is_centralized and + p.company_id != p.journal_id.sudo().parent_company_id + ) + + 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 journal_sudo.branch_intercompany_account_id: + raise UserError(_("Please configure the Branch Inter-company Account on journal %s", payment.journal_id.name)) + 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})") + + # Calculate currency-adjusted amount for the parent company + parent_currency = parent_company.currency_id + if payment.currency_id != parent_currency: + amount_parent_curr = payment.currency_id._convert( + payment.amount, parent_currency, parent_company, payment.date + ) + else: + amount_parent_curr = payment.amount + + # 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, + 'currency_id': parent_currency.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': amount_parent_curr, + 'credit': 0.0, + 'partner_id': payment.partner_id.id, + 'company_id': parent_company.id, + 'currency_id': payment.currency_id.id, + 'amount_currency': payment.amount, + 'display_type': 'product', + }), + (0, 0, { + 'name': payment.memo or f"Centralized Payment: {payment.name}", + 'account_id': parent_journal_sudo.default_account_id.id, + 'debit': 0.0, + 'credit': amount_parent_curr, + 'partner_id': payment.partner_id.id, + 'company_id': parent_company.id, + 'currency_id': payment.currency_id.id, + 'amount_currency': -payment.amount, + 'display_type': 'product', + }), + ] + }) + parent_move.sudo().action_post() + print(f" Parent Move Posted: {parent_move.name}") + + return res diff --git a/models/account_payment.py b/models/account_payment.py index a129dc8..510b7e4 100644 --- a/models/account_payment.py +++ b/models/account_payment.py @@ -5,68 +5,6 @@ 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 diff --git a/wizard/account_payment_register.py b/wizard/account_payment_register.py index 060f599..70bcf9b 100644 --- a/wizard/account_payment_register.py +++ b/wizard/account_payment_register.py @@ -41,14 +41,15 @@ class AccountPaymentRegister(models.TransientModel): # Credit: Inter-company (RK) Account (Liability to Parent) # Currency logic: Odoo 19 requires debit/credit in company currency - # and amount_currency in foreign currency. + # and amount_currency in foreign/company currency. amount_company_curr = abs(sum(lines.mapped('amount_residual'))) - amount_currency = 0.0 - currency_id = False + # Fallback to the company currency if no foreign currency is used + currency_id = self.currency_id.id or branch_company.currency_id.id if self.currency_id != branch_company.currency_id: - amount_currency = sum(lines.mapped('amount_residual_currency')) - currency_id = self.currency_id.id + amount_currency = abs(sum(lines.mapped('amount_residual_currency'))) + else: + amount_currency = amount_company_curr clearing_move_vals = { 'move_type': 'entry',