summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-04-14 15:17:17 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-04-14 15:17:17 +0700
commita4d19c6b9f026cc247c135b14a6fecf76a9fcd70 (patch)
treee24f481528fb79269e1a93c1265ea8b7796febe6
parentb73d16bf8dc0546190c9853f3e32a9aeaae3c1f0 (diff)
push
-rw-r--r--indoteknik_api/controllers/api_v1/stock_picking.py6
-rw-r--r--indoteknik_custom/models/stock_picking.py55
-rw-r--r--indoteknik_custom/views/stock_picking.xml2
3 files changed, 59 insertions, 4 deletions
diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py
index 55e07152..a2cd0557 100644
--- a/indoteknik_api/controllers/api_v1/stock_picking.py
+++ b/indoteknik_api/controllers/api_v1/stock_picking.py
@@ -116,10 +116,10 @@ class StockPicking(controller.Controller):
return self.response(picking.get_tracking_detail())
- @http.route(prefix + 'stock-picking/<picking_code>/documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ @http.route(prefix + 'stock-picking/<id>/documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
def write_partner_stock_picking_documentation(self, **kw):
- picking_code = int(kw.get('picking_code', 0))
+ id = int(kw.get('id', 0))
sj_document = kw.get('sj_document', False)
paket_document = kw.get('paket_document', False)
@@ -128,7 +128,7 @@ class StockPicking(controller.Controller):
'driver_arrival_date': datetime.utcnow(),
}
- picking_data = request.env['stock.picking'].search([('picking_code', '=', picking_code)], limit=1)
+ picking_data = request.env['stock.picking'].search([('id', '=', id)], limit=1)
if not picking_data:
return self.response(code=404, description='picking not found')
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index 4e926e60..76ba51d4 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -76,6 +76,11 @@ class StockPicking(models.Model):
readonly=True,
copy=False
)
+ out_code = fields.Integer(
+ string="Out Code",
+ readonly=True,
+ related="id",
+ )
sj_documentation = fields.Binary(string="Dokumentasi Surat Jalan", )
paket_documentation = fields.Binary(string="Dokumentasi Paket", )
sj_return_date = fields.Datetime(string="SJ Return Date", )
@@ -216,6 +221,16 @@ class StockPicking(models.Model):
# countdown_ready_to_ship = fields.Char(string='Countdown Ready to Ship', compute='_callculate_sequance', store=False, compute_sudo=False)
final_seq = fields.Float(string='Remaining Time')
shipping_method_so_id = fields.Many2one('delivery.carrier', string='Shipping Method SO', related='sale_id.carrier_id')
+ state_packing = fields.Selection([('not_packing', 'Belum Packing'), ('packing_done', 'Sudah Packing')], string='Packing Status')
+
+ @api.constrains('konfirm_koli_lines')
+ def _constrains_konfirm_koli_lines(self):
+ now = datetime.datetime.utcnow()
+ for picking in self:
+ if len(picking.konfirm_koli_lines) > 0:
+ picking.state_packing = 'packing_done'
+ else:
+ picking.state_packing = 'not_packing'
@api.constrains('scan_koli_lines')
def _constrains_scan_koli_lines(self):
@@ -1059,6 +1074,7 @@ class StockPicking(models.Model):
self.driver_departure_date = datetime.datetime.utcnow()
self.state_reserve = 'done'
self.final_seq = 0
+ self.set_picking_code_out()
self.send_koli_to_so()
if not self.env.context.get('skip_koli_check'):
for picking in self:
@@ -1088,6 +1104,26 @@ class StockPicking(models.Model):
self.send_mail_bills()
return res
+ def set_picking_code_out(self):
+ for picking in self:
+ # Check if picking meets criteria
+ is_bu_pick = picking.picking_type_code == 'internal' and 'BU/PICK/' in picking.name
+ if not is_bu_pick:
+ continue
+
+ # Find matching outgoing transfers
+ bu_out_transfers = self.search([
+ ('name', 'like', 'BU/OUT/%'),
+ ('sale_id', '=', picking.sale_id.id),
+ ('picking_type_code', '=', 'outgoing'),
+ ('picking_code', '=', False),
+ ('state', 'not in', ['done', 'cancel'])
+ ])
+
+ # Assign sequence code to each matching transfer
+ for transfer in bu_out_transfers:
+ transfer.picking_code = self.env['ir.sequence'].next_by_code('stock.picking.code')
+
def check_koli(self):
for picking in self:
@@ -1206,11 +1242,28 @@ class StockPicking(models.Model):
def create(self, vals):
self._use_faktur(vals)
records = super(StockPicking, self).create(vals)
-
+
+ # Panggil sync_sale_line setelah record dibuat
+ # records.sync_sale_line(vals)
return records
+ def sync_sale_line(self, vals):
+ # Pastikan kita bekerja dengan record yang sudah ada
+ for picking in self:
+ if picking.picking_type_code == 'internal' and 'BU/PICK/' in picking.name:
+ for line in picking.move_ids_without_package:
+ if line.product_id and picking.sale_id:
+ sale_line = self.env['sale.order.line'].search([
+ ('product_id', '=', line.product_id.id),
+ ('order_id', '=', picking.sale_id.id)
+ ], limit=1) # Tambahkan limit=1 untuk efisiensi
+
+ if sale_line:
+ line.sale_line_id = sale_line.id
+
def write(self, vals):
self._use_faktur(vals)
+ self.sync_sale_line(vals)
for picking in self:
# Periksa apakah kondisi terpenuhi saat data diubah
if (vals.get('picking_type_code', picking.picking_type_code) == 'incoming' and
diff --git a/indoteknik_custom/views/stock_picking.xml b/indoteknik_custom/views/stock_picking.xml
index 5424f3d3..f7b6134d 100644
--- a/indoteknik_custom/views/stock_picking.xml
+++ b/indoteknik_custom/views/stock_picking.xml
@@ -19,6 +19,7 @@
<field name="note" optional="hide"/>
<field name="date_reserved" optional="hide"/>
<field name="state_reserve" optional="hide"/>
+ <field name="state_packing" widget="badge" decoration-success="state_packing == 'packing_done'" decoration-danger="state_packing == 'not_packing'" optional="hide"/>
<field name="final_seq"/>
<field name="state_approve_md" widget="badge" decoration-success="state_approve_md == 'done'" decoration-warning="state_approve_md == 'pending'" optional="hide"/>
<!-- <field name="countdown_hours" optional="hide"/>
@@ -174,6 +175,7 @@
<field name="note_logistic"/>
<field name="responsible" />
<field name="carrier_id"/>
+ <field name="out_code" attrs="{'invisible': [['out_code', '=', False]]}"/>
<field name="picking_code" attrs="{'invisible': [['picking_code', '=', False]]}"/>
<field name="picking_code" string="Picking code (akan digenerate ketika sudah di-validate)" attrs="{'invisible': [['picking_code', '!=', False]]}"/>
<field name="driver_departure_date" attrs="{'readonly':[('invoice_status', '=', 'invoiced')]}"/>