diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2025-08-21 19:07:58 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2025-08-21 19:07:58 +0700 |
| commit | 4b549234856b810bd99f8b1e18e01da90ccdc1e1 (patch) | |
| tree | 76ba931388f2e8a9e8dd8531b07663b05d0d32e6 | |
| parent | 75ce4a99465a03b495f6418fb65f68efe7d6c504 (diff) | |
fix bug percent pie
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 66 |
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: |
