from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError import logging _logger = logging.getLogger(__name__) class DunningRun(models.Model): _name = 'dunning.run' _description = 'Dunning Run' _order = 'dunning_date desc, id desc' number = fields.Char(string='Document No', index=True, required=True, copy=False, readonly=True) dunning_date = fields.Date(string='Dunning Date') partner_id = fields.Many2one( 'res.partner', string='Customer', required=True, change_default=True, index=True, tracking=1) dunning_line = fields.One2many('dunning.run.line', 'dunning_id', string='Dunning Lines', auto_join=True) dunning_level = fields.Integer(string='Dunning Level', default=30, help='30 hari sebelum jatuh tempo invoice') def generate_dunning_line(self): # validation if not self.partner_id: raise UserError('Customer harus diisi') if self.dunning_level <= 0: raise UserError('Dunning Level harus diisi lebih dari 0') invoices = self.env['account.move'].search([ ('amount_residual_signed', '>', 0), ('partner_id', '=', self.partner_id), ('move_type', '=', 'out_invoice'), ('state', '=', 'posted'), ]) count = 0 for invoice in invoices: self.env['dunning.run.line'].create([{ 'dunning_id': self.id, 'invoice_id': invoice.id, 'date_invoice': invoice.invoice_date, 'efaktur_id': invoice.efaktur_id, 'reference': invoice.ref, 'open_amt': invoice.amount_residual_signed }]) count += 1 _logger.info("Dunning Line generated %s" % count) class DunningRunLine(models.Model): _name = 'dunning.run.line' _description = 'Dunning Run Line' _order = 'dunning_id, id' dunning_id = fields.Many2one('dunning.run', string='Dunning Ref', required=True, ondelete='cascade', index=True, copy=False) invoice_id = fields.Many2one('account.move', string='Invoice') date_invoice = fields.Date(string='Invoice Date') # due_date = fields.Date(string='Due Date') efaktur_id = fields.Many2one('vit.efaktur', string='Faktur Pajak') reference = fields.Char(string='Reference') open_amt = fields.Float(string='Open Amount')