diff options
| -rw-r--r-- | indoteknik_custom/models/tukar_guling.py | 87 |
1 files changed, 56 insertions, 31 deletions
diff --git a/indoteknik_custom/models/tukar_guling.py b/indoteknik_custom/models/tukar_guling.py index 99a74505..f7fc0e0d 100644 --- a/indoteknik_custom/models/tukar_guling.py +++ b/indoteknik_custom/models/tukar_guling.py @@ -2,6 +2,7 @@ from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError import logging from datetime import datetime +from collections import defaultdict _logger = logging.getLogger(__name__) @@ -372,10 +373,10 @@ class TukarGuling(models.Model): if vals.get('operations'): picking = self.env['stock.picking'].browse(vals['operations']) - if picking.origin: - vals['origin'] = picking.origin + if picking.so_num: + vals['origin'] = picking.so_num # Find matching SO - so = self.env['sale.order'].search([('name', '=', picking.origin)], limit=1) + so = self.env['sale.order'].search([('name', '=', picking.so_num)], limit=1) if so: vals['origin_so'] = so.id if picking.partner_id: @@ -425,17 +426,13 @@ class TukarGuling(models.Model): if not self.return_type: raise UserError("Return Type harus diisi!") - # if operasi == 30 and self.operations.linked_manual_bu_out.state == 'done': - # raise UserError("❌ Tidak bisa retur BU/PICK karena BU/OUT sudah done") if operasi == 30 and pp == 'tukar_guling': raise UserError("❌ BU/PICK tidak boleh di retur tukar guling") - # else: - # _logger.info("hehhe") if 'operations' in vals and not vals.get('origin'): picking = self.env['stock.picking'].browse(vals['operations']) - if picking.origin: - vals['origin'] = picking.origin + if picking.so_num: + vals['origin'] = picking.so_num return super(TukarGuling, self).write(vals) @@ -498,8 +495,6 @@ class TukarGuling(models.Model): ('state', '!=', 'cancel'), ], limit=1) - # if existing_tukar_guling: - # raise UserError("BU ini sudah pernah diretur oleh dokumen %s." % existing_tukar_guling.name) picking = self.operations if picking.picking_type_id.id == 30 and self.return_type == 'tukar_guling': raise UserError("❌ BU/PICK tidak boleh di retur tukar guling") @@ -510,8 +505,6 @@ class TukarGuling(models.Model): linked_bu_out = picking.linked_manual_bu_out if linked_bu_out and linked_bu_out.state == 'done': raise UserError("❌ Tidak bisa retur BU/PICK karena BU/OUT suda Done!") - # if self._is_already_returned(self.operations): - # raise UserError("BU ini sudah pernah diretur oleh dokumen lain.") if self.operations.picking_type_id.id == 29: # Cek apakah ada BU/PICK di origin @@ -521,16 +514,30 @@ class TukarGuling(models.Model): ('picking_type_id', '=', 30), ('state', '!=', 'cancel') ]) > 0 - if has_bu_pick: - for line in self.line_ids: - mapping_lines = self.mapping_koli_ids.filtered(lambda x: x.product_id == line.product_id) - total_qty = sum(l.qty_return for l in mapping_lines) - if total_qty != line.product_uom_qty: - raise UserError( - _("Qty di Koli tidak sesuai dengan qty retur untuk produk %s") % line.product_id.display_name - ) - # self._check_invoice_on_retur_so() + for record in self: + # Step 1: Hitung total qty per produk dari line_ids + product_qty_map = defaultdict(float) + for line in record.line_ids: + product_qty_map[line.product_id] += line.product_uom_qty + + # Step 2: Cek mapping koli + for product, total_line_qty in product_qty_map.items(): + mapping_lines = record.mapping_koli_ids.filtered(lambda x: x.product_id == product) + total_mapping_qty = sum(l.qty_return for l in mapping_lines) + + if total_mapping_qty != total_line_qty: + raise UserError( + _("Qty di Koli tidak sesuai dengan qty retur untuk produk %s") % product.display_name + ) + # if has_bu_pick: + # for line in self.line_ids: + # mapping_lines = self.mapping_koli_ids.filtered(lambda x: x.product_id == line.product_id) + # total_qty = sum(l.qty_return for l in mapping_lines) + # if total_qty != line.product_uom_qty: + # raise UserError( + # _("Qty di Koli tidak sesuai dengan qty retur untuk produk %s") % line.product_id.display_name + # ) self._validate_product_lines() if self.state != 'draft': @@ -621,13 +628,28 @@ class TukarGuling(models.Model): ]) > 0 if has_bu_pick: - for line in self.line_ids: - mapping_lines = self.mapping_koli_ids.filtered(lambda x: x.product_id == line.product_id) - total_qty = sum(l.qty_return for l in mapping_lines) - if total_qty != line.product_uom_qty: - raise UserError( - _("Qty di Koli tidak sesuai dengan qty retur untuk produk %s") % line.product_id.display_name - ) + for record in self: + # Step 1: Hitung total qty per produk dari line_ids + product_qty_map = defaultdict(float) + for line in record.line_ids: + product_qty_map[line.product_id] += line.product_uom_qty + + # Step 2: Cek mapping koli + for product, total_line_qty in product_qty_map.items(): + mapping_lines = record.mapping_koli_ids.filtered(lambda x: x.product_id == product) + total_mapping_qty = sum(l.qty_return for l in mapping_lines) + + if total_mapping_qty != total_line_qty: + raise UserError( + _("Qty di Koli tidak sesuai dengan qty retur untuk produk %s") % product.display_name + ) + # for line in self.line_ids: + # mapping_lines = self.mapping_koli_ids.filtered(lambda x: x.product_id == line.product_id) + # total_qty = sum(l.qty_return for l in mapping_lines) + # if total_qty != line.product_uom_qty: + # raise UserError( + # _("Qty di Koli tidak sesuai dengan qty retur untuk produk %s") % line.product_id.display_name + # ) if operasi == 30 and self.operations.linked_manual_bu_out.state == 'done': raise UserError("❌ Tidak bisa retur BU/PICK karena BU/OUT sudah done") @@ -737,14 +759,17 @@ class TukarGuling(models.Model): if mapping_koli and record.operations.picking_type_id.id == 29: for prod in mapping_koli.mapped('product_id'): qty_total = sum(mk.qty_return for mk in mapping_koli.filtered(lambda m: m.product_id == prod)) + if qty_total == 0: + continue move = bu_out.move_lines.filtered(lambda m: m.product_id == prod) if not move: raise UserError(f"Move BU/OUT tidak ditemukan untuk produk {prod.display_name}") srt_return_lines.append((0, 0, { 'product_id': prod.id, 'quantity': qty_total, - 'move_id': move.id, + 'move_id': move[0].id, })) + _logger.info(f"📟 SRT line: {prod.display_name} | qty={qty_total}") elif not mapping_koli and record.operations.picking_type_id.id == 29: @@ -1034,4 +1059,4 @@ class TukarGulingMappingKoli(models.Model): for rec in self: if rec.tukar_guling_id and rec.tukar_guling_id.state not in ['draft', 'cancel']: raise UserError("Tidak bisa menghapus Mapping Koli karena status Tukar Guling bukan Draft atau Cancel.") - return super(TukarGulingMappingKoli, self).unlink()
\ No newline at end of file + return super(TukarGulingMappingKoli, self).unlink() |
