diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2026-01-17 14:21:18 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2026-01-17 14:21:18 +0700 |
| commit | d90a7762d13adf43520ea006a2ab9d3034dfdd15 (patch) | |
| tree | 3c55164135b49e15374344951960bd9d550f4bfe | |
| parent | bd6c4da5e84a1b0aa98a9b41918cd70f836d2b59 (diff) | |
push
| -rwxr-xr-x | fixco_custom/models/stock_picking.py | 296 | ||||
| -rwxr-xr-x | fixco_custom/models/webhook_ginee.py | 2 |
2 files changed, 141 insertions, 157 deletions
diff --git a/fixco_custom/models/stock_picking.py b/fixco_custom/models/stock_picking.py index c72f3a4..3faa5e1 100755 --- a/fixco_custom/models/stock_picking.py +++ b/fixco_custom/models/stock_picking.py @@ -537,11 +537,7 @@ class StockPicking(models.Model): # ============================== # SPLIT ORDER REFERENCE # ============================== - order_refs = [ - ref.strip() - for ref in self.order_reference.split(",") - if ref.strip() - ] + order_refs = self.order_reference.split(",")[0].strip() # API ini WAJIB 1 order per call authorization = self.sign_request(1) @@ -553,80 +549,76 @@ class StockPicking(models.Model): url = "https://api.ginee.com/openapi/logistics/v1/get-shipping-parameter" + payload = { + "orderId": order_refs + } + + response = requests.post( + url, + headers=headers, + data=json.dumps(payload) + ) + + try: + res = response.json() + except Exception: + raise UserError( + "Invalid JSON response from Ginee for order %s" + % order_refs + ) + + if res.get("code") != "SUCCESS": + raise UserError( + "Ginee Error (%s): %s" + % (order_refs, res.get("message")) + ) + + data = res.get("data", {}) + # ============================== - # LOOP PER ORDER ID + # BASIC FIELDS # ============================== - for order_id in order_refs: - payload = { - "orderId": order_id - } - - response = requests.post( - url, - headers=headers, - data=json.dumps(payload) - ) + self.ginee_delivery_type = data.get("deliveryType") + self.ginee_tracking_no = data.get("logisticsTrackingNumber") + self.ginee_invoice_no = data.get("invoiceNumber") - try: - res = response.json() - except Exception: - raise UserError( - "Invalid JSON response from Ginee for order %s" - % order_id - ) + # ============================== + # FIND PROVIDER + # ============================== + provider_id = None + provider_name = None + logistics_type = None - if res.get("code") != "SUCCESS": - raise UserError( - "Ginee Error (%s): %s" - % (order_id, res.get("message")) - ) + for lg in data.get("logistics", []) or []: + details = lg.get("logisticDetailList") or [] + if details: + d = details[0] + provider_id = d.get("logisticsProviderId") + provider_name = d.get("logisticsProviderName") + logistics_type = lg.get("logisticsDeliveryType") + break - data = res.get("data", {}) - - # ============================== - # BASIC FIELDS - # ============================== - self.ginee_delivery_type = data.get("deliveryType") - self.ginee_tracking_no = data.get("logisticsTrackingNumber") - self.ginee_invoice_no = data.get("invoiceNumber") - - # ============================== - # FIND PROVIDER - # ============================== - provider_id = None - provider_name = None - logistics_type = None - - for lg in data.get("logistics", []) or []: - details = lg.get("logisticDetailList") or [] - if details: - d = details[0] - provider_id = d.get("logisticsProviderId") - provider_name = d.get("logisticsProviderName") - logistics_type = lg.get("logisticsDeliveryType") - break - - self.ginee_provider_id = provider_id - self.ginee_provider_name = provider_name - self.ginee_delivery_type = logistics_type or self.ginee_delivery_type - - # ============================== - # PICKUP ADDRESS - # ============================== - addresses = data.get("addresses") or [] - if addresses: - first = addresses[0] - self.ginee_address = first.get("address") - self.ginee_address_id = first.get("addressId") - - times = first.get("pickupTimeList") or [] - if times: - self.ginee_pickup_time_id = times[0].get("pickupTimeId") - - # ============================== - # OPTIONAL: DELAY (ANTI RATE LIMIT) - # ============================== - time.sleep(0.2) + self.ginee_provider_id = provider_id + self.ginee_provider_name = provider_name + self.ginee_delivery_type = logistics_type or self.ginee_delivery_type + + # ============================== + # PICKUP ADDRESS + # ============================== + addresses = data.get("addresses") or [] + if addresses: + first = addresses[0] + self.ginee_address = first.get("address") + self.ginee_address_id = first.get("addressId") + + times = first.get("pickupTimeList") or [] + if times: + self.ginee_pickup_time_id = times[0].get("pickupTimeId") + + # ============================== + # OPTIONAL: DELAY (ANTI RATE LIMIT) + # ============================== + time.sleep(0.2) except Exception as e: raise UserError(_("Error: %s") % str(e)) @@ -829,11 +821,7 @@ class StockPicking(models.Model): # ============================== # SPLIT ORDER IDS # ============================== - order_refs = [ - ref.strip() - for ref in self.order_reference.split(",") - if ref.strip() - ] + order_refs = self.order_reference.split(",")[0].strip() if not order_refs: return False @@ -866,86 +854,82 @@ class StockPicking(models.Model): order_ships = [] + order_data = { + "orderId": order_refs, + "deliveryType": base_shipping["deliveryType"], + } + + dt = base_shipping["deliveryType"] + # ============================== - # BUILD ORDER SHIPS + # PLATFORM RULES # ============================== - for order_id in order_refs: - order_data = { - "orderId": order_id, - "deliveryType": base_shipping["deliveryType"], - } - - dt = base_shipping["deliveryType"] - - # ============================== - # PLATFORM RULES - # ============================== - def add(*keys): - for k in keys: - if base_shipping.get(k): - order_data[k] = base_shipping[k] - - if platform == "SHOPEE": - if dt == "PICK_UP": - add("shippingProvider", "pickupTimeId", "addressId", "address") - elif dt == "DROP_OFF": - add("shippingProvider") - elif dt == "MANUAL_SHIP": - add("shippingProvider", "trackingNo") - - elif platform == "TOKOPEDIA": - if dt in ["PICK_UP", "MANUAL_SHIP"]: - add("shippingProvider", "trackingNo") - elif dt == "DROP_OFF": - add("shippingProvider") - - elif platform == "LAZADA": - if dt == "PICK_UP": - add("shippingProvider", "address", "addressId", "pickupTimeId") - elif dt == "DROP_OFF": - add("shippingProvider", "invoiceNumber") - - elif platform == "TIKTOK": - if dt == "PICK_UP": - order_data.update({ - "shippingProvider": base_shipping["shippingProvider"], - "pickupStartTime": base_shipping["pickupTimeId"] or "", - "pickupEndTime": base_shipping["pickupTimeId"] or "", - }) - elif dt == "DROP_OFF": - add("shippingProvider") - - elif platform == "ZALORA": - if dt == "DROP_OFF": - add("trackingNo", "invoiceNumber") - - elif platform == "AKULAKU": - if dt in ["PICK_UP", "DROP_OFF"]: - add("shippingProvider", "shippingProviderId", "addressId", "address") - elif dt == "MANUAL_SHIP": - add("shippingProvider", "shippingProviderId", "trackingNo") - - elif platform == "BUKALAPAK": - if dt in ["PICK_UP", "DROP_OFF"]: - add("shippingProvider") - elif dt == "MANUAL_SHIP": - add("shippingProvider", "trackingNo") - - elif platform == "BLIBLI": - if dt == "PICK_UP": - add("shippingProvider") - elif dt == "DROP_OFF": - add("shippingProvider", "trackingNo") + def add(*keys): + for k in keys: + if base_shipping.get(k): + order_data[k] = base_shipping[k] - else: - if dt == "PICK_UP": - add("shippingProvider", "pickupTimeId", "addressId", "address") - elif dt == "DROP_OFF": - add("shippingProvider") - elif dt == "MANUAL_SHIP": - add("shippingProvider", "trackingNo") - - order_ships.append(order_data) + if platform == "SHOPEE": + if dt == "PICK_UP": + add("shippingProvider", "pickupTimeId", "addressId", "address") + elif dt == "DROP_OFF": + add("shippingProvider") + elif dt == "MANUAL_SHIP": + add("shippingProvider", "trackingNo") + + elif platform == "TOKOPEDIA": + if dt in ["PICK_UP", "MANUAL_SHIP"]: + add("shippingProvider", "trackingNo") + elif dt == "DROP_OFF": + add("shippingProvider") + + elif platform == "LAZADA": + if dt == "PICK_UP": + add("shippingProvider", "address", "addressId", "pickupTimeId") + elif dt == "DROP_OFF": + add("shippingProvider", "invoiceNumber") + + elif platform == "TIKTOK": + if dt == "PICK_UP": + order_data.update({ + "shippingProvider": base_shipping["shippingProvider"], + "pickupStartTime": base_shipping["pickupTimeId"] or "", + "pickupEndTime": base_shipping["pickupTimeId"] or "", + }) + elif dt == "DROP_OFF": + add("shippingProvider") + + elif platform == "ZALORA": + if dt == "DROP_OFF": + add("trackingNo", "invoiceNumber") + + elif platform == "AKULAKU": + if dt in ["PICK_UP", "DROP_OFF"]: + add("shippingProvider", "shippingProviderId", "addressId", "address") + elif dt == "MANUAL_SHIP": + add("shippingProvider", "shippingProviderId", "trackingNo") + + elif platform == "BUKALAPAK": + if dt in ["PICK_UP", "DROP_OFF"]: + add("shippingProvider") + elif dt == "MANUAL_SHIP": + add("shippingProvider", "trackingNo") + + elif platform == "BLIBLI": + if dt == "PICK_UP": + add("shippingProvider") + elif dt == "DROP_OFF": + add("shippingProvider", "trackingNo") + + else: + if dt == "PICK_UP": + add("shippingProvider", "pickupTimeId", "addressId", "address") + elif dt == "DROP_OFF": + add("shippingProvider") + elif dt == "MANUAL_SHIP": + add("shippingProvider", "trackingNo") + + order_ships.append(order_data) # ============================== # FINAL PAYLOAD (1 CALL ONLY) diff --git a/fixco_custom/models/webhook_ginee.py b/fixco_custom/models/webhook_ginee.py index 444306b..fb1bbf6 100755 --- a/fixco_custom/models/webhook_ginee.py +++ b/fixco_custom/models/webhook_ginee.py @@ -20,7 +20,7 @@ class WebhookGinee(models.Model): ], 'Execute Status') def process_queue_item(self, limit=100, max_exec_time=30): - domain = [('execute_status', '=', False)] + domain = [('execute_status', '=', False), ('json_ginee', 'not ilike', 'BLIBLI_ID')] records = self.search(domain, order='create_date asc', limit=limit) start_time = time.time() for rec in records: |
