Skip to content

Commit

Permalink
DO NOT MERGE: sale_commission_partial_settlement: major refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
aleuffre committed Dec 17, 2024
1 parent 62bea39 commit bd40ece
Show file tree
Hide file tree
Showing 13 changed files with 244 additions and 55 deletions.
2 changes: 2 additions & 0 deletions sale_commission_partial_settlement/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
"website": "https://github.com/OCA/commission",
"data": [
"security/ir.model.access.csv",
"views/account_invoice_line_agent_views.xml",
"views/account_invoice_line_agent_partial_views.xml",
"views/res_config_settings_view.xml",
"views/sale_commission_settlement_view.xml",
"views/sale_commission_view.xml",
Expand Down
1 change: 1 addition & 0 deletions sale_commission_partial_settlement/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
from . import sale_commission
from . import sale_commission_settlement
from . import sale_commission_settlement_line
from . import sale_commission_settlement_line_partial
Original file line number Diff line number Diff line change
@@ -1,36 +1,34 @@
# Copyright 2023 Nextev
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import api, fields, models
from odoo import _, api, fields, models
from odoo.tools.float_utils import float_compare


class AccountInvoiceLineAgent(models.Model):
_inherit = "account.invoice.line.agent"

payment_amount_type = fields.Selection(related="commission_id.payment_amount_type")
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"
"account.invoice.line.agent.partial",
"invoice_line_agent_id",
compute="_compute_invoice_line_agent_partial_ids",
store=True,
)

@api.depends(
"invoice_line_agent_partial_ids.amount",
"invoice_line_agent_partial_ids.agent_line.settlement_id.state",
"invoice_line_agent_partial_ids.settled_amount",
)
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 any(
settlement.state != "cancel"
for settlement in ailap.mapped("agent_line.settlement_id")
)
ailap.settled_amount for ailap in rec.invoice_line_agent_partial_ids
)

@api.depends(
Expand All @@ -50,6 +48,45 @@ def _compute_is_fully_settled(self):
== 0
)

@api.depends(
"commission_id.payment_amount_type",
"object_id.move_id.move_type",
"object_id.move_id.line_ids.amount_residual",
)
def _compute_invoice_line_agent_partial_ids(self):
"""
Create an account.invoice.line.agent.partial for each
payment term move line
"""
for rec in self:
ailap_model = rec.invoice_line_agent_partial_ids.browse()
if rec.commission_id.payment_amount_type != "paid":
rec.invoice_line_agent_partial_ids = False
continue
pay_term_lines = rec.object_id.move_id.line_ids.filtered(
lambda line: line.account_internal_type in ("receivable", "payable")
)
forecast_lines = rec.invoice_line_agent_partial_ids.mapped("move_line_id")
for move_line in pay_term_lines:
if move_line not in forecast_lines:
ailap_model.create(
{"move_line_id": move_line.id, "invoice_line_agent_id": rec.id}
)

def action_see_partial_commission_forecast(self):
view = self.env.ref(
"sale_commission_partial_settlement.view_sale_commission_mixin_agent_only"
)
return {
"name": _("Partial Commission Forecast"),
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": self._name,
"views": [(view.id, "form")],
"target": "new",
"res_id": self.id,
}

