summaryrefslogtreecommitdiff
path: root/fixco_custom
diff options
context:
space:
mode:
Diffstat (limited to 'fixco_custom')
-rw-r--r--fixco_custom/models/detail_order.py69
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]) + '$'