diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2025-05-23 16:53:24 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2025-05-23 16:53:24 +0700 |
| commit | d0a4c0efbe59afb75790ab55f242a0e1a694f629 (patch) | |
| tree | 9853e5e82fb8dc79a87fbcdbf079cc6515901a7a | |
| parent | ca3455a3054e2953fb8b274ba5a4e65abcf3d257 (diff) | |
PUSH
| -rw-r--r-- | fixco_custom/models/detail_order.py | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/fixco_custom/models/detail_order.py b/fixco_custom/models/detail_order.py index 466544f..146f584 100644 --- a/fixco_custom/models/detail_order.py +++ b/fixco_custom/models/detail_order.py @@ -6,6 +6,9 @@ import json import hmac import base64 from hashlib import sha256 +import logging + +_logger = logging.getLogger(__name__) Request_URI = '/openapi/order/v1/batch-get' ACCESS_KEY = '24bb6a1ec618ec6a' @@ -24,6 +27,7 @@ class DetailOrder(models.Model): ('done', 'Done'), ('failed', 'Failed'), ('already_so', 'SO Already Created'), + ('processing_get_so', 'Processing Get SO'), ], 'Execute Status') sale_id = fields.Many2one('sale.order', 'Sale Order') picking_id = fields.Many2one('stock.picking', 'Picking') @@ -158,6 +162,7 @@ class DetailOrder(models.Model): return order_lines def execute_queue_detail(self): + self.env.cr.execute('SAVEPOINT queue_detail') try: json_data = json.loads(self.detail_order) data = self.prepare_data_so(json_data) @@ -165,46 +170,48 @@ class DetailOrder(models.Model): order_id, order_status, print_info = self.get_order_id_detail() if order_status != 'PENDING_PAYMENT': - if order_status == 'PARTIALLY_PAID' or order_status == 'PAID': + sale_orders = self.env['sale.order'].search([('order_reference', '=', order_id)]) + + if sale_orders: + self.sale_id = sale_orders.id + self.execute_status = 'already_so' + self.env.cr.execute('RELEASE SAVEPOINT queue_detail') + return + + 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 + # First write - minimal data + self.write({ + 'sale_id': sale_order.id, + 'execute_status': 'processing_get_so' # Intermediate state + }) + self.env.cr.commit() # Commit after initial write + + # Process confirmation sale_order.order_reference = order_id sale_order.action_confirm() - - self.picking_id = sale_order.picking_ids[0].id - - self.picking_id.order_reference = order_id - - self.execute_status = 'so_confirm' - else: - sale_orders = self.env['sale.order'].search([('order_reference', '=', order_id)]) - if not sale_orders: - data['order_line'] = order_lines + # Second write - remaining data + self.write({ + 'picking_id': sale_order.picking_ids[0].id, + 'execute_status': 'so_confirm' + }) + sale_order.picking_ids[0].order_reference = order_id + + self.env.cr.commit() # Final commit + self.env.cr.execute('RELEASE SAVEPOINT queue_detail') - sale_order = self.env['sale.order'].create(data) - - self.sale_id = sale_order.id - sale_order.order_reference = order_id - sale_order.action_confirm() - - self.picking_id = sale_order.picking_ids[0].id - self.picking_id.order_reference = order_id - - self.execute_status = 'so_confirm' - else: - self.sale_id = sale_orders.id - self.execute_status = 'already_so' - except Exception as e: - self.write({ - 'message_error': json.dumps({ - 'error': str(e) - }) + self.env.cr.execute('ROLLBACK TO SAVEPOINT queue_detail') + error_msg = str(e) + # Use with_context to prevent automatic recomputation if needed + self.with_context(mail_notrack=True).write({ + 'message_error': json.dumps({'error': error_msg}) }) + self.env.cr.commit() # Commit the error state + _logger.error("Order processing failed for record %s: %s", self.id, error_msg) def sign_request(self): signData = '$'.join(['POST', Request_URI]) + '$' |
