summaryrefslogtreecommitdiff
path: root/fixco_custom/models/detail_order.py
diff options
context:
space:
mode:
Diffstat (limited to 'fixco_custom/models/detail_order.py')
-rwxr-xr-xfixco_custom/models/detail_order.py229
1 files changed, 138 insertions, 91 deletions
diff --git a/fixco_custom/models/detail_order.py b/fixco_custom/models/detail_order.py
index 41a5466..674f11a 100755
--- a/fixco_custom/models/detail_order.py
+++ b/fixco_custom/models/detail_order.py
@@ -5,6 +5,7 @@ import requests
import json
import hmac
import base64
+from datetime import datetime
from hashlib import sha256
import logging
@@ -138,6 +139,27 @@ class DetailOrder(models.Model):
except Exception as e:
raise UserError(_("Error extracting order ID: %s") % str(e))
+ # def process_queue_item_detail(self, limit=100):
+ # domain = [
+ # ('execute_status', '=', 'detail_order'),
+ # '!',
+ # '|',
+ # ('json_ginee', 'like', '"orderStatus": "PENDING_PAYMENT"'),
+ # ('json_ginee', 'like', '"channel":"BLIBLI_ID"'),
+ # ]
+
+ # records = self.search(domain, order='create_date asc', limit=limit)
+
+ # for i, rec in enumerate(records, 1):
+ # try:
+ # rec.execute_queue_detail()
+ # if i % 10 == 0:
+ # self.env.cr.commit()
+ # except Exception as e:
+ # _logger.error("Failed to process record %s: %s", rec.id, str(e))
+ # self.env.cr.rollback()
+
+ # self.env.cr.commit()
def process_queue_item_detail(self, limit=100):
domain = [
('execute_status', '=', 'detail_order'),
@@ -147,15 +169,31 @@ class DetailOrder(models.Model):
('json_ginee', 'like', '"channel":"BLIBLI_ID"'),
]
- records = self.search(domain, order='create_date desc', limit=limit)
+ records = self.search(domain, order='create_date asc', limit=limit)
for i, rec in enumerate(records, 1):
try:
rec.execute_queue_detail()
+
+ # ⏳ throttle API
+ time.sleep(0.8)
+
if i % 10 == 0:
self.env.cr.commit()
+
except Exception as e:
- _logger.error("Failed to process record %s: %s", rec.id, str(e))
+ msg = str(e)
+
+ # 🎯 khusus rate limit
+ if '429' in msg or 'SERVICE_BUSY' in msg:
+ _logger.warning(
+ "Rate limit hit. Sleep & retry later. Record ID %s", rec.id
+ )
+ self.env.cr.rollback()
+ time.sleep(5 + random.uniform(1, 3))
+ break # STOP loop, jangan maksa
+
+ _logger.error("Failed record %s: %s", rec.id, msg)
self.env.cr.rollback()
self.env.cr.commit()
@@ -283,96 +321,105 @@ class DetailOrder(models.Model):
# First check if a sale order with this reference already exists
existing_order = self.env['sale.order'].search([('order_reference', '=', order_id)], limit=1)
- if order_status == 'CANCELLED':
- external_order_id = json_data.get('data', [{}])[0].get('externalOrderId')
- order_id = json_data.get('data', [{}])[0].get('orderId')
-
- # Try to find existing SO
- existing_order = self.env['sale.order'].search([
- '|',
- ('invoice_mp', '=', external_order_id),
- ('client_order_ref', '=', order_id)
- ], limit=1)
-
- if existing_order:
- if existing_order.state == 'sale':
- # Cancel all pickings linked to this order
- for picking in existing_order.picking_ids:
- if picking.state not in ['cancel', 'done']:
- picking.action_cancel()
- self.sale_id = existing_order.id
- self.execute_status = 'cancelled_so_picking'
- existing_order.action_cancel()
- else:
- existing_order.action_cancel()
+ create_at_str = json_data.get('data', [{}])[0].get('createAt')
+
+ if create_at_str:
+ create_at = datetime.strptime(create_at_str, "%Y-%m-%dT%H:%M:%SZ")
+
+ cutoff = datetime(2026, 1, 1) # 1 Jan 2026 UTC
+
+ if create_at >= cutoff:
+
+ if order_status == 'CANCELLED':
+ external_order_id = json_data.get('data', [{}])[0].get('externalOrderId')
+ order_id = json_data.get('data', [{}])[0].get('orderId')
+
+ # Try to find existing SO
+ existing_order = self.env['sale.order'].search([
+ '|',
+ ('invoice_mp', '=', external_order_id),
+ ('client_order_ref', '=', order_id)
+ ], limit=1)
+
+ if existing_order:
+ if existing_order.state == 'sale':
+ # Cancel all pickings linked to this order
+ for picking in existing_order.picking_ids:
+ if picking.state not in ['cancel', 'done']:
+ picking.action_cancel()
+ self.sale_id = existing_order.id
+ self.execute_status = 'cancelled_so_picking'
+ existing_order.action_cancel()
+ else:
+ existing_order.action_cancel()
+ self.sale_id = existing_order.id
+ self.execute_status = 'cancelled_so'
+
+ else:
+ # If no existing SO, create one, then cancel
+ data = self.prepare_data_so(json_data)
+ order_lines, product_not_found = self.prepare_data_so_line(json_data)
+ data['order_line'] = order_lines
+ sale_order = self.env['sale.order'].create(data)
+
+ self.sale_id = sale_order.id
+ sale_order.order_reference = order_id
+ sale_order.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
+ sale_order.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
+
+ sale_order.action_cancel()
+ self.execute_status = 'cancelled_so_created'
+
+ return
+
+ if existing_order:
+ # If order already exists, just update the references
self.sale_id = existing_order.id
- self.execute_status = 'cancelled_so'
-
- else:
- # If no existing SO, create one, then cancel
- data = self.prepare_data_so(json_data)
- order_lines, product_not_found = self.prepare_data_so_line(json_data)
- data['order_line'] = order_lines
- sale_order = self.env['sale.order'].create(data)
-
- self.sale_id = sale_order.id
- sale_order.order_reference = order_id
- sale_order.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
- sale_order.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
-
- sale_order.action_cancel()
- self.execute_status = 'cancelled_so_created'
-
- return
-
- if existing_order:
- # If order already exists, just update the references
- self.sale_id = existing_order.id
- self.execute_status = 'already_so'
- return # Exit early since we don't need to create anything
-
- if order_status != 'PENDING_PAYMENT':
- if order_status in ('PARTIALLY_PAID', 'PAID'):
- data['order_line'] = order_lines
- sale_order = self.env['sale.order'].create(data)
-
- self.sale_id = sale_order.id
- sale_order.order_reference = order_id
- sale_order.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
- sale_order.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
- if not product_not_found:
- sale_order.action_confirm()
- # self.picking_id = sale_order.picking_ids[0].id
- # self.picking_id.order_reference = order_id
- # self.picking_id.invoice_mp = sale_order.invoice_mp
- # self.picking_id.carrier = sale_order.carrier
- # self.picking_id.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
- # self.picking_id.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
-
- self.execute_status = 'so_confirm'
- else:
- self.execute_status = 'so_draft'
- else:
- # For other statuses, create new order only if it doesn't exist
- data['order_line'] = order_lines
- sale_order = self.env['sale.order'].create(data)
-
- self.sale_id = sale_order.id
- sale_order.order_reference = order_id
- sale_order.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
- sale_order.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
- if not product_not_found:
- sale_order.action_confirm()
- # self.picking_id = sale_order.picking_ids[0].id
- # self.picking_id.order_reference = order_id
- # self.picking_id.invoice_mp = sale_order.invoice_mp
- # self.picking_id.carrier = sale_order.carrier
- # self.picking_id.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
- # self.picking_id.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
-
- self.execute_status = 'so_confirm'
- else:
- self.execute_status = 'so_draft'
+ self.execute_status = 'already_so'
+ return # Exit early since we don't need to create anything
+
+ if order_status != 'PENDING_PAYMENT':
+ if order_status in ('PARTIALLY_PAID', 'PAID'):
+ data['order_line'] = order_lines
+ sale_order = self.env['sale.order'].create(data)
+
+ self.sale_id = sale_order.id
+ sale_order.order_reference = order_id
+ sale_order.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
+ sale_order.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
+ if not product_not_found:
+ sale_order.action_confirm()
+ # self.picking_id = sale_order.picking_ids[0].id
+ # self.picking_id.order_reference = order_id
+ # self.picking_id.invoice_mp = sale_order.invoice_mp
+ # self.picking_id.carrier = sale_order.carrier
+ # self.picking_id.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
+ # self.picking_id.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
+
+ self.execute_status = 'so_confirm'
+ else:
+ self.execute_status = 'so_draft'
+ else:
+ # For other statuses, create new order only if it doesn't exist
+ data['order_line'] = order_lines
+ sale_order = self.env['sale.order'].create(data)
+
+ self.sale_id = sale_order.id
+ sale_order.order_reference = order_id
+ sale_order.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
+ sale_order.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
+ if not product_not_found:
+ sale_order.action_confirm()
+ # self.picking_id = sale_order.picking_ids[0].id
+ # self.picking_id.order_reference = order_id
+ # self.picking_id.invoice_mp = sale_order.invoice_mp
+ # self.picking_id.carrier = sale_order.carrier
+ # self.picking_id.address = json_data.get('data', [{}])[0].get('shippingAddressInfo', []).get('fullAddress', [])
+ # self.picking_id.note_by_buyer = json_data.get('data', [{}])[0].get('extraInfo', []).get('noteByBuyer', [])
+
+ self.execute_status = 'so_confirm'
+ else:
+ self.execute_status = 'so_draft'
except Exception as e:
self.write({