summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/account_move.py
blob: bc6061ee884779d54bf2d68c173561fecd39601d (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
from odoo import models, api, fields
from odoo.exceptions import AccessError, UserError, ValidationError
from datetime import timedelta, date
import logging

_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')
    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)
    due_line = fields.One2many('due.extension.line', 'invoice_id', compute='_compute_due_line', string='Due Extension Lines')

    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 not self.env.user.is_accounting:
            raise UserError('Hanya Accounting yang bisa delete')
        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:
            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