summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_custom/models/tukar_guling.py87
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()