summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-07-04 17:14:41 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-07-04 17:14:41 +0700
commit43b88a8d7814281e4e20c3a22c0c1780e4caf54e (patch)
treecb92ace2654a702a98ab4e9c7cfd453f22622b8c
parent1118c1c0762ff0ad98bb8d6e64467b32635dadea (diff)
<miqdad> tukar guling po (-) sequence
-rw-r--r--indoteknik_custom/models/tukar_guling_po.py173
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.")