def _partial_commissions(self, date_payment_to):
"""
This method iterates through agent invoice lines and calculates
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,71 @@
# 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 AccountInvoiceLineAgentPartial(models.Model):
_name = "account.invoice.line.agent.partial"
_description = "Partial agent commissions"
_description = "Partial agent commissions. "
"Tracks the expected commissions."

move_line_id = fields.Many2one(
"account.move.line",
required=True, # TODO: migration? Probably cannot enforce
ondelete="cascade",
)
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,
settlement_line_partial_ids = fields.One2many(
"sale.commission.settlement.line.partial",
"invoice_agent_partial_id",
)
account_partial_reconcile_id = fields.Many2one("account.partial.reconcile")
account_partial_reconcile_id = fields.Many2one(
"account.partial.reconcile"
) # TODO: Remove
amount = fields.Monetary(
compute="_compute_amount",
store=True,
string="Commission Amount",
)
currency_id = fields.Many2one(
related="invoice_line_agent_id.currency_id",
)
settled_amount = fields.Monetary(
compute="_compute_settled_amount",
store=True,
)
is_settled = fields.Boolean(
compute="_compute_settled_amount", store=True, string="Fully settled"
)

move_line_balance = fields.Monetary(related="move_line_id.balance")
date_maturity = fields.Date(related="move_line_id.date_maturity")
agent_id = fields.Many2one(related="invoice_line_agent_id.agent_id")
invoice_date = fields.Date(related="invoice_line_agent_id.invoice_date")

@api.depends(
"settlement_line_partial_ids.amount",
"settlement_line_partial_ids.canceled",
)
def _compute_settled_amount(self):
for rec in self:
# TODO: handle different currencies
rec.settled_amount = sum(
x.amount for x in rec.settlement_line_partial_ids if not x.canceled
)
rec.is_settled = rec.currency_id.is_zero(rec.settled_amount - rec.amount)

@api.depends(
"move_line_id.balance",
"move_line_id.move_id.amount_total",
"invoice_line_agent_id.amount",
)
def _compute_amount(self):
for rec in self:
rec.amount = (
rec.move_line_id.balance
/ rec.move_line_id.move_id.amount_total
* rec.invoice_line_agent_id.amount
)
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
from odoo import api, fields, models
from odoo import fields, models


class AccountPartialReconcile(models.Model):
_inherit = "account.partial.reconcile"

# 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
)
) # TODO: Remove?
# partial_commission_settled = fields.Boolean(
# compute="_compute_partial_commission_settled", store=True
# )

@api.depends(
"account_invoice_line_agent_partial_ids",
"account_invoice_line_agent_partial_ids.agent_line.settlement_id.state",
)
def _compute_partial_commission_settled(self):
for rec in self:
rec.partial_commission_settled = any(
settlement.state != "cancel"
for settlement in rec.mapped(
"account_invoice_line_agent_partial_ids.agent_line.settlement_id"
)
)
# APR can't tell if every agent was settled!
# @api.depends(
# "account_invoice_line_agent_partial_ids",
# "account_invoice_line_agent_partial_ids.agent_line.settlement_id.state",
# )
# def _compute_partial_commission_settled(self):
# for rec in self:
# rec.partial_commission_settled = any(
# settlement.state != "cancel"
# for settlement in rec.mapped(
# "account_invoice_line_agent_partial_ids.agent_line.settlement_id"
# )
# )
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ class SaleCommissionSettlement(models.Model):
help="The payment date used to create the settlement",
)

def unlink(self):
self.mapped("line_ids.agent_line_partial_ids").unlink()
return super().unlink()
# def unlink(self):
# self.mapped("line_ids.agent_line_partial_ids").unlink()
# return super().unlink()
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@
class SettlementLine(models.Model):
_inherit = "sale.commission.settlement.line"

agent_line_partial_ids = fields.Many2many(
agent_line_partial_ids = fields.Many2many( # TODO: Remove?
comodel_name="account.invoice.line.agent.partial",
relation="settlement_agent_line_partial_rel",
column1="settlement_id",
column2="agent_line_partial_id",
)
settlement_line_partial_ids = fields.One2many(
"sale.commission.settlement.line.partial",
"settlement_line_id",
)
settled_amount = fields.Monetary(
compute="_compute_settled_amount",
related=False,
Expand All @@ -21,10 +25,19 @@ class SettlementLine(models.Model):
def _compute_settled_amount(self):
for rec in self:
if rec.commission_id.payment_amount_type == "paid":
rec.settled_amount = rec.agent_line_partial_ids[:1].amount
if rec.settlement_line_partial_ids:
rec.settled_amount = sum(
x.amount for x in rec.settlement_line_partial_ids
)
else: # TODO: Remove?
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()
# def unlink(self):
# """
# deprecated
# TODO: migrate?
# """
# self.mapped("agent_line_partial_ids").unlink()
# return super().unlink()
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from odoo import api, fields, models


