summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/airway_bill.py
blob: 37d2b671156f84a7476da1d2c3ae52b38034ed43 (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
from odoo import models, fields
from datetime import datetime, timedelta
import logging
import requests
import json

_logger = logging.getLogger(__name__)

_key = '7ac9883688da043b50cc32f0e3070bb6'
_url = 'https://pro.rajaongkir.com/api/waybill'

class AirwayBill(models.Model):
    _name = 'airway.bill'
    _rec_name = 'number'

    do_id = fields.Many2one('stock.picking', string='DO')
    so_id = fields.Many2one('sale.order', string='SO')
    number = fields.Char(string='Resi', help='Nomor Resi')
    manifest_ids = fields.One2many('airway.bill.manifest', 'waybill_id', string='Airway Bill Lines', auto_join=True)
    delivered = fields.Boolean(string='Delivered', help='terkirim atau belum / true or false')
    response = fields.Char(string='Response', help='hasil history tracking dalam format json')
    way_bill_date = fields.Char(string='Way Bill Date', compute='_compute_way_bill_datetime')
    weight = fields.Char(string='Weight ', compute='_compute_way_bill_weight')
    origin = fields.Char(string='Origin', compute='_compute_way_bill_origin')
    destination = fields.Char(string='Destination', compute='_compute_way_bill_destination')
    shipper_name = fields.Char(string='Shipper Name', compute='_compute_way_bill_shipper_name')
    shipper_address1 = fields.Char(string='Shipper Address 1', compute='_compute_way_bill_shipper_address1')
    shipper_address2 = fields.Char(string='Shipper Address 2', compute='_compute_way_bill_shipper_address2')
    shipper_address3 = fields.Char(string='Shipper Address 3', compute='_compute_way_bill_shipper_address3')
    shipper_city = fields.Char(string='Shipper City', compute='_compute_way_bill_shipper_city')
    receiver_name = fields.Char(string='Receiver Name', compute='_compute_way_bill_receiver_name')
    receiver_address1 = fields.Char(string='Receiver Address 1', compute='_compute_way_bill_receiver_address1')
    receiver_address2 = fields.Char(string='Receiver Address 2', compute='_compute_way_bill_receiver_address2')
    receiver_address3 = fields.Char(string='Receiver Address 3', compute='_compute_way_bill_receiver_address3')
    receiver_city = fields.Char(string='Receiver City', compute='_compute_way_bill_receiver_city')
    status = fields.Char(string='Status', compute='_compute_way_bill_status')
    pod_receiver = fields.Char(string='Pod Receiver', compute='_compute_way_bill_pod_receiver')
    pod_datetime = fields.Char(string='Pod Date', compute='_compute_way_bill_pod_datetime')

    def decode_response(self):
        self.ensure_one()
        return self._json_decode(self.response)

    def _fetch(self, days_before=30):
        # jne, pos, tiki, wahana, jnt, rpx, sap, sicepat, jet, dse, dan first
        carrier_ids = [51, 53, 54, 7, 57, 55, 59, 59, 27, 60, 62, 64]

        delta_time = datetime.now() - timedelta(days=days_before) # Last 30 days
        delta_time = delta_time.strftime('%Y-%m-%d %H:%M:%S') 
        query = [
            '|',
            ('waybill_id.delivered', '=', False),
            ('date_done', '>', delta_time),
            ('delivery_tracking_no', '!=', False),
            ('delivery_tracking_no', 'not ilike', '-'),
            ('carrier_id', 'in', carrier_ids),
        ]
        outs = self.env['stock.picking'].search(query, order='id')
        for out in outs:
            rajaongkir = self.env['rajaongkir.kurir'].search([('delivery_carrier_id', '=', out.carrier_id.id)])
            history = self._get_waybill_history(out.delivery_tracking_no, rajaongkir.name)
            if not history:
                continue
            try:
                delivered = history['rajaongkir']['result']['delivered']
            except:
                delivered = False
            values = {
                'do_id': out.id,
                'so_id': out.sale_id.id,
                'number': out.delivery_tracking_no,
                'delivered': delivered,
                'response': history,
            }
            waybill = out.waybill_id
            if not waybill:
                waybill = self.create(values)

            waybill.response = json.dumps(history, indent=2, ensure_ascii=False)
            waybill.manifest_ids.unlink()
            self.env['airway.bill.manifest'].generate_airway_bill_line(waybill)

    def _get_waybill_history(self, way_bill_number=0, shipper=0):
        headers = {
            'content-type': 'application/x-www-form-urlencoded',
            'key': _key,
        }

        data = {
            'waybill': way_bill_number,
            'courier': shipper,
        }

        response = requests.post(_url, headers=headers, data=data)
        return self._json_decode(response.text)
    
    def _json_decode(self, content):
        try:
            response = json.loads(content)
            return response
        except:
            return False
            
    def _get_history(self, key):
        response = self.decode_response()
        if not response:
            return response
        
        if response.get('raja_ongkir', {}):
            raja_ongkir = response.get('raja_ongkir', {})
        elif response.get('rajaongkir', {}):
            raja_ongkir = response.get('rajaongkir', {})
        result = raja_ongkir.get('result', {})
        result = result or {} # Change to empty dict when result is None
        return result.get(key)

    def _compute_way_bill(self, airway, key, attribute):
        details = airway._get_history('details')
        delivery_status = airway._get_history('delivery_status')
        value = None
        if details and key in details:
            value = details.get(key)
        elif delivery_status and key in delivery_status:
            value = delivery_status.get(key)
        setattr(airway, attribute, value if value else '-')

    def _compute_way_bill_datetime(self):
        for airway in self:
            self._compute_way_bill(airway, 'waybill_date', 'way_bill_date')

    def _compute_way_bill_weight(self):
        for airway in self:
            self._compute_way_bill(airway, 'weight', 'weight')

    def _compute_way_bill_origin(self):
        for airway in self:
            self._compute_way_bill(airway, 'origin', 'origin')

    def _compute_way_bill_destination(self):
        for airway in self:
            self._compute_way_bill(airway, 'destination', 'destination')

    def _compute_way_bill_shipper_name(self):
        for airway in self:
            self._compute_way_bill(airway, 'shippper_name', 'shipper_name')

    def _compute_way_bill_shipper_address1(self):
        for airway in self:
            self._compute_way_bill(airway, 'shipper_address1', 'shipper_address1')

    def _compute_way_bill_shipper_address2(self):
        for airway in self:
            self._compute_way_bill(airway, 'shipper_address2', 'shipper_address2')

    def _compute_way_bill_shipper_address3(self):
        for airway in self:
            self._compute_way_bill(airway, 'shipper_address3', 'shipper_address3')

    def _compute_way_bill_shipper_city(self):
        for airway in self:
            self._compute_way_bill(airway, 'shipper_city', 'shipper_city')

    def _compute_way_bill_receiver_name(self):
        for airway in self:
            self._compute_way_bill(airway, 'receiver_name', 'receiver_name')

    def _compute_way_bill_receiver_address1(self):
        for airway in self:
            self._compute_way_bill(airway, 'receiver_address1', 'receiver_address1')

    def _compute_way_bill_receiver_address2(self):
        for airway in self:
            self._compute_way_bill(airway, 'receiver_address2', 'receiver_address2')

    def _compute_way_bill_receiver_address3(self):
        for airway in self:
            self._compute_way_bill(airway, 'receiver_address3', 'receiver_address3')

    def _compute_way_bill_receiver_city(self):
        for airway in self:
            self._compute_way_bill(airway, 'receiver_city', 'receiver_city')

    def _compute_way_bill_status(self):
        for airway in self:
            self._compute_way_bill(airway, 'status', 'status')

    def _compute_way_bill_pod_receiver(self):
        for airway in self:
            self._compute_way_bill(airway, 'pod_receiver', 'pod_receiver')
                    
    def _compute_way_bill_pod_datetime(self):
        for airway in self:
            details = airway._get_history('delivery_status')
            if details:
                pod_date = details['pod_date']
                pod_time = details['pod_time']
                airway.pod_datetime = pod_date+' '+pod_time
            else:
                airway.pod_datetime = '-'