diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2025-08-20 10:04:10 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2025-08-20 10:04:10 +0700 |
| commit | 1d44c04f3ec25d3adc19eb8e34589c6461ef8a66 (patch) | |
| tree | 67628db6ea9a65baef5372d8a8760a20ac0df99c /indoteknik_custom/models/sale_order_line.py | |
| parent | c225119cb9bdcee03ca9706ec58dfceb717b5027 (diff) | |
fix bug percentpie retur
Diffstat (limited to 'indoteknik_custom/models/sale_order_line.py')
| -rw-r--r-- | indoteknik_custom/models/sale_order_line.py | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index 2a00bac0..2406995d 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -58,31 +58,39 @@ class SaleOrderLine(models.Model): delivered_percent = fields.Float(string="Delivered %", digits=(16, 2), compute="_compute_reserved_delivered_pie", store=False) unreserved_percent = fields.Float(string="Unreserved %", digits=(16, 2), compute="_compute_reserved_delivered_pie", store=False) - @api.depends('move_ids') + @api.depends('move_ids.state', 'move_ids.reserved_availability', 'move_ids.quantity_done') def _compute_reserved_delivered_pie(self): for line in self: order_qty = line.product_uom_qty or 0.0 reserved_qty = delivered_qty = 0.0 if order_qty > 0: - # Reserved: hanya dari BU/PICK yang masih aktif - pick_moves = line.move_ids.filtered( - lambda m: m.picking_type_id.code == 'internal' and m.state not in ('done', 'cancel') - ) - reserved_qty = sum(pick_moves.mapped('reserved_availability')) - - # Delivered: hanya dari BU/OUT yang sudah done - out_moves = line.move_ids.filtered( - lambda m: m.picking_type_id.code == 'outgoing' and m.state == 'done' - ) - delivered_qty = sum(out_moves.mapped('quantity_done')) - + for move in line.move_ids: + if move.state != 'done': + # Reserve qty (hanya dari picking internal yang belum selesai) + if move.picking_type_id.code == 'internal': + reserved_qty += move.reserved_availability or 0.0 + continue + + # Kalau sudah done → cek lokasi + if move.location_dest_id.usage == 'customer': + # Barang keluar → tambah delivered + delivered_qty += move.quantity_done + elif move.location_id.usage == 'customer': + # Barang balik dari customer (retur) → kurangi delivered + delivered_qty -= move.quantity_done + + # Jangan sampai delivered minus + delivered_qty = max(delivered_qty, 0) + + # Hitung persentase line.reserved_percent = (reserved_qty / order_qty) * 100 if order_qty else 0 line.delivered_percent = (delivered_qty / order_qty) * 100 if order_qty else 0 line.unreserved_percent = 100 - line.reserved_percent - line.delivered_percent + def _get_outgoing_incoming_moves(self): outgoing_moves = self.env['stock.move'] incoming_moves = self.env['stock.move'] |