class SettlementLinePartial(models.Model):
_name = "sale.commission.settlement.line.partial"
_description = "Partial settlements. "
"Tracks the effective settled amounts relative to the expected."

settlement_line_id = fields.Many2one(
comodel_name="sale.commission.settlement.line",
ondelete="cascade",
)
invoice_agent_partial_id = fields.Many2one(
comodel_name="account.invoice.line.agent.partial",
required=True,
)
agent_id = fields.Many2one(related="invoice_agent_partial_id.agent_id")
invoice_date = fields.Date(related="invoice_agent_partial_id.invoice_date")
amount = fields.Monetary(readonly=True)
currency_id = fields.Many2one(
related="settlement_line_id.currency_id",
)
# date_maturity = fields.Date() TODO: move to ooops module
canceled = fields.Boolean(compute="_compute_canceled", store=True)

@api.depends("settlement_line_id.settlement_id.state")
def _compute_canceled(self):
for rec in self:
rec.canceled = rec.settlement_line_id.settlement_id.state == "cancel"
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_invoice_line_agent_partial,access_account_invoice_line_agent_partial,model_account_invoice_line_agent_partial,sales_team.group_sale_salesman,1,1,1,1
access_account_invoice_line_agent_partial_user,access_account_invoice_line_agent_partial_user,model_account_invoice_line_agent_partial,base.group_user,1,0,0,0
access_sale_commission_settlement_line_partial,access_sale_commission_settlement_line_partial,model_sale_commission_settlement_line_partial,sales_team.group_sale_salesman,1,1,1,1
access_sale_commission_settlement_line_partial_user,access_sale_commission_settlement_line_partial_user,model_sale_commission_settlement_line_partial,base.group_user,1,0,0,0
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,13 @@ def _invoice_sale_order(self, sale_order, date=None):
def _settle_agent(self, agent=None, period=None, date=None, date_payment_to=None):
vals = {
"date_to": (
fields.Datetime.from_string(fields.Datetime.now())
+ relativedelta(months=period)
)
if period
else date,
(
fields.Datetime.from_string(fields.Datetime.now())
+ relativedelta(months=period)
)
if period
else date
),
"date_payment_to": date_payment_to,
}
if agent:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="invoice_line_agent_partial_tree" model="ir.ui.view">
<field name="model">account.invoice.line.agent.partial</field>
<field name="arch" type="xml">
<tree>
<field name="agent_id" />
<field name="amount" />
<field name="currency_id" invisible="1" />
<field name="date_maturity" />
<field name="settled_amount" />
<field name="is_settled" />
<!-- Button to see scslp -->
</tree>
</field>
</record>
</odoo>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="invoice_line_agent_tree" model="ir.ui.view">
<field name="model">account.invoice.line.agent</field>
<field name="inherit_id" ref="sale_commission.invoice_line_agent_tree" />
<field name="arch" type="xml">
<field name="amount" position="after">
<field name="payment_amount_type" invisible="1" />
<button
name="action_see_partial_commission_forecast"
icon="fa-list"
attrs="{'invisible': [
('payment_amount_type', '!=', 'paid'),
]
}"
type="object"
/>
</field>
</field>
</record>
<record id="view_sale_commission_mixin_agent_only" model="ir.ui.view">
<field name="model">account.invoice.line.agent</field>
<field name="arch" type="xml">
<form>
<field name="invoice_line_agent_partial_ids" readonly="1" />
<footer>
<button string="Close" class="oe_highlight" special="cancel" />
</footer>
</form>
</field>
</record>
</odoo>
Loading

0 comments on commit bd40ece

Please sign in to comment.