From e5970151e77ce564cd451ecfc3075627965c7b7b Mon Sep 17 00:00:00 2001 From: Mqdd Date: Wed, 26 Nov 2025 09:42:48 +0700 Subject: Fix ccm --- indoteknik_custom/models/tukar_guling.py | 87 ++++++++++++++++++++------------ 1 file 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() -- cgit v1.2.3 From ebde9eb98fac5b67a788103cac8f96c05ccd4e47 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Wed, 26 Nov 2025 09:52:00 +0700 Subject: ccm origin --- indoteknik_custom/models/tukar_guling.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indoteknik_custom/models/tukar_guling.py b/indoteknik_custom/models/tukar_guling.py index f7fc0e0d..f31c68d0 100644 --- a/indoteknik_custom/models/tukar_guling.py +++ b/indoteknik_custom/models/tukar_guling.py @@ -92,7 +92,7 @@ class TukarGuling(models.Model): def _compute_origin_so(self): for rec in self: rec.origin_so = False - origin_str = rec.origin or rec.operations.origin + origin_str = rec.operations.so_num if origin_str: so = self.env['sale.order'].search([('name', '=', origin_str)], limit=1) rec.origin_so = so.id if so else False @@ -373,10 +373,10 @@ class TukarGuling(models.Model): if vals.get('operations'): picking = self.env['stock.picking'].browse(vals['operations']) - if picking.so_num: - vals['origin'] = picking.so_num + if picking.origin: + vals['origin'] = picking.origin # Find matching SO - so = self.env['sale.order'].search([('name', '=', picking.so_num)], limit=1) + so = self.env['sale.order'].search([('name', '=', picking.origin)], limit=1) if so: vals['origin_so'] = so.id if picking.partner_id: @@ -431,8 +431,8 @@ class TukarGuling(models.Model): if 'operations' in vals and not vals.get('origin'): picking = self.env['stock.picking'].browse(vals['operations']) - if picking.so_num: - vals['origin'] = picking.so_num + if picking.origin: + vals['origin'] = picking.origin return super(TukarGuling, self).write(vals) -- cgit v1.2.3