Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pre_commissions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
13 changes: 13 additions & 0 deletions pre_commissions/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
'name': "Sale Commission",
'author': "Kunj Koradiya",
'description': "This is the description",
'license': "LGPL-3",
'depends': ['base', 'account', 'sale'],
'data': [
'security/ir.model.access.csv',
'views/commision_rule.xml',
'views/sale_commission.xml',
'views/menus.xml'
]
}
3 changes: 3 additions & 0 deletions pre_commissions/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import commission_rule
from . import sale_commission
from . import account_move
21 changes: 21 additions & 0 deletions pre_commissions/models/account_move.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from odoo import models


class AccountMove(models.Model):
_inherit = 'account.move'

def action_post(self):
res = super().action_post()
# breakpoint()
for move in self:
if move.move_type != 'out_invoice':
continue

sale_orders = move.invoice_line_ids.sale_line_ids.order_id
sale_orders = sale_orders.exists()

if not sale_orders:
continue

self.env['sale.commission'].sudo().check_commission_rules(sale_orders, move)
return res
52 changes: 52 additions & 0 deletions pre_commissions/models/commission_rule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from odoo import fields, models, api


class CommisionRule(models.Model):
_name = 'commission.rule'
_desc = "Commission Rule"
_order = 'sequence'

sequence = fields.Integer()
active = fields.Boolean(default=True)
commission_rate = fields.Float(required=True)
due_at = fields.Selection([
('invoice', "Invoice Posted"),
('payment', "Payment Received")
],
default='invoice',
required=True
)
commission_for = fields.Selection([
('salesperson', "Salesperson"),
('team', "Sales Team")
])
product_category_id = fields.Many2one('product.category')
product_id = fields.Many2one('product.product')
product_expired = fields.Selection([
('no_impact', 'No Impact'),
('yes', "Expired Only"),
('no', 'Not Expired')
], default='no_impact'
)
max_discount = fields.Float(string="Max Discount %")
fast_payment = fields.Boolean()
fast_payment_days = fields.Integer()
salesperson_id = fields.Many2one('res.users')
team_id = fields.Many2one('crm.team', string="Sales Team")
condition_display = fields.Char(store=True, compute='_compute_condition_display')

@api.depends('product_category_id', 'product_id', 'salesperson_id', 'team_id', 'max_discount')
def _compute_condition_display(self):
for rec in self:
parts = []
if rec.product_category_id:
parts.append(f"Category: {rec.product_category_id.name}")
if rec.product_id:
parts.append(f"Product: {rec.product_id.name}")
if rec.salesperson_id:
parts.append(f"Salesperson: {rec.salesperson_id.name}")
if rec.team_id:
parts.append(f"Team: {rec.team_id.name}")
if rec.max_discount:
parts.append(f"Max Discount: {rec.max_discount}%")
rec.condition_display = " AND ".join(parts) or "All"
56 changes: 56 additions & 0 deletions pre_commissions/models/sale_commission.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from odoo import fields, models, api


class SaleCommission(models.Model):
_name = 'sale.commission'
_description = "Sale Commission"

date = fields.Date(required=True)
user_id = fields.Many2one('res.users', string="Salesperson")
team_id = fields.Many2one('crm.team', string="Sales Team")
invoice_id = fields.Many2one('account.move')
partner_id = fields.Many2one(related='invoice_id.partner_id', store=True)

amount = fields.Monetary()
currency_id = fields.Many2one(
'res.currency',
default=lambda self: self.env.company.currency_id.id
)

rule_id = fields.Many2one('commission.rule')
sale_order_id = fields.Many2one('sale.order')

def check_commission_rules(self, sale_orders, invoice):
# breakpoint()
if not sale_orders:
return
rules = self.env['commission.rule'].search([
('active', '=', True)
])
for order in sale_orders:
for rule in rules:
condition_ok = True
if rule.salesperson_id and order.user_id != rule.salesperson_id:
condition_ok = False
if rule.team_id and order.team_id != rule.team_id:
condition_ok = False

