diff options
| author | FIN-IT_AndriFP <it@fixcomart.co.id> | 2025-10-14 09:21:37 +0700 |
|---|---|---|
| committer | FIN-IT_AndriFP <it@fixcomart.co.id> | 2025-10-14 09:21:37 +0700 |
| commit | 8934f93e02ca6c0616c7932b4cc615adbde3d3e0 (patch) | |
| tree | 23bb4a4c6f4f36786e570387dc522513e1fce185 | |
| parent | 1de6ff22b0c3177d01d989b2c4fab1c64c45c1cf (diff) | |
| parent | 67691bbda67b4362728a8bd99a7be1478a15e5b1 (diff) | |
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into pum-v3
| -rw-r--r-- | indoteknik_custom/models/partial_delivery.py | 85 | ||||
| -rw-r--r-- | indoteknik_custom/views/stock_move_line.xml | 3 |
2 files changed, 75 insertions, 13 deletions
diff --git a/indoteknik_custom/models/partial_delivery.py b/indoteknik_custom/models/partial_delivery.py index 1204089b..83fe9981 100644 --- a/indoteknik_custom/models/partial_delivery.py +++ b/indoteknik_custom/models/partial_delivery.py @@ -42,6 +42,8 @@ class PartialDeliveryWizard(models.TransientModel): # return res def action_select_all(self): + if len(self.line_ids) == 0: + raise UserError(_("Tidak ada produk yang dipilih.")) for line in self.line_ids: line.selected = True # return action supaya wizard gak nutup @@ -54,6 +56,8 @@ class PartialDeliveryWizard(models.TransientModel): } def action_unselect_all(self): + if len(self.line_ids) == 0: + raise UserError(_("Tidak ada produk yang dipilih.")) for line in self.line_ids: line.selected = False # juga reload biar tetap di wizard @@ -65,21 +69,41 @@ class PartialDeliveryWizard(models.TransientModel): 'target': 'new', } - - @api.onchange('picking_id') def _onchange_picking_id(self): """Generate lines whenever picking_id is changed""" - lines = [] - if self.picking_id: - moves = self.picking_id.move_ids_without_package.filtered(lambda m: m.reserved_availability > 0) - for move in moves: - lines.append((0, 0, { - 'product_id': move.product_id.id, - 'reserved_qty': move.reserved_availability, - 'move_id': move.id, - })) - self.line_ids = lines + if not self.picking_id: + self.line_ids = [(5, 0, 0)] + return + + # ๐งน hapus line lama dulu + if self.line_ids: + self.line_ids.unlink() + + moves = self.picking_id.move_lines or self.picking_id.move_ids_without_package + moves = moves.filtered(lambda m: m.product_id and m.reserved_availability > 0) + + if not moves: + _logger.warning(f"[PartialDeliveryWizard] Tidak ada move line di picking {self.picking_id.name}") + return + + for move in moves: + reserved_qty = move.reserved_availability or 0.0 + ordered_qty = move.sale_line_id.product_uom_qty if move.sale_line_id else 0.0 + + self.env['partial.delivery.wizard.line'].create({ + 'wizard_id': self.id, + 'product_id': move.product_id.id, + 'reserved_qty': reserved_qty, + 'selected_qty': reserved_qty, # biar langsung keisi default + 'move_id': move.id, + 'sale_line_id': move.sale_line_id.id if move.sale_line_id else False, + }) + + _logger.info( + f"[PartialDeliveryWizard] โ
Created line for {move.product_id.display_name} " + f"(reserved={reserved_qty}, move_id={move.id})" + ) def action_confirm_partial_delivery(self): @@ -92,7 +116,6 @@ class PartialDeliveryWizard(models.TransientModel): if picking.state != "assigned": raise UserError(_("Picking harus dalam status Ready (assigned).")) - lines_by_qty = self.line_ids.filtered(lambda l: l.selected_qty > 0) lines_by_selected = self.line_ids.filtered(lambda l: l.selected and not l.selected_qty) @@ -101,6 +124,37 @@ class PartialDeliveryWizard(models.TransientModel): if not selected_lines: raise UserError(_("Tidak ada produk yang dipilih atau diisi jumlahnya.")) + # ๐ง Tambahan: kalau semua line dipilih (full delivery) + all_selected = len(selected_lines) == len(self.line_ids) + full_selected = all_selected and all( + (line.selected_qty or line.reserved_qty) >= line.reserved_qty + for line in selected_lines + ) + + if full_selected: + # ๐ก Gak perlu bikin picking baru, langsung ubah state_reserve + picking.write({'state_reserve': 'partial'}) + + # Tambahin log aja biar ada jejak + picking.message_post( + body=f"<b>Full Picking Confirmed</b> dari wizard partial delivery oleh {self.env.user.name}", + message_type="comment", + subtype_xmlid="mail.mt_note", + ) + + return { + "type": "ir.actions.act_window", + "res_model": "stock.picking", + "view_mode": "form", + "res_id": picking.id, + "target": "current", + "effect": { + "fadeout": "slow", + "message": f"โ
Semua produk dikirim penuh โ tidak dibuat DO baru.", + "type": "rainbow_man", + }, + } + new_picking = StockPicking.create({ 'origin': picking.origin, 'partner_id': picking.partner_id.id, @@ -212,3 +266,8 @@ class PartialDeliveryWizardLine(models.TransientModel): sale_line_id = fields.Many2one('sale.order.line', string="SO Line", related='move_id.sale_line_id') ordered_qty = fields.Float(related='sale_line_id.product_uom_qty', string="Ordered Qty") + @api.onchange('selected') + def onchange_selected(self): + if self.selected: + self.selected_qty = self.reserved_qty + diff --git a/indoteknik_custom/views/stock_move_line.xml b/indoteknik_custom/views/stock_move_line.xml index 94c0bf53..ac8d3dbe 100644 --- a/indoteknik_custom/views/stock_move_line.xml +++ b/indoteknik_custom/views/stock_move_line.xml @@ -20,6 +20,9 @@ <field name="product_id" position="after"> <field name="manufacture"/> </field> + <field name="qty_done" position="after"> + <field name="product_uom_qty"/> + </field> </field> </record> </odoo> |
