from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError from datetime import timedelta, date, datetime from pytz import timezone, utc import logging import base64 import PyPDF2 import os import re _logger = logging.getLogger(__name__) class AccountMove(models.Model): _inherit = 'account.move' invoice_day_to_due = fields.Integer(string="Day to Due", compute="_compute_invoice_day_to_due") date_send_fp = fields.Datetime(string="Tanggal Kirim Faktur Pajak") last_log_fp = fields.Char(string="Log Terakhir Faktur Pajak") # use for industry business 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') payment_schedule = fields.Date(string='Jadwal Pembayaran') shipper_faktur_id = fields.Many2one('delivery.carrier', string='Shipper Faktur') due_extension = fields.Integer(string='Due Extension', default=0) new_due_date = fields.Date(string='New Due') counter = fields.Integer(string="Counter", default=0) cost_centre_id = fields.Many2one('cost.centre', string='Cost Centre') analytic_account_ids = fields.Many2many('account.analytic.account', string='Analytic Account') due_line = fields.One2many('due.extension.line', 'invoice_id', compute='_compute_due_line', string='Due Extension Lines') no_faktur_pajak = fields.Char(string='No Faktur Pajak') date_completed = fields.Datetime(string='Date Completed') @api.onchange('efaktur_id') def change_efaktur_id(self): for invoice in self: if not invoice.efaktur_id: return invoice.no_faktur_pajak = invoice.efaktur_id.name def _compute_due_line(self): for invoice in self: invoice.due_line = self.env['due.extension.line'].search([ ('invoice_id', '=', invoice.id), ('due_id.approval_status', '=', 'approved') ]) def unlink(self): res = super(AccountMove, self).unlink() if self.state == 'posted': raise UserError('Data Hanya Bisa Di Cancel') return res def button_cancel(self): res = super(AccountMove, self).button_cancel() if self.id and not self.env.user.is_accounting: raise UserError('Hanya Accounting yang bisa Cancel') return res def button_draft(self): res = super(AccountMove, self).button_draft() if not self.env.user.is_accounting: raise UserError('Hanya Accounting yang bisa Reset to Draft') return res def action_post(self): if self._name != 'account.move': return super(AccountMove, self).action_post() # validation cant qty invoice greater than qty order if self.move_type == 'out_invoice': query = ["&",("name","=",self.invoice_origin),"|",("state","=","sale"),("state","=","done")] sale_order = self.env['sale.order'].search(query, limit=1) sum_qty_invoice = sum_qty_order = 0 for line in sale_order.order_line: sum_qty_invoice += line.qty_invoiced sum_qty_order += line.product_uom_qty if sum_qty_invoice > sum_qty_order: raise UserError('Error Qty Invoice akan lebih besar dari Qty Order jika lanjut Posting') elif self.move_type == 'in_invoice': query = ["&",("name","=",self.invoice_origin),"|",("state","=","purchase"),("state","=","done")] purchase_order = self.env['purchase.order'].search(query, limit=1) sum_qty_invoice = sum_qty_order = 0 for line in purchase_order.order_line: sum_qty_invoice += line.qty_invoiced sum_qty_order += line.product_uom_qty if sum_qty_invoice > sum_qty_order: raise UserError('Error Qty Invoice akan lebih besar dari Qty Order jika lanjut Posting') res = super(AccountMove, self).action_post() # if not self.env.user.is_accounting: # raise UserError('Hanya Accounting yang bisa Posting') # if self._name == 'account.move': for entry in self: entry.date_completed = datetime.utcnow() for line in entry.line_ids: line.date_maturity = entry.date return res def _compute_invoice_day_to_due(self): for invoice in self: invoice_day_to_due = 0 if invoice.payment_state not in ['paid', 'in_payment', 'reversed'] and invoice.invoice_date_due: invoice_day_to_due = invoice.invoice_date_due - date.today() if invoice.new_due_date: invoice_day_to_due = invoice.new_due_date - date.today() invoice_day_to_due = invoice_day_to_due.days invoice.invoice_day_to_due = invoice_day_to_due @api.onchange('date_kirim_tukar_faktur') def change_date_kirim_tukar_faktur(self): for invoice in self: if not invoice.date_kirim_tukar_faktur: return tukar_date = invoice.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 @api.onchange('date_terima_tukar_faktur') def change_date_terima_tukar_faktur(self): for invoice in self: if not invoice.date_terima_tukar_faktur: return tukar_date = invoice.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 def open_form_multi_update(self): action = self.env['ir.actions.act_window']._for_xml_id('indoteknik_custom.action_account_move_multi_update') action['context'] = { 'move_ids': [x.id for x in self] } return action