diff options
Diffstat (limited to 'fixco_custom/models/detail_order.py')
| -rwxr-xr-x | fixco_custom/models/detail_order.py | 229 |
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({ |
