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 = '-'