297 lines
14 KiB
Python
297 lines
14 KiB
Python
# -*- coding: utf-8 -*-
|
|
from openerp import models, fields, api
|
|
from openerp.exceptions import UserError, ValidationError
|
|
import datetime
|
|
from datetime import date
|
|
from dateutil.relativedelta import relativedelta
|
|
from openerp.exceptions import UserError, ValidationError
|
|
class SaleOrder(models.Model):
|
|
_inherit = "sale.order"
|
|
|
|
@api.model
|
|
def _get_is_apply(self):
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
if commission_based_on == 'sales_team':
|
|
return True
|
|
|
|
# commission_manager_id = fields.Many2one(
|
|
# 'sales.commission.line',
|
|
# string='Sales Commission for Manager'
|
|
# )
|
|
# commission_person_id = fields.Many2one(
|
|
# 'sales.commission.line',
|
|
# string='Sales Commission for Member'
|
|
# )
|
|
is_apply = fields.Boolean(
|
|
string='Is Apply ?',
|
|
compute='_compute_is_apply',
|
|
default=_get_is_apply
|
|
)
|
|
sale_commission_user_ids = fields.One2many(
|
|
'sale.commission.level.users',
|
|
'order_id',
|
|
string="Sale Commission User"
|
|
)
|
|
sale_commission_percentage_ids = fields.One2many(
|
|
'sale.commission.level.percentage',
|
|
'sale_order_id',
|
|
string="Sale Commission Level Percentage"
|
|
)
|
|
|
|
@api.multi
|
|
@api.depends()
|
|
def _compute_is_apply(self):
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
for rec in self:
|
|
if commission_based_on == 'sales_team':
|
|
rec.is_apply = True
|
|
|
|
@api.multi
|
|
@api.onchange('team_id')
|
|
def team_id_change(self):
|
|
for rec in self:
|
|
sale_commission_percentage = []
|
|
for level in rec.sudo().team_id.sale_commission_percentage_ids:
|
|
sale_commission_percentage.append((0,0,{'level_id': level.level_id.id,
|
|
'percentage': level.percentage,
|
|
'sale_order_id':rec.id}))
|
|
rec.sale_commission_percentage_ids = sale_commission_percentage
|
|
|
|
@api.multi
|
|
@api.onchange('partner_id')
|
|
def partner_id_change(self):
|
|
for rec in self:
|
|
sale_commission = []
|
|
for level in rec.partner_id.sale_commission_user_ids:
|
|
sale_commission.append((0,0,{'level_id': level.level_id.id,
|
|
'user_id': level.user_id.id,
|
|
'order_id':rec.id}))
|
|
rec.sale_commission_user_ids = sale_commission
|
|
rec.sale_commission_percentage_ids = sale_commission
|
|
|
|
@api.multi
|
|
def get_categorywise_commission(self):
|
|
for rec in self:
|
|
commission = {}
|
|
for line in rec.order_line:
|
|
for commission_id in line.sale_commission_percentage_ids:
|
|
for partner in rec.sale_commission_user_ids:
|
|
if partner.level_id == commission_id.level_id:
|
|
amount = (line.price_subtotal * commission_id.percentage)/100
|
|
if partner.user_id not in commission:
|
|
commission[partner.user_id] = 0.0
|
|
commission[partner.user_id] += amount
|
|
return commission
|
|
|
|
@api.multi
|
|
def get_productwise_commission(self):
|
|
for rec in self:
|
|
commission = {}
|
|
for line in rec.order_line:
|
|
for commission_id in line.sale_commission_percentage_ids:
|
|
for partner in rec.sale_commission_user_ids:
|
|
if partner.level_id == commission_id.level_id:
|
|
amount = (line.price_subtotal * commission_id.percentage)/100
|
|
if partner.user_id not in commission:
|
|
commission[partner.user_id] = 0.0
|
|
commission[partner.user_id] += amount
|
|
return commission
|
|
|
|
@api.multi
|
|
def get_teamwise_commission(self):
|
|
for rec in self:
|
|
commission = {}
|
|
for commission_id in rec.sale_commission_percentage_ids:
|
|
for partner in rec.sale_commission_user_ids:
|
|
if partner.level_id == commission_id.level_id:
|
|
amount = (rec.amount_untaxed * commission_id.percentage)/100
|
|
if partner.user_id not in commission:
|
|
commission[partner.user_id] = 0.0
|
|
commission[partner.user_id] += amount
|
|
return commission
|
|
|
|
@api.multi
|
|
def create_commission(self, user_commission,commission):
|
|
commission_obj = self.env['sales.commission.line']
|
|
product = self.env['product.product'].search([('is_commission_product','=',1)],limit=1)
|
|
for user in user_commission:
|
|
for order in self:
|
|
if user_commission:
|
|
for sale_commission in commission.commission_user_id:
|
|
if user.id == sale_commission.id:
|
|
commission_value = {
|
|
'commission_user_id': user.id,
|
|
'amount': user_commission[user],
|
|
'origin': order.name,
|
|
'user_id':user.id,
|
|
'product_id': product.id,
|
|
'date' : order.confirmation_date,
|
|
'src_order_id': order.id,
|
|
'sales_commission_id':commission.id,
|
|
'sales_team_id': order.team_id and order.team_id.id or False,
|
|
}
|
|
commission_id = commission_obj.sudo().create(commission_value)
|
|
order.commission_person_id = commission_id.id
|
|
return True
|
|
|
|
@api.multi
|
|
def create_base_commission(self, user):
|
|
commission_obj = self.env['sales.commission']
|
|
product = self.env['product.product'].search([('is_commission_product','=',1)],limit=1)
|
|
if user:
|
|
for order in self:
|
|
today = date.today()
|
|
first_day = today.replace(day=1)
|
|
last_day = datetime.datetime(today.year,today.month,1)+relativedelta(months=1,days=-1)
|
|
commission_value = {
|
|
'start_date' : first_day,
|
|
'end_date': last_day,
|
|
'product_id':product.id,
|
|
'commission_user_id': user.id,
|
|
}
|
|
commission_id = commission_obj.sudo().create(commission_value)
|
|
return commission_id
|
|
|
|
@api.multi
|
|
def action_confirm(self):
|
|
res = super(SaleOrder, self).action_confirm()
|
|
when_to_pay = self.env['ir.values'].get_default('sale.config.settings', 'when_to_pay')
|
|
if when_to_pay == 'sales_confirm':
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
for order in self:
|
|
if commission_based_on == 'sales_team':
|
|
user_commission = order.get_teamwise_commission()
|
|
elif commission_based_on == 'product_category':
|
|
user_commission = order.get_categorywise_commission()
|
|
elif commission_based_on == 'product_template':
|
|
user_commission = order.get_productwise_commission()
|
|
for user in user_commission:
|
|
commission = self.env['sales.commission'].search([
|
|
('commission_user_id', '=', user.id),
|
|
('start_date', '<', order.date_order),
|
|
('end_date', '>', order.date_order),
|
|
('state','=','draft')], limit=1)
|
|
if not commission:
|
|
commission = order.create_base_commission(user)
|
|
if commission:
|
|
order.create_commission(user_commission, commission)
|
|
return res
|
|
|
|
@api.multi
|
|
def action_cancel(self):
|
|
res = super(SaleOrder, self).action_cancel()
|
|
commission_obj = self.env['sales.commission.line']
|
|
for rec in self:
|
|
lines = commission_obj.sudo().search([('src_order_id', '=', rec.id)])
|
|
for line in lines:
|
|
if line.state == 'draft' or line.state == 'cancel':
|
|
line.state = 'exception'
|
|
elif line.state in ('paid', 'invoice'):
|
|
raise UserError(_('You can not cancel this invoice because sales commission is invoiced/paid. Please cancel related commission lines and try again.'))
|
|
# if rec.commission_manager_id:
|
|
# rec.commission_manager_id.state = 'exception'
|
|
# if rec.commission_person_id:
|
|
# rec.commission_person_id.state = 'exception'
|
|
return res
|
|
|
|
@api.multi
|
|
def _prepare_invoice(self):
|
|
vals = super(SaleOrder, self)._prepare_invoice()
|
|
if self.sale_commission_user_ids:
|
|
sale_commission_user_lines = []
|
|
for commission in self.sale_commission_user_ids:
|
|
sale_commission_user_lines.append((0, 0, {
|
|
'level_id': commission.level_id.id,
|
|
'user_id': commission.user_id and commission.user_id.id or False}))
|
|
vals.update({'sale_commission_user_ids': sale_commission_user_lines})
|
|
|
|
if self.sale_commission_percentage_ids:
|
|
sale_commission_lines = []
|
|
for commission in self.sale_commission_percentage_ids:
|
|
sale_commission_lines.append((0, 0, {
|
|
'level_id': commission.level_id.id,
|
|
'percentage': commission.percentage}))
|
|
vals.update({'sale_commission_percentage_ids': sale_commission_lines})
|
|
return vals
|
|
|
|
|
|
class SaleOrderLine(models.Model):
|
|
_inherit = 'sale.order.line'
|
|
|
|
@api.model
|
|
def _get_is_apply(self):
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
when_to_pay = self.env['ir.values'].get_default('sale.config.settings', 'when_to_pay')
|
|
if commission_based_on != 'sales_team' and when_to_pay == 'sales_confirm':
|
|
return True
|
|
|
|
is_apply = fields.Boolean(
|
|
string='Is Apply ?',
|
|
compute='_compute_is_apply',
|
|
default=_get_is_apply
|
|
)
|
|
sale_commission_percentage_ids = fields.One2many(
|
|
'sale.commission.level.percentage',
|
|
'sale_order_line_id',
|
|
string="Sale Commission Level Percentage"
|
|
)
|
|
|
|
@api.multi
|
|
@api.depends()
|
|
def _compute_is_apply(self):
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
for rec in self:
|
|
when_to_pay = self.env['ir.values'].get_default('sale.config.settings', 'when_to_pay')
|
|
if commission_based_on != 'sales_team' and when_to_pay == 'sales_confirm':
|
|
rec.is_apply = True
|
|
|
|
@api.multi
|
|
@api.onchange('product_id')
|
|
def product_id_change(self):
|
|
res = super(SaleOrderLine, self).product_id_change()
|
|
# when_to_pay = self.env['ir.values'].get_default('sale.config.settings', 'when_to_pay')
|
|
# if when_to_pay == 'sales_confirm':
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
for rec in self:
|
|
sale_commission_percentage = []
|
|
if commission_based_on == 'product_category':
|
|
for level in rec.product_id.categ_id.sale_commission_percentage_ids:
|
|
sale_commission_percentage.append((0,0,{'level_id': level.level_id.id,
|
|
'percentage': level.percentage,
|
|
'sale_order_line_id':rec.id}))
|
|
elif commission_based_on == 'product_template':
|
|
for level in rec.product_id.sale_commission_percentage_ids:
|
|
sale_commission_percentage.append((0,0,{'level_id': level.level_id.id,
|
|
'percentage': level.percentage,
|
|
'sale_order_line_id':rec.id}))
|
|
rec.sale_commission_percentage_ids = sale_commission_percentage
|
|
return res
|
|
|
|
@api.multi
|
|
def _prepare_invoice_line(self, qty):
|
|
vals = super(SaleOrderLine, self)._prepare_invoice_line(qty)
|
|
if self.sale_commission_percentage_ids:
|
|
sale_commission_percentage_lines = []
|
|
for commission in self.sale_commission_percentage_ids:
|
|
sale_commission_percentage_lines.append((0, 0, {
|
|
'level_id': commission.level_id.id,
|
|
'percentage': commission.percentage}))
|
|
vals.update({'sale_commission_percentage_ids': sale_commission_percentage_lines})
|
|
else:#FIX 12 Sep 2017 - Default Template issue. SETH Saheb
|
|
commission_based_on = self.env['ir.values'].get_default('sale.config.settings', 'commission_based_on')
|
|
sale_commission_percentage = []
|
|
if commission_based_on == 'product_category':
|
|
for level in self.product_id.categ_id.sale_commission_percentage_ids:
|
|
sale_commission_percentage.append((0, 0, {
|
|
'level_id': level.level_id.id,
|
|
'percentage': level.percentage}))
|
|
elif commission_based_on == 'product_template':
|
|
for level in self.product_id.sale_commission_percentage_ids:
|
|
sale_commission_percentage.append((0, 0, {
|
|
'level_id': level.level_id.id,
|
|
'percentage': level.percentage}))
|
|
vals.update({'sale_commission_percentage_ids': sale_commission_percentage})
|
|
return vals
|
|
|
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|