summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-08-21 19:07:58 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-08-21 19:07:58 +0700
commit4b549234856b810bd99f8b1e18e01da90ccdc1e1 (patch)
tree76ba931388f2e8a9e8dd8531b07663b05d0d32e6
parent75ce4a99465a03b495f6418fb65f68efe7d6c504 (diff)
fix bug percent pie
-rwxr-xr-xindoteknik_custom/models/sale_order.py66
1 files changed, 29 insertions, 37 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 9a6f314d..ffb53dce 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -416,51 +416,43 @@ class SaleOrder(models.Model):
else:
order.payment_state_custom = 'partial'
- @api.depends('order_line.move_ids.state',
- 'order_line.move_ids.reserved_availability',
- 'order_line.move_ids.quantity_done')
+ @api.depends(
+ 'order_line.move_ids.state',
+ 'order_line.move_ids.reserved_availability',
+ 'order_line.move_ids.quantity_done',
+ 'order_line.move_ids.picking_type_id'
+ )
def _compute_reserved_delivered_pie(self):
for order in self:
- total_qty = sum(order.order_line.mapped('product_uom_qty'))
+ order_qty = sum(order.order_line.mapped('product_uom_qty')) or 0.0
reserved_qty = delivered_qty = 0.0
- if total_qty > 0:
- for line in order.order_line:
- order_qty = line.product_uom_qty or 0.0
- if not order_qty:
- continue
+ if order_qty > 0:
+ # Kumpulin semua moves dari order
+ all_moves = order.order_line.mapped('move_ids')
- for move in line.move_ids:
- if move.picking_type_id.code == 'internal':
- if move.state != 'done':
- # PICK belum done → qty reserved
- reserved_qty += move.reserved_availability or 0.0
- else:
- # PICK done → qty_done masih dianggap reserved (masuk BU/OUT)
- reserved_qty += move.quantity_done or 0.0
-
- elif move.state == 'done':
- # OUT done (customer terima) → delivered
- if move.location_dest_id.usage == 'customer':
- delivered_qty += move.quantity_done
- # sekaligus kurangi reserved (karena udah terkirim)
- reserved_qty -= move.quantity_done
- # Return dari customer
- elif move.location_id.usage == 'customer':
- delivered_qty -= move.quantity_done
- reserved_qty += move.quantity_done # balik ke reserved
-
- # clamp jangan sampai minus
- reserved_qty = max(reserved_qty, 0)
- delivered_qty = max(delivered_qty, 0)
+ for move in all_moves:
+ # --- CASE 1: Move belum selesai ---
+ if move.state not in ('done', 'cancel'):
+ # Reserved qty hanya dari move yang belum selesai
+ reserved_qty += move.reserved_availability or 0.0
+ continue
- order.reserved_percent = (reserved_qty / total_qty) * 100
- order.delivered_percent = (delivered_qty / total_qty) * 100
- order.unreserved_percent = 100 - order.reserved_percent - order.delivered_percent
- else:
- order.reserved_percent = order.delivered_percent = order.unreserved_percent = 0
+ # --- CASE 2: Move sudah done ---
+ if move.location_dest_id.usage == 'customer':
+ # Barang dikirim ke customer
+ delivered_qty += move.quantity_done or 0.0
+ elif move.location_id.usage == 'customer':
+ # Barang balik dari customer (retur)
+ delivered_qty -= move.quantity_done or 0.0
+ # Clamp supaya delivered gak minus
+ delivered_qty = max(delivered_qty, 0)
+ # Hitung persen
+ order.reserved_percent = min((reserved_qty / order_qty) * 100, 100) if order_qty else 0
+ order.delivered_percent = min((delivered_qty / order_qty) * 100, 100) if order_qty else 0
+ order.unreserved_percent = max(100 - order.reserved_percent - order.delivered_percent, 0)
def _has_ccm(self):
if self.id: