from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError from datetime import timedelta import logging _logger = logging.getLogger(__name__) class BillReceipt(models.Model): _name = 'bill.receipt' _description = 'Bill Receipt' _order = 'bill_date desc, id desc' number = fields.Char(string='Document No', index=True, copy=False, readonly=True) bill_date = fields.Date(string='Bill Date', required=True) partner_id = fields.Many2one( 'res.partner', string='Vendor', required=True, change_default=True, index=True, tracking=1) bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines', auto_join=True) # dunning_level = fields.Integer(string='Bill Level', default=30, help='30 hari sebelum jatuh tempo invoice') date_kirim_tukar_faktur = fields.Date(string='Kirim Faktur') resi_tukar_faktur = fields.Char(string='Resi Faktur') date_terima_tukar_faktur = fields.Date(string='Terima Faktur') shipper_faktur_id = fields.Many2one('delivery.carrier', string='Shipper Faktur') is_validated = fields.Boolean(string='Validated') notification = fields.Char(string='Notification') grand_total = fields.Float(string='Grand Total', compute="_compute_grand_total") def _compute_grand_total(self): for record in self: grand_total = 0 for line in record.bill_line: grand_total += line.total_amt record.grand_total = grand_total def copy_date_faktur(self): if not self.is_validated: raise UserError('Harus di validate dulu') for line in self.bill_line: invoice = line.invoice_id if not invoice.date_kirim_tukar_faktur and self.date_kirim_tukar_faktur: invoice.date_kirim_tukar_faktur = self.date_kirim_tukar_faktur tukar_date = self.date_kirim_tukar_faktur term = invoice.invoice_payment_term_id add_days = 0 for line in term.line_ids: add_days += line.days due_date = tukar_date + timedelta(days=add_days) invoice.invoice_date_due = due_date if not invoice.resi_tukar_faktur: invoice.resi_tukar_faktur = self.resi_tukar_faktur if not invoice.date_terima_tukar_faktur and self.date_terima_tukar_faktur: invoice.date_terima_tukar_faktur = self.date_terima_tukar_faktur tukar_date = self.date_terima_tukar_faktur term = invoice.invoice_payment_term_id add_days = 0 for line in term.line_ids: add_days += line.days due_date = tukar_date + timedelta(days=add_days) invoice.invoice_date_due = due_date if not invoice.shipper_faktur_id: invoice.shipper_faktur_id = self.shipper_faktur_id self.notification = 'Berhasil copy tanggal terima faktur ke setiap invoice %s' % self.date_terima_tukar_faktur def validate_bill(self): if not self.bill_line: raise UserError('Bill Line masih kosong, generate dulu') else: self.is_validated = True self.notification = 'Jangan lupa klik Copy Date jika sudah ada tanggal kirim / tanggal terima faktur' def generate_bill_line(self): if self.is_validated: raise UserError('Sudah di validate, tidak bisa digenerate ulang') if self.bill_line: raise UserError('Harus hapus semua line jika ingin generate ulang') if self.partner_id.parent_id: raise UserError('Harus pilih parent company') partners = [] partners += self.partner_id.child_ids partners.append(self.partner_id) for partner in partners: query = [ ('move_type', '=', 'in_invoice'), ('state', '=', 'posted'), ('partner_id', '=', partner.id), ('payment_state', '=', 'not_paid'), ('date_kirim_tukar_faktur', '=', False), ] invoices = self.env['account.move'].search(query, order='invoice_date') count = 0 for invoice in invoices: self.env['bill.receipt.line'].create([{ 'bill_id': self.id, 'partner_id': invoice.partner_id.id, 'invoice_id': invoice.id, 'date_invoice': invoice.invoice_date, 'reference': invoice.ref, 'total_amt': invoice.amount_total, 'open_amt': invoice.amount_residual_signed, 'due_date': invoice.invoice_date_due }]) count += 1 _logger.info("Bill Line generated %s" % count) @api.model def create(self, vals): vals['number'] = self.env['ir.sequence'].next_by_code('bill.receipt') or '0' result = super(BillReceipt, self).create(vals) return result class BillReceiptLine(models.Model): _name = 'bill.receipt.line' _description = 'Bill Receipt Line' _order = 'bill_id, id' bill_id = fields.Many2one('bill.receipt', string='Bill Ref', required=True, ondelete='cascade', index=True, copy=False) partner_id = fields.Many2one('res.partner', string='Customer') invoice_id = fields.Many2one('account.move', string='Invoice') date_invoice = fields.Date(string='Invoice Date') reference = fields.Char(string='Reference') total_amt = fields.Float(string='Total Amount') open_amt = fields.Float(string='Open Amount') due_date = fields.Date(string='Due Date')