summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFIN-IT_AndriFP <it@fixcomart.co.id>2025-10-14 09:21:37 +0700
committerFIN-IT_AndriFP <it@fixcomart.co.id>2025-10-14 09:21:37 +0700
commit8934f93e02ca6c0616c7932b4cc615adbde3d3e0 (patch)
tree23bb4a4c6f4f36786e570387dc522513e1fce185
parent1de6ff22b0c3177d01d989b2c4fab1c64c45c1cf (diff)
parent67691bbda67b4362728a8bd99a7be1478a15e5b1 (diff)
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into pum-v3
-rw-r--r--indoteknik_custom/models/partial_delivery.py85
-rw-r--r--indoteknik_custom/views/stock_move_line.xml3
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>