From 03bceb0f2641c1f7303dffcf0dcbc855c70cffb3 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Mon, 9 Jun 2025 12:59:54 +0700 Subject: fix commitment date kosong --- indoteknik_custom/models/sale_order.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 705d16ef..565e8a19 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -2109,11 +2109,15 @@ class SaleOrder(models.Model): ], limit=1) picking_in = stock_move.picking_id result_date = picking_in.date_done if picking_in else None - if result_date: + + if result_date and eta and isinstance(eta, (datetime.date, datetime.datetime)): status = "Early" if result_date < eta else "Delay" result_date_str = result_date.strftime('%m/%d/%Y') eta_str = eta.strftime('%m/%d/%Y') order.ready_to_ship_status_detail = f"Expected: {eta_str} | Realtime: {result_date_str} | {status}" + elif not eta: + # If eta is missing or False, treat as 'On Track' or you may choose different logic + order.ready_to_ship_status_detail = "On Track" else: order.ready_to_ship_status_detail = "On Track" else: -- cgit v1.2.3 From e577c31c748d66b102362af35a33984b9b28edd4 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 9 Jun 2025 15:51:28 +0700 Subject: fix bug cant open so --- indoteknik_custom/models/sale_order.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 565e8a19..eab4f2f3 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -2092,7 +2092,7 @@ class SaleOrder(models.Model): # @api.depends('commitment_date') def _compute_ready_to_ship_status_detail(self): for order in self: - eta = order.commitment_date + eta = order.commitment_date if order.commitment_date else None match_lines = self.env['purchase.order.sales.match'].search([ ('sale_id', '=', order.id) ]) @@ -2109,9 +2109,10 @@ class SaleOrder(models.Model): ], limit=1) picking_in = stock_move.picking_id result_date = picking_in.date_done if picking_in else None - - if result_date and eta and isinstance(eta, (datetime.date, datetime.datetime)): - status = "Early" if result_date < eta else "Delay" + if result_date: + status = "Delay" + if result_date and eta and result_date < eta: + status = "Early" result_date_str = result_date.strftime('%m/%d/%Y') eta_str = eta.strftime('%m/%d/%Y') order.ready_to_ship_status_detail = f"Expected: {eta_str} | Realtime: {result_date_str} | {status}" -- cgit v1.2.3 From 5c76eb43188de9a09380dc43dcc19120b6ebfc84 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 10 Jun 2025 09:24:25 +0700 Subject: add kanban to manufactures --- indoteknik_custom/views/x_manufactures.xml | 40 +++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/indoteknik_custom/views/x_manufactures.xml b/indoteknik_custom/views/x_manufactures.xml index 01e90a1e..02061251 100755 --- a/indoteknik_custom/views/x_manufactures.xml +++ b/indoteknik_custom/views/x_manufactures.xml @@ -3,7 +3,7 @@ Manufacture x_manufactures - tree,form + kanban,tree,form

Add Manufactures! @@ -11,6 +11,44 @@ + + Manufactures Kanban + x_manufactures + + + + + + + + +

+
+ Logo + No Logo +
+
+ +
+ + + +
+
+ +
+
+
+ + + +
+
+ Manufactures x_manufactures -- cgit v1.2.3 From 05dafe1ab837cac8992d1dc6c012a26bce88c15c Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 10 Jun 2025 10:36:45 +0700 Subject: push code apit --- indoteknik_custom/models/sale_order.py | 49 +++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index eab4f2f3..baa8207f 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -2091,11 +2091,22 @@ class SaleOrder(models.Model): # @api.depends('commitment_date') def _compute_ready_to_ship_status_detail(self): + def is_empty(val): + """Helper untuk cek data kosong yang umum di Odoo.""" + return val is None or val == "" or val == [] or val == {} + for order in self: - eta = order.commitment_date if order.commitment_date else None + order.ready_to_ship_status_detail = 'On Track' # Default value + + # Skip if no commitment date + if is_empty(order.commitment_date): + continue + + eta = order.commitment_date match_lines = self.env['purchase.order.sales.match'].search([ ('sale_id', '=', order.id) ]) + if match_lines: for match in match_lines: po = match.purchase_order_id @@ -2104,25 +2115,31 @@ class SaleOrder(models.Model): ('order_id', '=', po.id), ('product_id', '=', product.id) ], limit=1) + + if is_empty(po_line): + continue + stock_move = self.env['stock.move'].search([ ('purchase_line_id', '=', po_line.id) ], limit=1) + + if is_empty(stock_move) or is_empty(stock_move.picking_id): + continue + picking_in = stock_move.picking_id - result_date = picking_in.date_done if picking_in else None - if result_date: - status = "Delay" - if result_date and eta and result_date < eta: - status = "Early" - result_date_str = result_date.strftime('%m/%d/%Y') - eta_str = eta.strftime('%m/%d/%Y') - order.ready_to_ship_status_detail = f"Expected: {eta_str} | Realtime: {result_date_str} | {status}" - elif not eta: - # If eta is missing or False, treat as 'On Track' or you may choose different logic - order.ready_to_ship_status_detail = "On Track" - else: - order.ready_to_ship_status_detail = "On Track" - else: - order.ready_to_ship_status_detail = 'On Track' + result_date = picking_in.date_done + + if is_empty(result_date): + continue + + try: + if result_date < eta: + order.ready_to_ship_status_detail = f"Early (Actual: {result_date.strftime('%m/%d/%Y')})" + else: + order.ready_to_ship_status_detail = f"Delay (Actual: {result_date.strftime('%m/%d/%Y')})" + except Exception as e: + _logger.error(f"Error computing ready to ship status: {str(e)}") + continue def write(self, vals): -- cgit v1.2.3