1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/partner_commission/models/sale_order.py
2024-12-10 09:04:09 +07:00

80 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import api, fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
referrer_id = fields.Many2one('res.partner', 'Referrer', domain=[('grade_id', '!=', False)], tracking=True)
commission_plan_frozen = fields.Boolean(
'Freeze Plan', tracking=True,
help="Whether the commission plan is frozen. When checked, the commission plan won't automatically be updated according to the partner level.")
commission_plan_id = fields.Many2one(
'commission.plan',
'Commission Plan',
compute='_compute_commission_plan',
inverse='_set_commission_plan',
store=True,
tracking=True,
help="Takes precedence over the Referrer's commission plan.")
commission = fields.Monetary(string='Referrer Commission', compute='_compute_commission')
@api.depends('referrer_id', 'commission_plan_id', 'sale_order_template_id', 'pricelist_id', 'order_line.price_subtotal')
def _compute_commission(self):
self.commission = 0
for so in self:
if not so.referrer_id or not so.commission_plan_id:
so.commission = 0
else:
comm_by_rule = defaultdict(float)
template = so.sale_order_template_id
template_id = template.id if template else None
for line in so.order_line:
rule = so.commission_plan_id._match_rules(line.product_id, template_id, so.pricelist_id.id)
if rule:
commission = so.currency_id.round(line.price_subtotal * rule.rate / 100.0)
comm_by_rule[rule] += commission
# cap by rule
for r, amount in comm_by_rule.items():
if r.is_capped:
amount = min(amount, r.max_commission)
comm_by_rule[r] = amount
so.commission = sum(comm_by_rule.values())
@api.depends('commission_plan_frozen', 'partner_id', 'referrer_id', 'referrer_id.commission_plan_id')
def _compute_commission_plan(self):
for so in self:
if not so.is_subscription and so.state in ['draft', 'sent']:
so.commission_plan_id = so.referrer_id.commission_plan_id
elif so.is_subscription and not so.commission_plan_frozen:
so.commission_plan_id = so.referrer_id.commission_plan_id
def _set_commission_plan(self):
updated_plan_sale_order = self.filtered(lambda order: not order.commission_plan_frozen and order.referrer_id and order.referrer_id.commission_plan_id != order.commission_plan_id)
updated_plan_sale_order.commission_plan_frozen = True
def _prepare_invoice(self):
invoice_vals = super()._prepare_invoice()
if self.referrer_id:
invoice_vals.update({
'referrer_id': self.referrer_id.id,
})
return invoice_vals
def _prepare_upsell_renew_order_values(self, subscription_state):
self.ensure_one()
values = super()._prepare_upsell_renew_order_values(subscription_state)
if self.referrer_id:
values.update({
'referrer_id': self.referrer_id.id,
'commission_plan_id': self.commission_plan_id.id,
'commission_plan_frozen': self.referrer_id.commission_plan_id != self.commission_plan_id,
})
return values