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')