refactor: migrate centralized payment move generation from AccountPayment to AccountMove and update currency logic in payment register wizard

This commit is contained in:
Suherdy Yacob 2026-05-28 20:38:06 +07:00
parent df2cdd1952
commit 0b40046b75
4 changed files with 93 additions and 67 deletions

View File

@ -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

86
models/account_move.py Normal file
View File

@ -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

View File

@ -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

View File

@ -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',