summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMqdd <ahmadmiqdad27@gmail.com>2025-12-15 09:24:15 +0700
committerMqdd <ahmadmiqdad27@gmail.com>2025-12-15 09:24:15 +0700
commitcfc91866946654d3bfa1627b2cbb19f2d4350bfe (patch)
tree06b374f978a014c7efd8d964c6e6241320727058
parent28bbc495e76b6492935f7270888872135ae4d944 (diff)
<Miqdad> fix delivery submit slow
-rw-r--r--indoteknik_api/controllers/api_v1/stock_picking.py119
1 files changed, 96 insertions, 23 deletions
diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py
index def55435..e33d01c1 100644
--- a/indoteknik_api/controllers/api_v1/stock_picking.py
+++ b/indoteknik_api/controllers/api_v1/stock_picking.py
@@ -121,68 +121,141 @@ class StockPicking(controller.Controller):
return self.response(picking.get_tracking_detail())
- @http.route(prefix + 'stock-picking/<scanid>/documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ @http.route(prefix + 'stock-picking/<scanid>/documentation',
+ auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
def write_partner_stock_picking_documentation(self, scanid, **kw):
- paket_document = kw.get('paket_document') if 'paket_document' in kw else None
- dispatch_document = kw.get('dispatch_document') if 'dispatch_document' in kw else None
- self_pu = kw.get('self_pu') if 'self_pu' in kw else None
- # ===== Cari picking by id / picking_code =====
- picking = False
- # if scanid.isdigit() and int(scanid) < 2147483646:
- # picking = request.env['stock.picking'].search([('id', '=', int(scanid))], limit=1)
- # if not picking:
- # picking = request.env['stock.picking'].search([('picking_code', '=', scanid)], limit=1)
+ env = request.env
+ Picking = env['stock.picking'].sudo()
+ SjDoc = env['stock.picking.sj.document'].sudo()
+
+ paket_document = kw.get('paket_document')
+ dispatch_document = kw.get('dispatch_document')
+ self_pu = kw.get('self_pu')
+ # ===== Cari picking (FAST PATH) =====
+ picking = False
if scanid.isdigit():
- picking = request.env['stock.picking'].browse(int(scanid))
+ picking = Picking.browse(int(scanid))
if not picking.exists():
picking = False
if not picking:
- picking = request.env['stock.picking'].search(
- [('picking_code', '=', scanid)],
- limit=1
- )
+ picking = Picking.search([('picking_code', '=', scanid)], limit=1)
if not picking:
return self.response(code=403, description='picking not found')
- # ===== Ambil MULTIPLE SJ dari form: sj_documentations=...&sj_documentations=... =====
+ # ===== Ambil SJ list =====
form = request.httprequest.form or {}
- sj_list = form.getlist('sj_documentations') # list of base64 strings
+ sj_list = form.getlist('sj_documentations')
- # fallback: kalau FE kirim single dengan nama yang sama (bukan list)
- if not sj_list and 'sj_documentations' in kw and kw.get('sj_documentations'):
+ if not sj_list and kw.get('sj_documentations'):
sj_list = [kw.get('sj_documentations')]
+ # ===== Prepare write params =====
params = {}
+ now = fields.Datetime.now()
+
if paket_document:
params['paket_documentation'] = paket_document
- params['driver_arrival_date'] = datetime.utcnow()
+ params['driver_arrival_date'] = now
+
if dispatch_document:
params['dispatch_documentation'] = dispatch_document
+
if sj_list and self_pu:
- params['driver_arrival_date'] = datetime.utcnow()
+ params['driver_arrival_date'] = now
if params:
picking.write(params)
+ # ===== BULK CREATE SJ (BIG WIN) =====
if sj_list:
- Child = request.env['stock.picking.sj.document'].sudo()
seq = (picking.sj_documentations[:1].sequence or 10) if picking.sj_documentations else 10
+ vals_list = []
+
for b64 in sj_list:
if not b64:
continue
- Child.create({
+ vals_list.append({
'picking_id': picking.id,
'sequence': seq,
'image': b64,
})
seq += 10
+ if vals_list:
+ SjDoc.create(vals_list)
+
return self.response({'name': picking.name})
+
+ # @http.route(prefix + 'stock-picking/<scanid>/documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ # @controller.Controller.must_authorized()
+ # def write_partner_stock_picking_documentation(self, scanid, **kw):
+ # paket_document = kw.get('paket_document') if 'paket_document' in kw else None
+ # dispatch_document = kw.get('dispatch_document') if 'dispatch_document' in kw else None
+ # self_pu = kw.get('self_pu') if 'self_pu' in kw else None
+
+ # # ===== Cari picking by id / picking_code =====
+ # picking = False
+ # # if scanid.isdigit() and int(scanid) < 2147483646:
+ # # picking = request.env['stock.picking'].search([('id', '=', int(scanid))], limit=1)
+ # # if not picking:
+ # # picking = request.env['stock.picking'].search([('picking_code', '=', scanid)], limit=1)
+
+ # if scanid.isdigit():
+ # picking = request.env['stock.picking'].browse(int(scanid))
+ # if not picking.exists():
+ # picking = False
+
+ # if not picking:
+ # picking = request.env['stock.picking'].search(
+ # [('picking_code', '=', scanid)],
+ # limit=1
+ # )
+ # if not picking:
+ # return self.response(code=403, description='picking not found')
+
+ # # ===== Ambil MULTIPLE SJ dari form: sj_documentations=...&sj_documentations=... =====
+ # form = request.httprequest.form or {}
+ # sj_list = form.getlist('sj_documentations') # list of base64 strings
+
+ # # fallback: kalau FE kirim single dengan nama yang sama (bukan list)
+ # if not sj_list and 'sj_documentations' in kw and kw.get('sj_documentations'):
+ # sj_list = [kw.get('sj_documentations')]
+
+ # params = {}
+ # if paket_document:
+ # params['paket_documentation'] = paket_document
+ # params['driver_arrival_date'] = datetime.utcnow()
+ # if dispatch_document:
+ # params['dispatch_documentation'] = dispatch_document
+ # if sj_list and self_pu:
+ # params['driver_arrival_date'] = datetime.utcnow()
+
+ # if params:
+ # picking.write(params)
+
+
+ # vals_list = []
+ # for b64 in sj_list:
+ # if not b64:
+ # continue
+ # vals_list.append({
+ # 'picking_id': picking.id,
+ # 'sequence': seq,
+ # 'image': b64,
+ # })
+ # seq += 10
+
+ # if vals_list:
+ # Child.create(vals_list)
+
+
+ # return self.response({'name': picking.name})
+
# @http.route(prefix + 'stock-picking/<scanid>/documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
# @controller.Controller.must_authorized()
# def write_partner_stock_picking_documentation(self, scanid, **kw):