summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMqdd <ahmadmiqdad27@gmail.com>2025-11-28 09:47:44 +0700
committerMqdd <ahmadmiqdad27@gmail.com>2025-11-28 09:47:44 +0700
commit15717173d3774635bdb3838fb0b37cee91e0dcd5 (patch)
tree27c7085c18038f432a3639a297219f36fc7815a9
parent6439ce89ae7c89663d61aed0abb5affc7fb75d23 (diff)
<Miqdad> VCM validate sequencefix_validate_ccm
-rw-r--r--indoteknik_custom/models/stock_picking.py73
1 files changed, 42 insertions, 31 deletions
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index fbcddc5a..900529b9 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -1406,6 +1406,47 @@ class StockPicking(models.Model):
else:
raise UserError('Hanya MD yang bisa Approve')
+ def validate_seq_vcm(self):
+ for picking in self:
+ tg_po = picking.tukar_guling_po_id
+ if not tg_po:
+ continue
+
+ return_type = tg_po.return_type
+ if return_type not in ['retur_po', 'tukar_guling']:
+ continue
+
+ picking_order = []
+ if return_type == 'retur_po':
+ picking_order = ['BU/INPUT', 'BU/PUT']
+ elif return_type == 'tukar_guling':
+ picking_order = ['BU/VRT', 'BU/PRT', 'BU/INPUT', 'BU/PUT']
+
+ related_pickings = self.env['stock.picking'].search([
+ ('tukar_guling_po_id', '=', tg_po.id)
+ ])
+
+ ordered_pickings = []
+ for prefix in picking_order:
+ match = next((p for p in related_pickings if p.name.startswith(prefix)), None)
+ if not match:
+ raise UserError(f"Picking dengan prefix {prefix} belum ada.")
+ ordered_pickings.append(match)
+
+ current_index = -1
+ for idx, p in enumerate(ordered_pickings):
+ if p.id == picking.id:
+ current_index = idx
+ break
+
+ if current_index == -1:
+ raise UserError("Picking ini tidak ditemukan dalam urutan picking yang sesuai.")
+
+ for prev_picking in ordered_pickings[:current_index]:
+ if prev_picking.state != 'done':
+ raise UserError(
+ f"Tidak bisa validasi {picking.name} sebelum {prev_picking.name} divalidasi."
+ )
def button_validate(self):
self.check_invoice_date()
_logger.info("Kode Picking: %s", self.picking_type_id.code)
@@ -1416,37 +1457,7 @@ class StockPicking(models.Model):
group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id
users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])])
active_model = self.env.context.get('active_model')
- if self.tukar_guling_po_id:
- for po in self.tukar_guling_po_id:
- pickings = po.picking_ids.filtered(lambda p: p.return_type == 'tukar_guling')
-
- # Buat mapping picking berdasarkan prefix
- picking_map = {
- 'BU/VRT': None,
- 'BU/PRT': None,
- 'BU/INPUT': None,
- 'BU/PUT': None,
- }
-
- for picking in pickings:
- for prefix in picking_map:
- if picking.name.startswith(prefix):
- picking_map[prefix] = picking
-
- # Cek apakah keempat jenis picking tersedia
- missing = [key for key, val in picking_map.items() if val is None]
- if missing:
- raise UserError(f"Picking untuk tukar guling tidak lengkap: {', '.join(missing)}")
-
- # Cek urutan sesuai aturan: VRT -> PRT -> INPUT -> PUT
- ordered_pickings = [picking_map['BU/VRT'], picking_map['BU/PRT'], picking_map['BU/INPUT'], picking_map['BU/PUT']]
- done_pickings = [p for p in ordered_pickings if p.state == 'done']
-
- for i, picking in enumerate(done_pickings):
- expected = ordered_pickings[i]
- if picking != expected:
- raise UserError("Urutan validasi picking tukar guling tidak sesuai. Harus mengikuti urutan: BU/VRT → BU/PRT → BU/INPUT → BU/PUT")
-
+ self.validate_seq_vcm()
if self.is_so_fiktif == True:
raise UserError("SO Fiktif tidak bisa di validate")
if self.location_id.id == 47 and self.env.user.id not in users_in_group.mapped(