summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-02-26 13:41:50 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-02-26 13:41:50 +0700
commite94dbdf4418c686ec4e8fdab41d4f05e5284fbfb (patch)
tree9780296d65ffa695abe9791f061cc2b2a4d708ff
parent0174a19b631d67a70805de45b252cdcf1c562fb6 (diff)
push wms
-rw-r--r--indoteknik_custom/models/stock_immediate_transfer.py4
-rw-r--r--indoteknik_custom/models/stock_picking.py104
2 files changed, 67 insertions, 41 deletions
diff --git a/indoteknik_custom/models/stock_immediate_transfer.py b/indoteknik_custom/models/stock_immediate_transfer.py
index 8724c567..35c17192 100644
--- a/indoteknik_custom/models/stock_immediate_transfer.py
+++ b/indoteknik_custom/models/stock_immediate_transfer.py
@@ -17,8 +17,8 @@ class StockImmediateTransfer(models.TransientModel):
pickings_not_to_do |= line.picking_id
for picking in pickings_to_do:
- picking.send_mail_bills()
- picking.send_koli_to_so()
+ # picking.send_mail_bills()
+ # picking.send_koli_to_so()
if picking.state == 'draft':
picking.action_confirm()
if picking.state != 'assigned':
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index f359a2fb..bbd9043d 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -4,6 +4,7 @@ from odoo.tools.float_utils import float_is_zero
from datetime import timedelta, datetime
from itertools import groupby
import pytz, requests, json, requests
+from collections import defaultdict
from dateutil import parser
import datetime
import hmac
@@ -1318,72 +1319,97 @@ class ScanKoli(models.Model):
)
def unlink(self):
+ picking_ids = set(self.mapped('picking_id.id')) # Tangkap picking_id sebelum hapus scan.koli
+
for scan in self:
koli = scan.koli_id.koli_id
if koli:
- # Hapus reserved_id saat scan dihapus
koli.reserved_id = False
- # Ambil semua scan koli yang masih ada dan memiliki picking_id yang sama
- remaining_scans = self.env['scan.koli'].search([
- ('id', '!=', scan.id), # Kecuali scan yang sedang dihapus
+ # Jika tidak ada scan.koli lain untuk picking_id yang sama, reset linked_out_picking_id
+ if not self.env['scan.koli'].search_count([
+ ('id', '!=', scan.id),
('koli_id.picking_id', '=', koli.picking_id.id)
- ])
-
- # Jika tidak ada scan lain yang memiliki picking_id yang sama, hapus linked_out_picking_id
- if not remaining_scans:
+ ]):
koli.picking_id.linked_out_picking_id = False
- return super(ScanKoli, self).unlink()
+ result = super(ScanKoli, self).unlink() # Hapus scan.koli
+
+ # Reset qty_done jika semua scan.koli untuk picking_id tersebut telah dihapus
+ for picking_id in picking_ids:
+ self._reset_qty_done_if_no_scan(picking_id)
+
+ return result
- @api.onchange('koli_id','scan_koli_progress')
+ def _reset_qty_done_if_no_scan(self, picking_id):
+ """Set qty_done ke 0 hanya jika tidak ada scan.koli tersisa untuk picking_id tersebut."""
+ remaining_scans = self.env['scan.koli'].search_count([('picking_id', '=', picking_id)])
+
+ if remaining_scans == 0:
+ picking = self.env['stock.picking'].browse(picking_id)
+ picking.move_line_ids_without_package.write({'qty_done': 0})
+ picking.message_post(body=f"⚠️ qty_done direset ke 0 untuk Picking {picking.name} karena tidak ada scan.koli yang tersisa.")
+
+ return remaining_scans
+
+ @api.onchange('koli_id', 'scan_koli_progress')
def onchange_koli_id(self):
- if not self.koli_id:
- return
-
- for scan in self:
- if scan.koli_id.koli_id.picking_id.group_id.id != scan.picking_id.group_id.id:
+ for scan in self.filtered('koli_id'):
+ if scan.koli_id.koli_id.picking_id.group_id.id != scan.picking_id.group_id.id:
scan.koli_id.koli_id.reserved_id = scan.picking_id.id.origin
scan.koli_id.koli_id.picking_id.linked_out_picking_id = scan.picking_id.id.origin
+ @api.depends('picking_id')
def _compute_scan_koli_progress(self):
- """ Menghitung progres scan koli dalam format 'X/Y' """
for scan in self:
if scan.picking_id:
- all_scans = self.env['scan.koli'].search([('picking_id', '=', scan.picking_id.id)], order='id')
- scan_index = list(all_scans).index(scan) + 1 # Nomor urut scan
total_so_koli = scan.picking_id.total_so_koli
- scan.scan_koli_progress = f"{scan_index}/{total_so_koli}" if total_so_koli else "0/0"
+ scan.scan_koli_progress = f"{scan.picking_id.scan_koli_lines.ids.index(scan.id) + 1}/{total_so_koli}" if total_so_koli else "0/0"
@api.constrains('picking_id', 'picking_id.total_so_koli')
def _check_koli_validation(self):
- """ Validasi jika jumlah scan koli melebihi total SO koli """
for scan in self:
scan.koli_id.koli_id.reserved_id = scan.picking_id.id
scan.koli_id.koli_id.picking_id.linked_out_picking_id = scan.picking_id.id
- total_scans = len(scan.picking_id.scan_koli_lines)
- if total_scans > scan.picking_id.total_so_koli:
- raise UserError(_("Jumlah scan koli melebihi total SO koli!"))
+ if len(scan.picking_id.scan_koli_lines) != scan.picking_id.total_so_koli:
+ raise UserError("Jumlah scan koli tidak sama dengan total SO koli!")
@api.onchange('koli_id')
def _onchange_koli_id(self):
+ for scan in self.filtered('koli_id'):
+ if scan.picking_id.group_id.id != scan.koli_id.picking_id.group_id.id:
+ raise UserError('Koli tidak sesuai, pastikan picking terkait benar!')
+
+ @api.onchange('koli_id')
+ def _onchange_koliii(self):
+ for scan in self.filtered('koli_id'):
+ if self.env['scan.koli'].search_count([
+ ('picking_id', '=', scan.picking_id.id),
+ ('koli_id', '=', scan.koli_id.id),
+ ('id', '!=', scan.id.origin)
+ ]):
+ scan.koli_id = False
+ raise UserError(f"Koli {scan.koli_id.name} sudah dipindai dalam picking ini!")
+
+ @api.constrains('koli_id')
+ def _send_product_from_koli_id(self):
if not self.koli_id:
return
-
- source_koli_so = self.picking_id.group_id.id
- source_koli = self.koli_id.picking_id.group_id.id
- if source_koli_so != source_koli:
- raise UserError(_('Koli tidak sesuai, pastikan picking terkait benar!'))
+ koli_count_by_picking = defaultdict(int)
+ for scan in self:
+ koli_count_by_picking[scan.koli_id.picking_id.id] += 1 # Hitung jumlah koli per picking
- @api.onchange('koli_id')
- def _onchange_koliii(self):
- if self.koli_id and self.picking_id:
- existing_koli = self.env['scan.koli'].search([
- ('picking_id', '=', self.picking_id.id),
- ('koli_id', '=', self.koli_id.id),
- ('id', '!=', self.id.origin) # Hindari validasi saat edit data
- ])
- if existing_koli:
- self.koli_id = False # Reset field koli_id agar pengguna tidak bisa memilihnya
- raise UserError(f"Koli {existing_koli.koli_id.name} sudah dipindai dalam picking ini!") \ No newline at end of file
+ for picking_id, total_koli in koli_count_by_picking.items():
+ picking = self.env['stock.picking'].browse(picking_id)
+
+ if total_koli == picking.quantity_koli:
+ # Ambil stock moves dari BU/PICK dan BU/OUT berdasarkan picking_id
+ pick_moves = self.env['stock.move.line'].search([('picking_id', '=', picking_id)])
+ out_moves = self.env['stock.move.line'].search([('picking_id', '=', picking.linked_out_picking_id.id)])
+
+ # Sesuaikan product_id di BU/OUT dengan BU/PICK
+ for pick_move in pick_moves:
+ corresponding_out_move = out_moves.filtered(lambda m: m.product_id == pick_move.product_id)
+ if corresponding_out_move:
+ corresponding_out_move.qty_done = corresponding_out_move.product_uom_qty # Update qty_done \ No newline at end of file