1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
from odoo import models, api, fields
from odoo.exceptions import UserError
from datetime import datetime
import logging
_logger = logging.getLogger(__name__)
class CustomerRebate(models.Model):
_name = 'customer.rebate'
_order = 'id desc'
_inherit = ['mail.thread']
partner_id = fields.Many2one('res.partner', string='Customer')
date_from = fields.Date(string='Date From', required=True)
date_to = fields.Date(string='Date To', required=True)
target_quarter = fields.Float(string='Target/Quarter')
class CustomerCommision(models.Model):
_name = 'customer.commision'
_order = 'id desc'
_inherit = ['mail.thread']
_rec_name = 'number'
number = fields.Char(string='Document No', index=True, copy=False, readonly=True)
date_from = fields.Date(string='Date From', required=True)
date_to = fields.Date(string='Date To', required=True)
partner_id = fields.Many2one('res.partner', String='Customer', required=True)
description = fields.Char(string='Description')
notification = fields.Char(string='Notification')
commision_lines = fields.One2many('customer.commision.line', 'customer_commision_id', string='Lines', auto_join=True)
status = fields.Selection([
('pengajuan', 'Menunggu Approval'),
('approved', 'Approved')
], string='Status', copy=False, readonly=True, tracking=3)
commision_percent = fields.Float(string='Commision %', tracking=3)
commision_amt = fields.Float(string='Commision Amount', tracking=3)
total_dpp = fields.Float(string='Total DPP', compute='_compute_total_dpp')
commision_type = fields.Selection([
('fee', 'Fee'),
('cashback', 'Cashback'),
('rebate', 'Rebate'),
], string='Commision Type')
# add status for type of commision, fee, rebate / cashback
# include child or not?
@api.constrains('commision_percent')
def _onchange_commision_percent(self):
print('masuk onchange commision percent')
self.commision_amt = self.commision_percent * self.total_dpp // 100
# @api.constrains('commision_amt')
# def _onchange_commision_amt(self):
# print('masuk onchange commision amt')
# self.commision_percent = (self.commision_amt / self.grand_total * 100)
def _compute_total_dpp(self):
for data in self:
total_dpp = 0
for line in data.commision_lines:
total_dpp = total_dpp + line.dpp
data.total_dpp = total_dpp
@api.model
def create(self, vals):
vals['number'] = self.env['ir.sequence'].next_by_code('customer.commision') or '0'
result = super(CustomerCommision, self).create(vals)
return result
def action_confirm_customer_commision(self):
if not self.status:
self.status = 'pengajuan'
elif self.status == 'pengajuan' and self.env.user.is_leader:
for line in self.commision_lines:
line.invoice_id.is_customer_commision = True
self.status = 'approved'
else:
raise UserError('Harus di approved oleh Pimpinan')
return
def generate_customer_commision(self):
if self.commision_lines:
raise UserError('Line sudah ada, tidak bisa di generate ulang')
partners = []
partners += self.partner_id.child_ids
partners.append(self.partner_id)
for partner in partners:
where = [
('move_type', '=', 'out_invoice'),
('state', '=', 'posted'),
('is_customer_commision', '=', False),
('partner_id.id', '=', partner.id),
('invoice_date', '>=', self.date_from),
('invoice_date', '<=', self.date_to),
]
invoices = self.env['account.move'].search(where, order='id')
for invoice in invoices:
self.env['customer.commision.line'].create([{
'customer_commision_id': self.id,
'partner_id': invoice.partner_id.id,
'invoice_id': invoice.id,
'state': invoice.state,
'dpp': invoice.amount_untaxed_signed,
'tax': invoice.amount_tax_signed,
'total': invoice.amount_total_signed
}])
return
class CustomerCommisionLine(models.Model):
_name = 'customer.commision.line'
_order = 'id'
customer_commision_id = fields.Many2one('customer.commision', string='Ref', required=True, ondelete='cascade', copy=False)
invoice_id = fields.Many2one('account.move', string='Invoice')
partner_id = fields.Many2one('res.partner', string='Customer')
state = fields.Char(string='InvStatus')
dpp = fields.Float(string='DPP')
tax = fields.Float(string='TaxAmt')
total = fields.Float(string='Total')
class AccountMove(models.Model):
_inherit = 'account.move'
is_customer_commision = fields.Boolean(string='Customer Commision Used')
|