From 490607bded7c4bffe188a224abe5ea759ea0319e Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 13 Dec 2025 09:09:22 +0700 Subject: improve submit performance indoteknik delivery --- indoteknik_api/controllers/api_v1/stock_picking.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index c19812f5..50a20877 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -131,9 +131,9 @@ class StockPicking(controller.Controller): # ===== 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=0) + picking = request.env['stock.picking'].search([('id', '=', int(scanid))], limit=1) if not picking: - picking = request.env['stock.picking'].search([('picking_code', '=', scanid)], limit=0) + picking = request.env['stock.picking'].search([('picking_code', '=', scanid)], limit=1) if not picking: return self.response(code=403, description='picking not found') @@ -306,4 +306,3 @@ class StockPicking(controller.Controller): "waybill_id": data.get("courier_waybill_id") } ) - -- cgit v1.2.3 From 6eca5f88ea835d1dbd96f53af4cfe5e6437fe47f Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 13 Dec 2025 09:19:34 +0700 Subject: improve submit performance indoteknik delivery --- indoteknik_api/controllers/api_v1/stock_picking.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 50a20877..19d5fe11 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -130,11 +130,21 @@ class StockPicking(controller.Controller): # ===== 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() 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 + ) return self.response(code=403, description='picking not found') # ===== Ambil MULTIPLE SJ dari form: sj_documentations=...&sj_documentations=... ===== -- cgit v1.2.3 From 28bbc495e76b6492935f7270888872135ae4d944 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 13 Dec 2025 09:20:43 +0700 Subject: return eror response --- indoteknik_api/controllers/api_v1/stock_picking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 19d5fe11..def55435 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -145,7 +145,8 @@ class StockPicking(controller.Controller): [('picking_code', '=', scanid)], limit=1 ) - return self.response(code=403, description='picking not found') + 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 {} -- cgit v1.2.3 From cfc91866946654d3bfa1627b2cbb19f2d4350bfe Mon Sep 17 00:00:00 2001 From: Mqdd Date: Mon, 15 Dec 2025 09:24:15 +0700 Subject: fix delivery submit slow --- indoteknik_api/controllers/api_v1/stock_picking.py | 119 +++++++++++++++++---- 1 file changed, 96 insertions(+), 23 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') 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//documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) + @http.route(prefix + 'stock-picking//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//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//documentation', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) # @controller.Controller.must_authorized() # def write_partner_stock_picking_documentation(self, scanid, **kw): -- cgit v1.2.3