diff --git a/sale_commission_partial_settlement/models/__init__.py b/sale_commission_partial_settlement/models/__init__.py index 4e17db438..61873e96a 100644 --- a/sale_commission_partial_settlement/models/__init__.py +++ b/sale_commission_partial_settlement/models/__init__.py @@ -1,4 +1,6 @@ -from . import sale_commission -from . import account_move +from . import account_invoice_line_agent +from . import account_invoice_line_agent_partial from . import account_partial_reconcile -from . import settlement +from . import sale_commission +from . import sale_commission_settlement +from . import sale_commission_settlement_line diff --git a/sale_commission_partial_settlement/models/account_move.py b/sale_commission_partial_settlement/models/account_invoice_line_agent.py similarity index 67% rename from sale_commission_partial_settlement/models/account_move.py rename to sale_commission_partial_settlement/models/account_invoice_line_agent.py index a402c5ed3..3ccb79869 100644 --- a/sale_commission_partial_settlement/models/account_move.py +++ b/sale_commission_partial_settlement/models/account_invoice_line_agent.py @@ -1,13 +1,20 @@ # Copyright 2023 Nextev # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class AccountInvoiceLineAgent(models.Model): _inherit = "account.invoice.line.agent" - partial_settled = fields.Monetary(string="Partial Commission Amount Settled") + partial_settled = fields.Monetary( + string="Partial Commission Amount Settled", + compute="_compute_partial_settled", + store=True, + ) + invoice_line_agent_partial_ids = fields.One2many( + "account.invoice.line.agent.partial", "invoice_line_agent_id" + ) def _compute_settled(self): filtered_lines = self.filtered( @@ -19,6 +26,14 @@ def _compute_settled(self): super(AccountInvoiceLineAgent, filtered_lines)._compute_settled() + @api.depends("invoice_line_agent_partial_ids.amount") + def _compute_partial_settled(self): + for rec in self: + # TODO: What if AILAP is linked to a canceled settlement? + rec.partial_settled = sum( + ilap.amount for ilap in rec.invoice_line_agent_partial_ids + ) + def _partial_commissions(self, date_payment_to): """ This method iterates through agent invoice lines and calculates @@ -30,7 +45,6 @@ def _partial_commissions(self, date_payment_to): """ partial_lines_to_settle = [] partial_payment_remaining = {} - lines_to_update = {} for line in self: line_total_amount = line.amount for ( @@ -55,12 +69,9 @@ def _partial_commissions(self, date_payment_to): "invoice_line_agent_id": line.id, "currency_id": line.currency_id.id, "amount": line_total_amount, + "account_partial_reconcile_id": partial.id, } ) - lines_to_update[line.id] = { - "partial_settled": line_total_amount, - "settled": True, - } partial_payment_remaining[partial.id] = { "remaining_amount": amount - line.object_id.price_total } @@ -75,39 +86,10 @@ def _partial_commissions(self, date_payment_to): "invoice_line_agent_id": line.id, "currency_id": line.currency_id.id, "amount": partial_commission, + "account_partial_reconcile_id": partial.id, } ) - if line.id in lines_to_update: - lines_to_update[line.id]["partial_settled"] += partial_commission - else: - lines_to_update[line.id] = {"partial_settled": partial_commission} - - if lines_to_update[line.id]["partial_settled"] >= line_total_amount: - lines_to_update[line.id].update({"settled": True}) - break - partial.partial_commission_settled = True partial_agent_lines = self.env["account.invoice.line.agent.partial"].create( partial_lines_to_settle ) - return partial_agent_lines, lines_to_update - - -class AccountInvoiceLineAgentPartial(models.Model): - _name = "account.invoice.line.agent.partial" - _description = "Partial agent commissions" - - invoice_line_agent_id = fields.Many2one("account.invoice.line.agent", required=True) - agent_line = fields.Many2many( - comodel_name="sale.commission.settlement.line", - relation="settlement_agent_line_partial_rel", - column1="agent_line_partial_id", - column2="settlement_id", - copy=False, - ) - amount = fields.Monetary( - string="Commission Amount", - ) - currency_id = fields.Many2one( - related="invoice_line_agent_id.currency_id", - ) - settled = fields.Boolean() + return partial_agent_lines diff --git a/sale_commission_partial_settlement/models/account_invoice_line_agent_partial.py b/sale_commission_partial_settlement/models/account_invoice_line_agent_partial.py new file mode 100644 index 000000000..181a7f8c9 --- /dev/null +++ b/sale_commission_partial_settlement/models/account_invoice_line_agent_partial.py @@ -0,0 +1,28 @@ +# Copyright 2023 Nextev +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountInvoiceLineAgentPartial(models.Model): + _name = "account.invoice.line.agent.partial" + _description = "Partial agent commissions" + + invoice_line_agent_id = fields.Many2one( + "account.invoice.line.agent", required=True, ondelete="cascade" + ) + # logically a One2one + agent_line = fields.Many2many( + comodel_name="sale.commission.settlement.line", + relation="settlement_agent_line_partial_rel", + column1="agent_line_partial_id", + column2="settlement_id", + copy=False, + ) + account_partial_reconcile_id = fields.Many2one("account.partial.reconcile") + amount = fields.Monetary( + string="Commission Amount", + ) + currency_id = fields.Many2one( + related="invoice_line_agent_id.currency_id", + ) diff --git a/sale_commission_partial_settlement/models/account_partial_reconcile.py b/sale_commission_partial_settlement/models/account_partial_reconcile.py index 7c1714d4d..175b1af6a 100644 --- a/sale_commission_partial_settlement/models/account_partial_reconcile.py +++ b/sale_commission_partial_settlement/models/account_partial_reconcile.py @@ -1,7 +1,20 @@ -from odoo import fields, models +from odoo import api, fields, models class AccountPartialReconcile(models.Model): _inherit = "account.partial.reconcile" - partial_commission_settled = fields.Boolean() + # Logically a One2one + account_invoice_line_agent_partial_ids = fields.One2many( + "account.invoice.line.agent.partial", "account_partial_reconcile_id" + ) + partial_commission_settled = fields.Boolean( + compute="_compute_partial_commission_settled", store=True + ) + + @api.depends("account_invoice_line_agent_partial_ids") + def _compute_partial_commission_settled(self): + for rec in self: + rec.partial_commission_settled = bool( + rec.account_invoice_line_agent_partial_ids + ) diff --git a/sale_commission_partial_settlement/models/sale_commission_settlement.py b/sale_commission_partial_settlement/models/sale_commission_settlement.py new file mode 100644 index 000000000..1aa58e699 --- /dev/null +++ b/sale_commission_partial_settlement/models/sale_commission_settlement.py @@ -0,0 +1,9 @@ +from odoo import models + + +class Settlement(models.Model): + _inherit = "sale.commission.settlement" + + def unlink(self): + self.mapped("line_ids.agent_line_partial_ids").unlink() + return super().unlink() diff --git a/sale_commission_partial_settlement/models/settlement.py b/sale_commission_partial_settlement/models/sale_commission_settlement_line.py similarity index 88% rename from sale_commission_partial_settlement/models/settlement.py rename to sale_commission_partial_settlement/models/sale_commission_settlement_line.py index f25ba11e0..a5ebda029 100644 --- a/sale_commission_partial_settlement/models/settlement.py +++ b/sale_commission_partial_settlement/models/sale_commission_settlement_line.py @@ -24,3 +24,7 @@ def _compute_settled_amount(self): rec.settled_amount = rec.agent_line_partial_ids[:1].amount else: rec.settled_amount = rec.agent_line[:1].amount + + def unlink(self): + self.mapped("agent_line_partial_ids").unlink() + return super().unlink() diff --git a/sale_commission_partial_settlement/wizard/wizard_settle.py b/sale_commission_partial_settlement/wizard/wizard_settle.py index 5c271e5e1..44e4ddf06 100644 --- a/sale_commission_partial_settlement/wizard/wizard_settle.py +++ b/sale_commission_partial_settlement/wizard/wizard_settle.py @@ -32,14 +32,17 @@ def action_settle_partial(self): for agent in agents: date_to_agent = self._get_period_start(agent, date_to) main_agent_line = self.get_partial_agent_lines(agent, date_to_agent) - ( - partial_agent_lines, - agent_lines_to_update, - ) = main_agent_line._partial_commissions(self.date_payment_to) - for line_id in agent_lines_to_update: - self.env["account.invoice.line.agent"].browse(line_id).update( - agent_lines_to_update[line_id] - ) + # ( + # partial_agent_lines, + # agent_lines_to_update, + # ) = main_agent_line._partial_commissions(self.date_payment_to) + partial_agent_lines = main_agent_line._partial_commissions( + self.date_payment_to + ) + # for line_id in agent_lines_to_update: + # self.env["account.invoice.line.agent"].browse(line_id).update( + # agent_lines_to_update[line_id] + # ) for company in partial_agent_lines.mapped( "invoice_line_agent_id.company_id" ): diff --git a/sale_commission_settlement_report/views/sale_commission_settlement_view.xml b/sale_commission_settlement_report/views/sale_commission_settlement_view.xml index 9558e1bd6..65f291e63 100644 --- a/sale_commission_settlement_report/views/sale_commission_settlement_view.xml +++ b/sale_commission_settlement_report/views/sale_commission_settlement_view.xml @@ -5,9 +5,9 @@ sale.commission.settlement - +