-
-
Notifications
You must be signed in to change notification settings - Fork 346
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MIG] sale_commission_partial_settlement: Migration to 16.0
- Loading branch information
Showing
21 changed files
with
431 additions
and
417 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
11 changes: 0 additions & 11 deletions
11
sale_commission_partial_settlement/migrations/14.0.1.0.1/post-migrate.py
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,6 @@ | ||
from . import sale_commission | ||
from . import account_move | ||
from . import commission | ||
from . import account_invoice_line_agent | ||
from . import account_invoice_line_agent_partial | ||
from . import account_partial_reconcile | ||
from . import settlement | ||
from . import commission_settlement | ||
from . import commission_settlement_line |
109 changes: 109 additions & 0 deletions
109
sale_commission_partial_settlement/models/account_invoice_line_agent.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
# Copyright 2023 Nextev | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from odoo import api, fields, models | ||
from odoo.tools.float_utils import float_compare | ||
|
||
|
||
class AccountInvoiceLineAgent(models.Model): | ||
_inherit = "account.invoice.line.agent" | ||
|
||
partial_settled = fields.Monetary( | ||
string="Partial Commission Amount Settled", | ||
compute="_compute_partial_settled", | ||
store=True, | ||
) | ||
is_fully_settled = fields.Boolean(compute="_compute_is_fully_settled", store=True) | ||
invoice_line_agent_partial_ids = fields.One2many( | ||
"account.invoice.line.agent.partial", "invoice_line_agent_id" | ||
) | ||
|
||
@api.depends( | ||
"invoice_line_agent_partial_ids.amount", | ||
"invoice_line_agent_partial_ids.agent_line.settlement_id.state", | ||
) | ||
def _compute_partial_settled(self): | ||
for rec in self: | ||
rec.partial_settled = sum( | ||
ailap.amount | ||
for ailap in rec.invoice_line_agent_partial_ids | ||
if ailap.mapped("agent_line.settlement_id")[:1].state != "cancel" | ||
) | ||
|
||
@api.depends( | ||
"commission_id.payment_amount_type", "amount", "settled", "partial_settled" | ||
) | ||
def _compute_is_fully_settled(self): | ||
for rec in self: | ||
if rec.commission_id.payment_amount_type != "paid": | ||
rec.is_fully_settled = rec.settled | ||
else: | ||
rec.is_fully_settled = rec.settled and ( | ||
float_compare( | ||
rec.partial_settled, | ||
rec.amount, | ||
precision_rounding=rec.currency_id.rounding, | ||
) | ||
== 0 | ||
) | ||
|
||
def _partial_commissions(self, date_payment_to): | ||
""" | ||
This method iterates through agent invoice lines and calculates | ||
partial commissions based on the payment amount. | ||
If the partial payment amount is greater than the invoice line | ||
amount, it fully settles the corresponding agent line. | ||
Otherwise, it calculates the partial commission proportionally to | ||
the amount paid, invoice amount and total commissions. | ||
""" | ||
partial_lines_to_settle = [] | ||
partial_payment_remaining = {} | ||
for line in self: | ||
line_total_amount = line.amount | ||
reconciled_partials, _ = line.invoice_id._get_reconciled_invoices_partials() | ||
for ( | ||
partial, | ||
amount, | ||
counterpart_line, | ||
) in reconciled_partials: | ||
if partial.partial_commission_settled: | ||
continue | ||
elif date_payment_to and date_payment_to < counterpart_line.date: | ||
break | ||
if partial.id in partial_payment_remaining: | ||
payment_amount = partial_payment_remaining[partial.id][ | ||
"remaining_amount" | ||
] | ||
else: | ||
payment_amount = amount | ||
partial_payment_remaining[partial.id] = {"remaining_amount": amount} | ||
if line.object_id.price_total <= payment_amount: | ||
partial_lines_to_settle.append( | ||
self._partial_agent_line_values( | ||
line, line_total_amount, partial | ||
) | ||
) | ||
partial_payment_remaining[partial.id] = { | ||
"remaining_amount": amount - line.object_id.price_total | ||
} | ||
break | ||
|
||
paid_in_proportion = payment_amount / line.invoice_id.amount_total | ||
partial_commission = ( | ||
line.invoice_id.commission_total * paid_in_proportion | ||
) | ||
partial_lines_to_settle.append( | ||
self._partial_agent_line_values(line, partial_commission, partial) | ||
) | ||
partial_agent_lines = self.env["account.invoice.line.agent.partial"].create( | ||
partial_lines_to_settle | ||
) | ||
return partial_agent_lines | ||
|
||
def _partial_agent_line_values(self, line, amount, partial): | ||
return { | ||
"invoice_line_agent_id": line.id, | ||
"currency_id": line.currency_id.id, | ||
"amount": amount, | ||
"account_partial_reconcile_id": partial.id, | ||
} |
23 changes: 23 additions & 0 deletions
23
sale_commission_partial_settlement/models/account_invoice_line_agent_partial.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
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) | ||
agent_line = fields.Many2many( | ||
comodel_name="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", | ||
) | ||
settled = fields.Boolean() |
Oops, something went wrong.