From 287d25f529feafa23919ab385498b698a941cf4b Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Thu, 12 Mar 2026 15:06:30 +0700 Subject: [PATCH] feat: Implement intercompany settlement logic for batch payments, adding dedicated company accounts and a new settlement wizard. --- __init__.py | 6 +- __manifest__.py | 2 + __pycache__/__init__.cpython-312.pyc | Bin 214 -> 0 bytes models/__init__.py | 2 +- models/__pycache__/__init__.cpython-312.pyc | Bin 368 -> 0 bytes .../account_batch_payment.cpython-312.pyc | Bin 9805 -> 0 bytes models/account_batch_payment.py | 148 ++++++++++++++---- models/res_company.py | 21 +++ security/ir.model.access.csv | 3 +- views/account_batch_payment_views.xml | 5 + views/res_company_views.xml | 20 +++ wizard/__init__.py | 2 + wizard/intercompany_settlement_wizard.py | 125 +++++++++++++++ .../intercompany_settlement_wizard_views.xml | 54 +++++++ 14 files changed, 357 insertions(+), 31 deletions(-) delete mode 100644 __pycache__/__init__.cpython-312.pyc delete mode 100644 models/__pycache__/__init__.cpython-312.pyc delete mode 100644 models/__pycache__/account_batch_payment.cpython-312.pyc create mode 100644 models/res_company.py create mode 100644 views/res_company_views.xml create mode 100644 wizard/__init__.py create mode 100644 wizard/intercompany_settlement_wizard.py create mode 100644 wizard/intercompany_settlement_wizard_views.xml diff --git a/__init__.py b/__init__.py index f5ba686..d1c9c61 100644 --- a/__init__.py +++ b/__init__.py @@ -1,2 +1,4 @@ -# -*- coding: utf-8 -*- -from . import models \ No newline at end of file +from . import models +from . import wizard +from . import data +from . import doc diff --git a/__manifest__.py b/__manifest__.py index b0fec18..be56a4b 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -17,9 +17,11 @@ account payable. 'data': [ 'security/ir.model.access.csv', 'data/account_payment_method_data.xml', + 'views/res_company_views.xml', 'views/account_batch_payment_views.xml', 'views/account_payment_views.xml', 'views/account_payment_register_views.xml', + 'wizard/intercompany_settlement_wizard_views.xml', ], 'installable': True, 'application': False, diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b3c161b0b539ac34eb67c04ef290b595df44184b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmX@j%ge<81QL_hW$FOw#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%r6;%!kUb? z*mCnzQge#^G?{KO6fpzERx*4B>HHO}pOK%Ns$X21ky?~esUJ{Tl98X63{V!Z diff --git a/models/__init__.py b/models/__init__.py index 7ae7e6d..48ae44d 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- from . import account_batch_payment from . import account_payment from . import account_payment_register from . import account_payment_debug +from . import res_company diff --git a/models/__pycache__/__init__.cpython-312.pyc b/models/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c2b51c6c85c4a58dbb4510027c75e80e571b9ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmZ9HJ4*yH5XUF`IDBx3g;9H|>Bas_v%=sm+gY!mJ zQX1{}J!)y}-&KV|+aOoe(>pFir#mmi*=$(tT$34kys`T!9 diff --git a/models/__pycache__/account_batch_payment.cpython-312.pyc b/models/__pycache__/account_batch_payment.cpython-312.pyc deleted file mode 100644 index 4963f81995ae2366ea49b71f2d1c6eed67b40af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9805 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 vRNl03tWe%L>wM}sW1-K}3&Go47q>p8w93 Debit Intercompany Receivable. + expense_account = ho_company.intercompany_receivable_account_id if payment_type == 'outbound' else ho_company.intercompany_payable_account_id + + # Create the HO Payment + payment_vals = { + 'payment_type': payment_type, + 'partner_type': partner_type, + 'partner_id': line.partner_id.id, + 'amount': line.amount, + 'currency_id': line.currency_id.id, + 'date': line.date, + 'journal_id': self.journal_id.id, + 'company_id': ho_company.id, + 'payment_method_line_id': payment_method_line.id, + 'ref': f"{line.memo or ''} (For {branch_company.name})", + 'expense_account_id': expense_account.id, + } + + payment = self.env['account.payment'].create(payment_vals) + payment.action_post() + + # Branch Move + # Branch records the actual expense, and owes money to HO -> Credit Intercompany Payable. + branch_journal = self.env['account.journal'].sudo().search([ + ('type', '=', 'general'), + ('company_id', '=', branch_company.id) + ], limit=1) + + if not branch_journal: + raise ValidationError(_("Please create a Miscellaneous journal in company %s.", branch_company.name)) + + line_amount = line.amount if payment_type == 'outbound' else -line.amount + + intercompany_account = branch_company.intercompany_payable_account_id if payment_type == 'outbound' else branch_company.intercompany_receivable_account_id + + move_lines = [ + (0, 0, { + 'name': line.memo or 'Intercompany Payment', + 'account_id': line.expense_account_id.id, + 'debit': line_amount if line_amount > 0 else 0.0, + 'credit': -line_amount if line_amount < 0 else 0.0, + 'partner_id': line.partner_id.id, + 'currency_id': line.currency_id.id, + }), + (0, 0, { + 'name': f"Intercompany Pay/Rec - {ho_company.name}", + 'account_id': intercompany_account.id, + 'debit': -line_amount if line_amount < 0 else 0.0, + 'credit': line_amount if line_amount > 0 else 0.0, + 'partner_id': ho_company.partner_id.id, # Owe HO + 'currency_id': line.currency_id.id, + }) + ] + + move_vals = { + 'journal_id': branch_journal.id, + 'date': line.date, + 'ref': f"Intercompany {ho_company.name} - {self.name}", + 'company_id': branch_company.id, + 'line_ids': move_lines, + } + + branch_move = self.env['account.move'].sudo().with_company(branch_company).create(move_vals) + branch_move.action_post() + + # Link both + line.payment_id = payment.id + line.branch_move_id = branch_move.id + payment_ids.append(payment.id) + + else: + # Standard Logic / Non-Intercompany + payment_vals = { + 'payment_type': payment_type, + 'partner_type': partner_type, + 'partner_id': line.partner_id.id, + 'amount': line.amount, + 'currency_id': line.currency_id.id, + 'date': line.date, + 'journal_id': self.journal_id.id, + 'company_id': line.company_id.id, + 'payment_method_line_id': payment_method_line.id, + 'ref': line.memo, + 'expense_account_id': line.expense_account_id.id, + } + + # Create the payment with the branch's company context, bypassing security limits momentarily + payment = self.env['account.payment'].sudo().with_context( + allowed_company_ids=[line.company_id.id, self.company_id.id, self.env.company.id], + default_company_id=line.company_id.id, + ).create(payment_vals) + + # Since some compute methods might try to overwrite company_id based on journal, force it again + payment.write({'company_id': line.company_id.id}) + + payment.action_post() + + # Link the payment to the line + line.payment_id = payment.id + payment_ids.append(payment.id) + # Add the generated payments to the batch if payment_ids: @@ -202,6 +291,11 @@ class AccountBatchPaymentLine(models.Model): string='Generated Payment', readonly=True ) + branch_move_id = fields.Many2one( + 'account.move', + string='Branch Intercompany Entry', + readonly=True + ) @api.onchange('partner_id') def _onchange_partner_id(self): diff --git a/models/res_company.py b/models/res_company.py new file mode 100644 index 0000000..6a676b1 --- /dev/null +++ b/models/res_company.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + intercompany_receivable_account_id = fields.Many2one( + 'account.account', + string="Intercompany Receivable Account", + check_company=True, + domain="[('company_id', '=', id)]", + help="Account used for recording intercompany receivables from branches." + ) + intercompany_payable_account_id = fields.Many2one( + 'account.account', + string="Intercompany Payable Account", + check_company=True, + domain="[('company_id', '=', id)]", + help="Account used for recording intercompany payables to the head office." + ) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 583848e..536465b 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_account_batch_payment_line,account.batch.payment.line,model_account_batch_payment_line,,1,1,1,1 \ No newline at end of file +access_account_batch_payment_line,account.batch.payment.line,model_account_batch_payment_line,,1,1,1,1 +access_intercompany_settlement_wizard,intercompany.settlement.wizard,model_intercompany_settlement_wizard,account.group_account_user,1,1,1,1 \ No newline at end of file diff --git a/views/account_batch_payment_views.xml b/views/account_batch_payment_views.xml index 6d7ee3b..c347696 100644 --- a/views/account_batch_payment_views.xml +++ b/views/account_batch_payment_views.xml @@ -9,13 +9,18 @@ +<<<<<<< HEAD +======= + +>>>>>>> 2b945da (feat: Implement intercompany settlement logic for batch payments, adding dedicated company accounts and a new settlement wizard.) + diff --git a/views/res_company_views.xml b/views/res_company_views.xml new file mode 100644 index 0000000..1ee93e4 --- /dev/null +++ b/views/res_company_views.xml @@ -0,0 +1,20 @@ + + + + res.company.form.inherit.vendor.batch.payment.merge + res.company + + + + + + + + + + + + + + + diff --git a/wizard/__init__.py b/wizard/__init__.py new file mode 100644 index 0000000..b4bf599 --- /dev/null +++ b/wizard/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import intercompany_settlement_wizard diff --git a/wizard/intercompany_settlement_wizard.py b/wizard/intercompany_settlement_wizard.py new file mode 100644 index 0000000..efc00ec --- /dev/null +++ b/wizard/intercompany_settlement_wizard.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class IntercompanySettlementWizard(models.TransientModel): + _name = 'intercompany.settlement.wizard' + _description = 'Intercompany Settlement Wizard' + + ho_company_id = fields.Many2one( + 'res.company', + string='Head Office', + required=True, + default=lambda self: self.env.company + ) + branch_company_id = fields.Many2one( + 'res.company', + string='Branch Company', + required=True, + domain="[('id', '!=', ho_company_id)]" + ) + amount = fields.Monetary( + string='Settlement Amount', + required=True + ) + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + related='ho_company_id.currency_id' + ) + date = fields.Date( + string='Settlement Date', + required=True, + default=fields.Date.context_today + ) + ho_journal_id = fields.Many2one( + 'account.journal', + string='HO Bank/Cash Journal', + required=True, + domain="[('type', 'in', ('bank', 'cash')), ('company_id', '=', ho_company_id)]" + ) + branch_journal_id = fields.Many2one( + 'account.journal', + string='Branch Bank/Cash Journal', + required=True, + domain="[('type', 'in', ('bank', 'cash')), ('company_id', '=', branch_company_id)]" + ) + memo = fields.Char(string='Memo', default='Intercompany Settlement') + + def action_confirm_settlement(self): + self.ensure_one() + + if self.amount <= 0: + raise ValidationError(_("Settlement amount must be greater than zero.")) + + if not self.ho_company_id.intercompany_receivable_account_id: + raise ValidationError(_("Please set an Intercompany Receivable Account on company %s.", self.ho_company_id.name)) + + if not self.branch_company_id.intercompany_payable_account_id: + raise ValidationError(_("Please set an Intercompany Payable Account on company %s.", self.branch_company_id.name)) + + # 1. Branch Pays HO (Outbound Payment in Branch) + # Dr Intercompany Payable, Cr Bank + branch_payment_method = self.branch_journal_id._get_available_payment_method_lines('outbound').filtered(lambda x: x.code == 'manual')[:1] + + if not branch_payment_method: + branch_payment_method = self.branch_journal_id._get_available_payment_method_lines('outbound')[:1] + + if not branch_payment_method: + raise ValidationError(_("No payment method found for the branch journal.")) + + branch_payment_vals = { + 'payment_type': 'outbound', + 'partner_type': 'supplier', + 'partner_id': self.ho_company_id.partner_id.id, + 'amount': self.amount, + 'currency_id': self.currency_id.id, + 'date': self.date, + 'journal_id': self.branch_journal_id.id, + 'company_id': self.branch_company_id.id, + 'payment_method_line_id': branch_payment_method.id, + 'ref': self.memo, + 'expense_account_id': self.branch_company_id.intercompany_payable_account_id.id, + } + + branch_payment = self.env['account.payment'].sudo().with_company(self.branch_company_id).create(branch_payment_vals) + branch_payment.action_post() + + # 2. HO Receives Payment (Inbound Payment in HO) + # Dr Bank, Cr Intercompany Receivable + ho_payment_method = self.ho_journal_id._get_available_payment_method_lines('inbound').filtered(lambda x: x.code == 'manual')[:1] + + if not ho_payment_method: + ho_payment_method = self.ho_journal_id._get_available_payment_method_lines('inbound')[:1] + + if not ho_payment_method: + raise ValidationError(_("No payment method found for the HO journal.")) + + ho_payment_vals = { + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'partner_id': self.branch_company_id.partner_id.id, + 'amount': self.amount, + 'currency_id': self.currency_id.id, + 'date': self.date, + 'journal_id': self.ho_journal_id.id, + 'company_id': self.ho_company_id.id, + 'payment_method_line_id': ho_payment_method.id, + 'ref': self.memo, + 'expense_account_id': self.ho_company_id.intercompany_receivable_account_id.id, + } + + ho_payment = self.env['account.payment'].create(ho_payment_vals) + ho_payment.action_post() + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': _('Settlement Successful'), + 'message': _('Successfully settled %s from %s to %s.', + self.amount, self.branch_company_id.name, self.ho_company_id.name), + 'sticky': False, + } + } diff --git a/wizard/intercompany_settlement_wizard_views.xml b/wizard/intercompany_settlement_wizard_views.xml new file mode 100644 index 0000000..d812dae --- /dev/null +++ b/wizard/intercompany_settlement_wizard_views.xml @@ -0,0 +1,54 @@ + + + + intercompany.settlement.wizard.form + intercompany.settlement.wizard + +
+ + + + + + + + + + + + + + + + +
+
+
+
+
+ + + Intercompany Settlement + intercompany.settlement.wizard + form + new + +

+ Record an intercompany settlement payment +

+

+ This will automatically generate both the inbound payment in the Head Office + and the outbound payment in the Branch company. +

+
+
+ + +