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
|
from odoo import models, fields, api
from odoo.exceptions import UserError
from pytz import timezone
from datetime import datetime
class DeliveryOrder(models.TransientModel):
_name = 'delivery.order'
name = fields.Char(string='Name', default='Delivery Order')
delivery_order_line_ids = fields.One2many(
comodel_name='delivery.order.line',
inverse_name='delivery_order_id',
string='Delivery Order Line'
)
@api.model
def create(self, vals):
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
if len(vals['delivery_order_line_ids']) < 1:
raise UserError('Delivery Order harus di-isi sebelum melanjutkan')
for delivery_order_line in vals['delivery_order_line_ids']:
picking = False
if delivery_order_line[2]['name']:
picking = self.env['stock.picking'].search([('picking_code', '=', delivery_order_line[2]['name'])], limit=1)
if picking:
line_tracking_no = delivery_order_line[2]['tracking_no']
if not picking.driver_id:
picking.driver_id = self.env.uid
picking.delivery_tracking_no = line_tracking_no
delivery_type = self.env['delivery.order.line'].get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date)
if delivery_type == 'departure':
picking.driver_departure_date = current_time
elif delivery_type == 'arrival':
picking.driver_arrival_date = current_time
sale_order = False
if picking.origin:
sale_order = self.env['sale.order'].search([('name', '=', picking.origin)], limit=1)
if sale_order.carrier_id:
if not line_tracking_no and not (sale_order.carrier_id.id == 1
or sale_order.carrier_id.name == 'INDOTEKNIK DELIVERY'
or sale_order.carrier_id.name == 'PICKUP MUARA BARU'
or sale_order.carrier_id.name == 'PICKUP LTC'):
raise UserError('Pengiriman selain Indoteknik Delivery & Pickup, nomor tracking harus diisi')
return super(DeliveryOrder, self).create(vals)
def save_delivery(self):
self.ensure_one()
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': 'Notification',
'message': 'Delivery Order berhasil disimpan',
'next': {'type': 'ir.actions.act_window_close'},
}
}
class DeliveryOrderLine(models.TransientModel):
_name = 'delivery.order.line'
name = fields.Char(string='DO 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')
delivery_order_id = fields.Many2one('delivery.order', string='Delivery Order')
partner_id = fields.Many2one('res.partner', string='Customer')
@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 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
delivery_type = self.get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date)
if delivery_type != 'departure':
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:
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
|