summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/bill_receipt.py
blob: 7d38d5ada6f6e4c9feff64d6008324b6c74f0a06 (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
118
119
120
121
122
123
124
125
126
127
128
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')