diff options
Diffstat (limited to 'indoteknik_custom/models')
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 73 |
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( |
