diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-07-04 17:14:41 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-07-04 17:14:41 +0700 |
| commit | 43b88a8d7814281e4e20c3a22c0c1780e4caf54e (patch) | |
| tree | cb92ace2654a702a98ab4e9c7cfd453f22622b8c | |
| parent | 1118c1c0762ff0ad98bb8d6e64467b32635dadea (diff) | |
<miqdad> tukar guling po (-) sequence
| -rw-r--r-- | indoteknik_custom/models/tukar_guling_po.py | 173 |
1 files changed, 81 insertions, 92 deletions
diff --git a/indoteknik_custom/models/tukar_guling_po.py b/indoteknik_custom/models/tukar_guling_po.py index 4ed363cf..92a58d21 100644 --- a/indoteknik_custom/models/tukar_guling_po.py +++ b/indoteknik_custom/models/tukar_guling_po.py @@ -25,7 +25,7 @@ class TukarGulingPO(models.Model): 'stock.picking', string='Operations', domain=[ - ('picking_type_id.id', 'in', [75, 32]), + ('picking_type_id.id', 'in', [75, 28]), ('state', '=', 'done') ],help='Nomor BU INPUT atau BU PUT' ) @@ -224,7 +224,7 @@ class TukarGulingPO(models.Model): return new_record def write(self, vals): - if self.operations.picking_type_id.id != 32: + if self.operations.picking_type_id.id != 28: if self._is_already_returned(self.operations): raise UserError("BU ini sudah pernah diretur oleh dokumen lain.") if 'operations' in vals and not vals.get('origin'): @@ -259,11 +259,11 @@ class TukarGulingPO(models.Model): if picking.picking_type_id.id == 75: if picking.state != 'done': raise UserError("BU/PUT belum Done!") - elif picking.picking_type_id.id == 32: + elif picking.picking_type_id.id == 28: linked_bu_out = picking.linked_manual_bu_out if linked_bu_out and linked_bu_out.state == 'done': raise UserError("❌ Tidak bisa retur BU/INPUT karena BU/PUT suda Done!") - if picking.picking_type_id.id != 75 or picking.picking_type_id.id != 32: + if picking.picking_type_id.id != 75 or picking.picking_type_id.id != 28: if self._is_already_returned(self.operations): raise UserError("BU ini sudah pernah diretur oleh dokumen lain.") self._validate_product_lines() @@ -312,79 +312,58 @@ class TukarGulingPO(models.Model): def _create_pickings(self): for record in self: if not record.operations: - raise UserError("BU/OUT dari field operations tidak ditemukan.") - - related_pickings = self.env['stock.picking'].search([ - ('origin', '=', record.origin), - ('state', '=', 'done'), - ('picking_type_id', 'in', [75, 32]) - ]) - if not related_pickings: - raise UserError( - "Tidak ditemukan BU/PICK atau BU/OUT dari SO: %s" % record.origin) - - # filter based on stock.picking picking type - bu_input_to_return = False - if record.operations.purchase_id: - bu_input_to_return = record.operations.purchase_id.picking_ids.filtered( - lambda p: p.picking_type_id.id == 75 and p.state == 'done' - ) - if bu_input_to_return: - bu_input_to_return = bu_input_to_return[0] - - # BU PUT = operations - bu_put_to_return = record.operations - - if not bu_input_to_return and not bu_put_to_return: - raise UserError("Tidak ada BU INPUT atau BU PUT yang siap diretur.") + raise UserError("BU Operations belum dipilih.") created_returns = [] - # Lokasi default untuk retur - vrt_type = self.env['stock.picking.type'].browse(77) - prt_type = self.env['stock.picking.type'].browse(76) - bu_input_type = self.env['stock.picking.type'].browse(32) - bu_put_type = self.env['stock.picking.type'].browse(75) - - stock_location = self.env['stock.location'] - - # srt_src = stock_location.browse(5) - # srt_dest = stock_location.browse(60) - # - # ort_src = stock_location.browse(60) - # ort_dest = stock_location.browse(57) - # - # if not ort_src or not ort_dest or not srt_src or not srt_dest: - # raise UserError("salahwoi") + # Ambil BU INPUT & BU PUT dari group yang sama + group = record.operations.group_id + bu_input_to_return = bu_put_to_return = False + + if group: + po_pickings = self.env['stock.picking'].search([ + ('group_id', '=', group.id), + ('state', '=', 'done') + ]) + bu_input_to_return = po_pickings.filtered(lambda p: p.picking_type_id.id == 28) + bu_put_to_return = po_pickings.filtered(lambda p: p.picking_type_id.id == 75) + bu_input_to_return = bu_input_to_return[0] if bu_input_to_return else False + bu_put_to_return = bu_put_to_return[0] if bu_put_to_return else False + else: + raise UserError("Group ID tidak ditemukan pada BU Operations.") - # Fungsi membuat retur dari picking tertentu + # Fungsi buat return picking def _create_return_from_picking(picking): - grup = self.operations.group_id + grup = record.operations.group_id - PARTNER_LOCATION_ID = 5 - # BU_OUTPUT_LOCATION_ID = 60 - BU_INPUT_LOCATION_ID = 60 + PARTNER_LOCATION_ID = 4 + BU_INPUT_LOCATION_ID = 58 BU_STOCK_LOCATION_ID = 57 - # Determine locations based on picking type - if picking.picking_type_id.id == 77: - return_type = vrt_type - default_location_id = BU_STOCK_LOCATION_ID - default_location_dest_id = BU_INPUT_LOCATION_ID - elif picking.picking_type_id.id == 76: - return_type = prt_type + # Lokasi sesuai type + if picking.picking_type_id.id == 28: + # Retur dari BU INPUT → hasilnya jadi PRT (BU Input → Partner) + # tapi wizard tetap diinput sebagai picking_id=28, dari input ke partner default_location_id = BU_INPUT_LOCATION_ID default_location_dest_id = PARTNER_LOCATION_ID + elif picking.picking_type_id.id == 75: - return_type = bu_put_type + # Retur dari BU PUT → hasilnya jadi VRT (BU Stock → BU Input) + default_location_id = BU_STOCK_LOCATION_ID + default_location_dest_id = BU_INPUT_LOCATION_ID + + elif picking.picking_type_id.id == 77: + # Retur dari VRT → hasilnya jadi PUT lagi (BU Input → BU Stock) default_location_id = BU_INPUT_LOCATION_ID default_location_dest_id = BU_STOCK_LOCATION_ID - elif picking.picking_type_id.id == 32: - return_type = bu_input_type + + elif picking.picking_type_id.id == 76: + # Retur dari PRT → hasilnya jadi INPUT lagi (Partner → BU Input) default_location_id = PARTNER_LOCATION_ID default_location_dest_id = BU_INPUT_LOCATION_ID else: return None + return_context = dict(self.env.context) return_context.update({ 'active_id': picking.id, @@ -399,72 +378,82 @@ class TukarGulingPO(models.Model): 'original_location_id': default_location_id }) - # Create return lines + # Buat lines return_lines = [] for line in record.line_ids: - move = picking.move_lines.filtered(lambda wkwk: wkwk.product_id == line.product_id) + move = picking.move_lines.filtered(lambda m: m.product_id == line.product_id) if move: return_lines.append((0, 0, { 'product_id': line.product_id.id, 'quantity': line.product_uom_qty, - 'move_id': move.id, + 'move_id': move[0].id, })) - if not move: - raise UserError("eror woi") + if not return_lines: return None return_wizard.product_return_moves = return_lines - - _logger.info("Creating return for picking %s", picking.name) - _logger.info("Default location src: %s", default_location_id) - _logger.info("Default location dest: %s", default_location_dest_id) return_vals = return_wizard.create_returns() - return_id = return_vals.get('res_id') - return_picking = self.env['stock.picking'].browse(return_id) + return_picking = self.env['stock.picking'].browse(return_vals.get('res_id')) - if not return_picking: - raise UserError("Retur gagal dibuat. Hasil create_returns: %s" % str(return_vals)) - - # Force the destination location + # Paksa locations di picking & moves return_picking.write({ - 'location_dest_id': default_location_dest_id, 'location_id': default_location_id, + 'location_dest_id': default_location_dest_id, 'group_id': grup.id, 'tukar_guling_po_id': record.id, }) + for move in return_picking.move_lines: + move.write({ + 'location_id': default_location_id, + 'location_dest_id': default_location_dest_id, + }) + + # Rename BU INPUT jadi BU/INPUT/ + if return_picking.picking_type_id.id == 28 and return_picking.name.startswith('BU/IN/'): + old_name = return_picking.name + return_picking.name = return_picking.name.replace('BU/IN/', 'BU/INPUT/', 1) + _logger.info("Rename %s -> %s", old_name, return_picking.name) + return return_picking + if record.operations.picking_typ_id.id == 28: + bu_prt = _create_return_from_picking(record.operations) + if bu_prt: + created_returns.append(bu_prt) + # Eksekusi sesuai kondisi operations if record.operations.picking_type_id.id == 76: - prt = _create_return_from_picking(record.operations) + # Kalau operations = PRT → return jadi BU INPUT + bu_input = _create_return_from_picking(record.operations) + if bu_input: + created_returns.append(bu_input) + elif record.operations.picking_type_id.id == 77: + # Kalau operations = VRT → return jadi BU PUT + bu_put = _create_return_from_picking(record.operations) + if bu_put: + created_returns.append(bu_put) + else: + # Standard: retur bu_input & bu_put + prt = _create_return_from_picking(bu_input_to_return) if prt: created_returns.append(prt) - else: - # CASE: Retur dari BU/OUT + vrt = _create_return_from_picking(bu_put_to_return) if vrt: created_returns.append(vrt) - prt = None - if bu_input_to_return: - prt = _create_return_from_picking(bu_input_to_return) - if prt: - created_returns.append(prt) - if record.return_type == 'tukar_guling': + vrt = _create_return_from_picking(bu_put_to_return) if vrt: - bu_put = _create_return_from_picking(vrt) - if bu_put: - created_returns.append(bu_put) + created_returns.append(vrt) + prt = _create_return_from_picking(bu_input_to_return) if prt: - bu_input = _create_return_from_picking(prt) - if bu_input: - created_returns.append(bu_input) + created_returns.append(prt) if not created_returns: - raise UserError("wkwkwk") + raise UserError("Tidak ada dokumen retur yang berhasil dibuat.") |
