summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/logbook_sj.py
blob: 75b2622ff6bcf589a80325c0a7a38536ccd0e7cf (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
129
from odoo import models, fields, api, _
from odoo.exceptions import UserError
from pytz import timezone
from datetime import datetime

class LogbookSJ(models.TransientModel):
    _name = 'logbook.sj'

    name = fields.Char(string='Name', default='Logbook SJ')
    logbook_sj_line = fields.One2many(
        comodel_name='logbook.sj.line',
        inverse_name='logbook_sj_id',
        string='Logbook SJ Line'
    )

    def create_logbook_sj(self):
        logbook_line = self.logbook_sj_line

        current_time = datetime.utcnow()
        report_logbook_ids = []
        parameters_header = {
            'date': current_time,
            'created_by': self.env.user.id,
        }

        report_logbook = self.env['report.logbook.sj'].create([parameters_header])
        for line in logbook_line:
            picking = self.env['stock.picking'].search([('picking_code', '=', line.name)], limit=1)
            if not picking:
                picking = self.env['stock.picking'].search([('out_code', '=', line.name)], limit=1)
            stock = picking
            parent_id = stock.partner_id.parent_id.id
            parent_id =  parent_id if parent_id else stock.partner_id.id

            data = {
                'picking_id': stock.id,
                'sale_id': stock.sale_id.id,
                'name': stock.name,
                'driver_id': stock.driver_id.id,
                'departure_date': stock.driver_departure_date,
                'arrival_date': stock.driver_arrival_date,
                'carrier_id': stock.carrier_id.id,
                'tracking_no': stock.delivery_tracking_no,
                'partner_id': parent_id,
                'report_logbook_sj_id': report_logbook.id,
                'note': line.note
            }
            self.env['report.logbook.sj.line'].create([data])

            report_logbook_ids.append(report_logbook.id)
            line.unlink()
            
        self.unlink()
        return {
            'name': _('Report Logbook SJ'),
            'view_mode': 'tree,form',
            'res_model': 'report.logbook.sj',
            'target': 'current',
            'type': 'ir.actions.act_window',
            'domain': [('id', 'in', report_logbook_ids)],
        }

class LogbookSJLine(models.TransientModel):
    _name = 'logbook.sj.line'

    name = fields.Char(string='SJ Number')
    driver_id = fields.Many2one(comodel_name='res.users', string='Driver')
    departure_date = fields.Char(string='Departure Date')
    arrival_date = fields.Char(string='Arrival Date')
    carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method')
    tracking_no = fields.Char(string='Tracking No')
    logbook_sj_id = fields.Many2one('logbook.sj', string='Logbook SJ')
    partner_id = fields.Many2one('res.partner', string='Customer')
    picking_id = fields.Many2one('res.partner', string='Customer')
    note = fields.Char(string='Note')

    @api.onchange('name')
    def onchange_name(self):
        current_time = datetime.now(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S')

        if self.name:
            if len(self.name) == 13:
                self.name = self.name[:-1]
            picking = self.env['stock.picking'].search([('picking_code', '=', self.name)], limit=1)

            if not picking:
                picking = self.env['stock.picking'].search([('out_code', '=', self.name)], limit=1)
            if picking:
                if picking.driver_id:
                    self.driver_id = picking.driver_id
                else:
                    self.driver_id = self.env.uid

                sale_order = False
                if picking.origin:
                    sale_order = self.env['sale.order'].search([('name', '=', picking.origin)], limit=1)

                if sale_order.carrier_id:
                    self.carrier_id = sale_order.carrier_id

                self.tracking_no = picking.delivery_tracking_no

                self.partner_id = picking.partner_id

                self.picking_id = picking.id

                delivery_type = self.get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date)
                if delivery_type != 'departure':
                    if picking.driver_departure_date:
                        self.departure_date = picking.driver_departure_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S')

                if delivery_type == 'departure':
                    self.departure_date = current_time
                elif delivery_type == 'arrival':
                    self.arrival_date = current_time
                else:
                    if picking.driver_arrival_date:
                        self.arrival_date = picking.driver_arrival_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S')
            else:
                raise UserError('Nomor DO tidak ditemukan')

    def get_delivery_type(self, driver_departure_date, driver_arrival_date):
        delivery_type = 'departure'
        if driver_departure_date:
            delivery_type = 'arrival'
        if driver_arrival_date:
            delivery_type = False

        return delivery_type