summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/commision.py
blob: 6d61de4c7ecc37462f1220004937413cec69fb64 (plain)
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')