diff options
| -rw-r--r-- | indoteknik_custom/models/tukar_guling.py | 176 | ||||
| -rw-r--r-- | indoteknik_custom/views/ir_sequence.xml | 11 |
2 files changed, 108 insertions, 79 deletions
diff --git a/indoteknik_custom/models/tukar_guling.py b/indoteknik_custom/models/tukar_guling.py index 6c5d74ec..7bcf5e80 100644 --- a/indoteknik_custom/models/tukar_guling.py +++ b/indoteknik_custom/models/tukar_guling.py @@ -202,7 +202,6 @@ class TukarGuling(models.Model): line.sequence = (i + 1) * 10 return new_record - def write(self, vals): if 'operations' in vals and not vals.get('origin'): picking = self.env['stock.picking'].browse(vals['operations']) @@ -273,76 +272,113 @@ class TukarGuling(models.Model): self.state = 'cancel' def _create_pickings(self): - Picking = self.env['stock.picking'] - group_id = self.env['procurement.group'].create({'name': self.name}).id - - def create_moves(picking_type, origin_suffix, location_id, location_dest_id): - return Picking.create({ - 'partner_id': self.operations.partner_id.id, - 'real_shipping_id': self.operations.real_shipping_id.id, - 'picking_type_id': picking_type.id, - 'location_id': location_id, - 'location_dest_id': location_dest_id, - 'origin': f"Tukar Guling {self.name} - {origin_suffix}", - 'tukar_guling_id': self.id, - 'group_id': group_id, - 'move_ids_without_package': [ - (0, 0, { - 'name': line.name or line.product_id.name, - 'product_id': line.product_id.id, - 'product_uom_qty': line.product_uom_qty, - 'product_uom': line.product_uom.id, - 'location_id': location_id, - 'location_dest_id': location_dest_id, - 'group_id': group_id, - }) for line in self.line_ids - ] - }) - - # BU/SRT - srt_type = self.env['stock.picking.type'].search([('sequence_code', '=', 'SRT')], limit=1) - if not srt_type: - raise UserError("Picking Type dengan sequence_code 'SRT' tidak ditemukan.") - bu_srt = create_moves( - srt_type, 'SRT', - self.operations.location_dest_id.id, - srt_type.default_location_dest_id.id - ) - bu_srt.action_confirm() - - # BU/ORT - ort_type = self.env['stock.picking.type'].search([('sequence_code', '=', 'ORT')], limit=1) - if not ort_type: - raise UserError("Picking Type dengan sequence_code 'ORT' tidak ditemukan.") - bu_ort = create_moves( - ort_type, 'ORT', - ort_type.default_location_src_id.id, - ort_type.default_location_dest_id.id - ) - bu_ort.action_confirm() - - # Jika return_type tukar_guling → lanjut buat PICK dan OUT - if self.return_type == 'tukar_guling': - pick_type = self.env['stock.picking.type'].search([('sequence_code', '=', 'PICK')], limit=1) - if not pick_type: - raise UserError("Picking Type dengan sequence_code 'PICK' tidak ditemukan.") - bu_pick = create_moves( - pick_type, 'PICK', - pick_type.default_location_src_id.id, - pick_type.default_location_dest_id.id - ) - bu_pick.action_confirm() - - out_type = self.env['stock.picking.type'].search([('sequence_code', '=', 'OUT')], limit=1) - if not out_type: - raise UserError("Picking Type dengan sequence_code 'OUT' tidak ditemukan.") - bu_out = create_moves( - out_type, 'OUT', - out_type.default_location_src_id.id, - self.operations.location_dest_id.id - ) - bu_out.action_confirm() + if not self.operations: + raise UserError("BU/Out harus diisi terlebih dahulu.") + + origin_so = self.operations.origin + if not origin_so: + raise UserError("BU/OUT tidak memiliki origin (SO), tidak bisa cari BU/PICK.") + + # Cari DO dari SO + get_group_id = self.env['stock.picking'].search([ + ('origin', '=', origin_so), + ], limit=1) + if not get_group_id: + raise UserError(f"Delivery Order dari SO {origin_so} tidak ditemukan.") + + group_id = get_group_id.group_id.id if get_group_id.group_id else False + + Picking = self.env['stock.picking'] + srt_type = self.env['stock.picking.type'].search([ + ('sequence_code', '=', 'SRT') + ], limit=1) + + ort_type = self.env['stock.picking.type'].search([ + ('sequence_code', '=', 'ORT') + ], limit=1) + + # Lokasi + location_dest_id = srt_type.default_location_dest_id.id + location_dest_id_ort = ort_type.default_location_dest_id.id + location_customer = self.operations.location_dest_id + + # 1. BU/SRT: retur dari operations + srt_picking = Picking.create({ + 'partner_id': self.operations.partner_id.id, + 'real_shipping_id': self.operations.real_shipping_id.id, + 'picking_type_id': srt_type.id, + 'location_id': location_customer.id, + 'location_dest_id': location_dest_id, + 'origin': f"Retur {self.operations.name}", + 'tukar_guling_id': self.id, + 'group_id': group_id, + 'move_ids_without_package': [ + (0, 0, { + 'name': line.name or line.product_id.name, + 'product_id': line.product_id.id, + 'product_uom_qty': line.product_uom_qty, + 'product_uom': line.product_uom.id, + 'location_id': location_customer.id, + 'location_dest_id': location_dest_id, + 'group_id': group_id, + }) for line in self.line_ids + ] + }) + srt_picking.action_confirm() + + # 2. Cari BU/PICK dari SO yang sama + origin_so = self.operations.origin + if not origin_so: + raise UserError("BU/OUT tidak memiliki origin (SO), tidak bisa cari BU/PICK.") + + pick = Picking.search([ + ('origin', '=', origin_so), + ('picking_type_id.code', '=', 'internal') + ], limit=1) + + if not pick: + raise UserError(f"BU/PICK dengan origin {origin_so} tidak ditemukan.") + + # 3. BU/ORT: retur dari BU/PICK + ort_picking = Picking.create({ + 'partner_id': self.operations.partner_id.id, + 'real_shipping_id': self.operations.real_shipping_id.id, + 'picking_type_id': ort_type.id, + 'location_id': location_dest_id, + 'location_dest_id': location_dest_id_ort, + 'origin': f"Retur {pick.name}", + 'tukar_guling_id': self.id, + 'group_id': group_id, + 'move_ids_without_package': [ + (0, 0, { + 'name': line.name or line.product_id.name, + 'product_id': line.product_id.id, + 'product_uom_qty': line.product_uom_qty, + 'product_uom': line.product_uom.id, + 'location_id': location_dest_id, + 'location_dest_id': location_dest_id_ort, + 'group_id': group_id, + }) for line in self.line_ids + ] + }) + for line in self.line_ids: + move = ort_picking.move_ids_without_package.filtered( + lambda m: m.product_id == line.product_id + )[:1] + + if move: + self.env['stock.move.line'].create({ + 'move_id': move.id, + 'picking_id': ort_picking.id, + 'product_id': line.product_id.id, + 'product_uom_id': line.product_uom.id, + 'qty_done': line.product_uom_qty, # Ambil dari return.picking.line.quantity + 'location_id': location_customer.id, + 'location_dest_id': location_dest_id, + }) + ort_picking.action_confirm() + ort_picking.action_assign() class TukarGulingLine(models.Model): _name = 'tukar.guling.line' diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml index 934e9100..bfee0fd4 100644 --- a/indoteknik_custom/views/ir_sequence.xml +++ b/indoteknik_custom/views/ir_sequence.xml @@ -161,20 +161,13 @@ <field name="number_increment">1</field> </record> <record id="seq_tukar_guling" model="ir.sequence"> - <field name="name">Pengajuan Retur Tukar Guling SO</field> + <field name="name">Pengajuan Return SO</field> <field name="code">tukar.guling</field> <field name="prefix">PTG/</field> <field name="padding">5</field> <field name="number_next">1</field> <field name="number_increment">1</field> + <field name="company_id" eval="False"/> </record> - <record id="seq_tukar_guling_prs" model="ir.sequence"> - <field name="name">Pengajuan Retur Revisi SO (PRS)</field> - <field name="code">tukar.guling.prs</field> - <field name="prefix">PRS-</field> - <field name="padding">5</field> - <field name="number_next">1</field> - <field name="number_increment">1</field> - </record> </data> </odoo>
\ No newline at end of file |