if not condition_ok:
continue
# existing = self.search([
# ('invoice_id', '=', invoice.id),
# ('rule_id', '=', rule.id),
# ('sale_order_id', '=', order.id)
# ], limit=1)
# if existing:
# continue
commission_amount = invoice.amount_total * rule.commission_rate
self.create({
'date': invoice.invoice_date,
'invoice_id': invoice.id,
'user_id': order.user_id.id,
'team_id': order.team_id.id,
'amount': commission_amount,
'rule_id': rule.id,
'sale_order_id': order.id,
})
3 changes: 3 additions & 0 deletions pre_commissions/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_commission_rules,access_commission_rules,model_commission_rule,base.group_user,1,1,1,1
access_sale_commissions,access_sale_commissions,model_sale_commission,base.group_user,1,1,1,1
65 changes: 65 additions & 0 deletions pre_commissions/views/commision_rule.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action -->
<record id="sale_commission_rule_action" model="ir.actions.act_window">
<field name="name">Commission Rules</field>
<field name="res_model">commission.rule</field>
<field name="view_mode">list,form</field>
</record>

<!-- Form View -->
<record id="commission_rule_view_form" model="ir.ui.view">
<field name="name">commission.rule.view.form</field>
<field name="model">commission.rule</field>
<field name="arch" type="xml">
<form string="Commission Rules">
<sheet>
<group>
<group>
<field name="commission_rate" widget="percentage" style="width:60px;"/>
<field name="due_at"/>
</group>
<group>
<field name="commission_for"/>
</group>
</group>
<group string="Apply on">
<group>
<field name="product_category_id" placeholder="All"/>
<field name="product_id" placeholder="All"/>
<field name="product_expired"/>
<field name="max_discount" widget="percentage" style="width:60px;"/>
</group>
<group>
<label for="fast_payment" string="On fast payment"/>
<div class="o_row">
<field name="fast_payment" nolabel="1"/>
<span invisible="not fast_payment">before</span>
<field name="fast_payment_days" nolabel="1" invisible="not fast_payment" class="oe_inline" style="width:60px;"/>
<span invisible="not fast_payment">days</span>
</div>
<field name="salesperson_id" placeholder="All" string="Salesperson" invisible = "commission_for and commission_for != 'salesperson'"/>
<field name="team_id" placeholder="All" string="Sales team" invisible = "commission_for and commission_for != 'team'"/>
</group>
</group>
</sheet>
</form>
</field>
</record>

<!-- List View -->
<record id="commission_rule_view_list" model="ir.ui.view">
<field name="name">commission.rule.view.list</field>
<field name="model">commission.rule</field>
<field name="arch" type="xml">
<list string="Commission Rules">
<field name="sequence" widget="handle"/>
<field name="due_at"/>
<field name="commission_rate" widget="percentage"/>
<field name="commission_for"/>
<field name="condition_display"/>
</list>
</field>
</record>

</odoo>
16 changes: 16 additions & 0 deletions pre_commissions/views/menus.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>

<menuitem
id="sale_commission_rule"
name="Commision Rules"
parent="sale.menu_sale_config"
action="sale_commission_rule_action"/>

<menuitem
id="sale_sales_commission"
name="Sales Commissions"
parent="sale.menu_sale_report"
action="sale_commission_action"/>

</odoo>
53 changes: 53 additions & 0 deletions pre_commissions/views/sale_commission.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="sale_commission_action" model="ir.actions.act_window">
<field name="name">Sale Commission</field>
<field name="res_model">sale.commission</field>
<field name="view_mode">list,form,pivot,graph</field>

</record>

<!-- List View -->
<record id="sale_commission_view_list" model="ir.ui.view">
<field name="name">sale.commission.view.list</field>
<field name="model">sale.commission</field>
<field name="arch" type="xml">
<list string="Commission Rules">
<field name="date"/>
<field name="user_id"/>
<field name="team_id"/>
<field name="invoice_id"/>
<field name="amount"/>
</list>
</field>
</record>


<!-- Pivot View -->
<record id="sale_commission_view_pivot" model="ir.ui.view">
<field name="name">sale.commission.view.pivot</field>
<field name="model">sale.commission</field>
<field name="arch" type="xml">
<pivot>
<field name="date" type="row" />
<field name="team_id" type="col" />
<field name="user_id" type="col" />
<field name="amount" type="measure" />
</pivot>
</field>
</record>

<!-- Graph View -->
<record id="sale_commission_view_graph" model="ir.ui.view">
<field name="name">sale.commission.view.graph</field>
<field name="model">sale.commission</field>
<field name="arch" type="xml">
<graph string="" type="bar">
<field name="date" type="row"/>
<field name="user_id" type="col"/>
<field name="amount" type="measure" widget="percentage" string="Current Level"/>
</graph>
</field>
</record>
</odoo>