From e4256fb981175c456c2033cde443f4f98d72747e Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Wed, 19 Mar 2025 16:39:18 +0700 Subject: webhook biteship --- indoteknik_api/controllers/api_v1/stock_picking.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 55e07152..ceb6b9d3 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -3,6 +3,7 @@ from odoo import http from odoo.http import request from pytz import timezone from datetime import datetime +import json class StockPicking(controller.Controller): @@ -138,13 +139,12 @@ class StockPicking(controller.Controller): 'name': picking_data.name }) - @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) + @http.route(prefix + 'webhook/biteship', auth='public', methods=['POST'], csrf=False) def udpate_status_from_bitehsip(self, **kw): try: - if not request.jsonrequest: - return "ok" + data = kw # Ambil data JSON dari request - data = request.jsonrequest # Ambil data JSON dari request + print(data) event = data.get('event') # Handle Event Berdasarkan Jenisnya @@ -155,9 +155,9 @@ class StockPicking(controller.Controller): elif event == "order.waybill_id": self.process_order_waybill(data) - return {'success': True, 'message': f'Webhook {event} received'} + return self.response({'success': True}) except Exception as e: - return {'success': False, 'message': str(e)} + return self.response({'success': False, 'message': str(e)}) def process_order_status(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) -- cgit v1.2.3 From ef00237c7b6b3aed4f6040d1f124199d3551561e Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Fri, 11 Apr 2025 14:50:53 +0700 Subject: expected delivery date manifest --- indoteknik_api/controllers/api_v1/stock_picking.py | 1 - 1 file changed, 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index ceb6b9d3..d0cc055d 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -102,7 +102,6 @@ class StockPicking(controller.Controller): picking = picking_model.browse(id) if not picking: return self.response(None) - hostori = picking.get_tracking_detail() return self.response(picking.get_tracking_detail()) @http.route(prefix + 'stock-picking//tracking', auth='public', method=['GET', 'OPTIONS']) -- cgit v1.2.3 From fb50d10576f2e5d16faba612dfd1565f7168f655 Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Wed, 16 Apr 2025 14:33:31 +0700 Subject: FEEDBACK --- indoteknik_api/controllers/api_v1/stock_picking.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 0a15d969..abd78f0e 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -160,21 +160,23 @@ class StockPicking(controller.Controller): def process_order_status(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) - if data.get('status') == 'picked': - picking_model.write({'driver_departure_date': datetime.utcnow()}) - elif data.get('status') == 'delivered': - picking_model.write({'driver_arrival_date': datetime.utcnow()}) + if picking_model : + if data.get('status') == 'picked': + result = picking_model.write({'driver_departure_date': datetime.utcnow()}) + print(result) + elif data.get('status') == 'delivered': + picking_model.write({'driver_arrival_date': datetime.utcnow()}) def process_order_price(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) - order = request.env['sale.order'].sudo().search([('name', '=', picking_model.sale_id.name)], limit=1) + picking_model = request.env['stock.picking'].search([('biteship_id', '=', data.get('order_id'))], limit=1) + order = request.env['sale.order'].search([('name', '=', picking_model.sale_id.name)], limit=1) if order: order.write({ 'delivery_amt': data.get('price') }) def process_order_waybill(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) + picking_model = request.env['stock.picking'].search([('biteship_id', '=', data.get('order_id'))], limit=1) if picking_model: picking_model.write({ 'biteship_waybill_id': data.get('courier_waybill_id'), -- cgit v1.2.3 From eb6a5e2b0196681678aab64c98ffced9c4941cc5 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Tue, 27 May 2025 16:34:31 +0700 Subject: show only bu out in list transaction, list shipping, and detail transaction --- indoteknik_api/controllers/api_v1/stock_picking.py | 64 ++++++++++++---------- 1 file changed, 34 insertions(+), 30 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 31706b99..efcc56eb 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -22,42 +22,44 @@ class StockPicking(controller.Controller): if not get_params['valid']: return self.response(code=400, description=get_params) - + params = get_params['value'] partner_id = params['partner_id'] limit = params['limit'] offset = params['offset'] - + child_ids = request.env['res.partner'].browse(partner_id).get_child_ids() pending_domain = [('driver_departure_date', '=', False), ('driver_arrival_date', '=', False)] shipment_domain = [('driver_departure_date', '!=', False), ('driver_arrival_date', '=', False)] shipment_domain2 = [('driver_departure_date', '!=', False), ('sj_return_date', '=', False)] - completed_domain = [('driver_departure_date', '!=', False),'|', ('driver_arrival_date', '!=', False), ('sj_return_date', '!=', False)] + completed_domain = [('driver_departure_date', '!=', False), '|', ('driver_arrival_date', '!=', False), + ('sj_return_date', '!=', False)] completed_domain2 = [('driver_departure_date', '!=', False), ('sj_return_date', '!=', False)] picking_model = request.env['stock.picking'] domain = [ - ('partner_id', 'in', child_ids), - ('sale_id', '!=', False), - ('origin', 'ilike', 'SO%'), - ('state', '!=', 'cancel') + ('partner_id', 'in', child_ids), + ('sale_id', '!=', False), + ('origin', 'ilike', 'SO%'), + ('state', '!=', 'cancel'), + ('name', 'ilike', 'BU/OUT%') ] - + if params['q']: query_like = '%' + params['q'].replace(' ', '%') + '%' - domain += ['|', '|', - ('name', 'ilike', query_like), - ('sale_id.client_order_ref', 'ilike', query_like), - ('delivery_tracking_no', 'ilike', query_like) - ] + domain += ['|', '|', + ('name', 'ilike', query_like), + ('sale_id.client_order_ref', 'ilike', query_like), + ('delivery_tracking_no', 'ilike', query_like) + ] default_domain = domain.copy() - + if params['status'] == 'pending': domain += pending_domain elif params['status'] == 'shipment': - domain += shipment_domain + shipment_domain2 + domain += shipment_domain + shipment_domain2 elif params['status'] == 'completed': domain += completed_domain @@ -65,7 +67,7 @@ class StockPicking(controller.Controller): res_pickings = [] for picking in stock_pickings: manifests = picking.get_manifests() - + res_pickings.append({ 'id': picking.id, 'name': picking.name, @@ -86,12 +88,12 @@ class StockPicking(controller.Controller): 'summary': { 'pending_count': picking_model.search_count(default_domain + pending_domain), 'shipment_count': picking_model.search_count(default_domain + shipment_domain + shipment_domain2), - 'completed_count': picking_model.search_count(default_domain + completed_domain ) + 'completed_count': picking_model.search_count(default_domain + completed_domain) }, 'picking_total': picking_model.search_count(domain), 'pickings': res_pickings }) - + @http.route(PREFIX_PARTNER + 'stock-picking//tracking', auth='public', method=['GET', 'OPTIONS']) @controller.Controller.must_authorized(private=True, private_key='partner_id') def get_partner_stock_picking_detail_tracking(self, **kw): @@ -140,13 +142,13 @@ class StockPicking(controller.Controller): return self.response({ 'name': picking_data.name }) - - @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) + + @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) def udpate_status_from_bitehsip(self, **kw): try: if not request.jsonrequest: return "ok" - + data = request.jsonrequest # Ambil data JSON dari request event = data.get('event') @@ -163,14 +165,16 @@ class StockPicking(controller.Controller): return {'success': False, 'message': str(e)} def process_order_status(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) + picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], + limit=1) if data.get('status') == 'picked': picking_model.write({'driver_departure_date': datetime.utcnow()}) elif data.get('status') == 'delivered': picking_model.write({'driver_arrival_date': datetime.utcnow()}) - + def process_order_price(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) + picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], + limit=1) order = request.env['sale.order'].sudo().search([('name', '=', picking_model.sale_id.name)], limit=1) if order: order.write({ @@ -178,11 +182,11 @@ class StockPicking(controller.Controller): }) def process_order_waybill(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) + picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], + limit=1) if picking_model: picking_model.write({ - 'biteship_waybill_id': data.get('courier_waybill_id'), - 'delivery_tracking_no': data.get('courier_waybill_id'), - 'biteship_tracking_id':data.get('courier_tracking_id') - }) - \ No newline at end of file + 'biteship_waybill_id': data.get('courier_waybill_id'), + 'delivery_tracking_no': data.get('courier_waybill_id'), + 'biteship_tracking_id': data.get('courier_tracking_id') + }) -- cgit v1.2.3 From c73872a03e13203b0e335cef9270ca296363de61 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 31 May 2025 12:52:01 +0700 Subject: (andri) try add webhook --- indoteknik_api/controllers/api_v1/stock_picking.py | 54 +++++++++++++++------- 1 file changed, 38 insertions(+), 16 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index efcc56eb..61880132 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -143,26 +143,48 @@ class StockPicking(controller.Controller): 'name': picking_data.name }) + # @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) + # def udpate_status_from_bitehsip(self, **kw): + # try: + # if not request.jsonrequest: + # return "ok" + + # data = request.jsonrequest # Ambil data JSON dari request + # event = data.get('event') + + # # Handle Event Berdasarkan Jenisnya + # if event == "order.status": + # self.process_order_status(data) + # elif event == "order.price": + # self.process_order_price(data) + # elif event == "order.waybill_id": + # self.process_order_waybill(data) + + # return {'success': True, 'message': f'Webhook {event} received'} + # except Exception as e: + # return {'success': False, 'message': str(e)} + @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) def udpate_status_from_bitehsip(self, **kw): try: - if not request.jsonrequest: - return "ok" - - data = request.jsonrequest # Ambil data JSON dari request - event = data.get('event') - - # Handle Event Berdasarkan Jenisnya - if event == "order.status": - self.process_order_status(data) - elif event == "order.price": - self.process_order_price(data) - elif event == "order.waybill_id": - self.process_order_waybill(data) - - return {'success': True, 'message': f'Webhook {event} received'} + # Selalu return "ok" dulu biar bisa daftar webhook + return "ok" + + # TODO: Uncomment code dibawah setelah webhook berhasil terdaftar + # data = request.jsonrequest + # event = data.get('event') + + # if event == "order.status": + # self.process_order_status(data) + # elif event == "order.price": + # self.process_order_price(data) + # elif event == "order.waybill_id": + # self.process_order_waybill(data) + + # return {'success': True, 'message': f'Webhook {event} received'} + except Exception as e: - return {'success': False, 'message': str(e)} + return "ok" def process_order_status(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], -- cgit v1.2.3 From 484b0e613d0d021faa11c619087baf36e4eacd09 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 31 May 2025 12:54:22 +0700 Subject: (andri) rev add webhook --- indoteknik_api/controllers/api_v1/stock_picking.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 61880132..49547779 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -166,25 +166,7 @@ class StockPicking(controller.Controller): @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) def udpate_status_from_bitehsip(self, **kw): - try: - # Selalu return "ok" dulu biar bisa daftar webhook - return "ok" - - # TODO: Uncomment code dibawah setelah webhook berhasil terdaftar - # data = request.jsonrequest - # event = data.get('event') - - # if event == "order.status": - # self.process_order_status(data) - # elif event == "order.price": - # self.process_order_price(data) - # elif event == "order.waybill_id": - # self.process_order_waybill(data) - - # return {'success': True, 'message': f'Webhook {event} received'} - - except Exception as e: - return "ok" + return "ok" def process_order_status(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], -- cgit v1.2.3 From 8723d21169e32272addb7285163ddfa45682ac14 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 2 Jun 2025 09:31:21 +0700 Subject: (andri) test add webhook --- indoteknik_api/controllers/api_v1/stock_picking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 49547779..be49bcdb 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -164,7 +164,7 @@ class StockPicking(controller.Controller): # except Exception as e: # return {'success': False, 'message': str(e)} - @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) + @http.route(prefix + 'webhook/biteship', auth='public', methods=['POST'], csrf=False) def udpate_status_from_bitehsip(self, **kw): return "ok" -- cgit v1.2.3 From b9846c274cfbe4fb23a6c86469fde5ca3d73d54b Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 3 Jun 2025 10:11:50 +0700 Subject: push --- indoteknik_api/controllers/api_v1/stock_picking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index be49bcdb..7cbd3c96 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -164,9 +164,9 @@ class StockPicking(controller.Controller): # except Exception as e: # return {'success': False, 'message': str(e)} - @http.route(prefix + 'webhook/biteship', auth='public', methods=['POST'], csrf=False) - def udpate_status_from_bitehsip(self, **kw): - return "ok" + # @http.route(prefix + 'webhook/biteship', auth='public', methods=['POST'], csrf=False) + # def udpate_status_from_bitehsip(self, **kw): + # return "ok" def process_order_status(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], -- cgit v1.2.3 From 6d222cdfb56df09e61cd3add3c3fb328bd9adc7b Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Fri, 20 Jun 2025 14:20:57 +0700 Subject: (andri) patch json agar odoo menerima response kosong dari biteship --- indoteknik_api/controllers/api_v1/stock_picking.py | 58 ++++++++++++++-------- 1 file changed, 37 insertions(+), 21 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index c5a4f7ed..0926bd26 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -1,10 +1,12 @@ from .. import controller from odoo import http -from odoo.http import request +from odoo.http import request, Response from pytz import timezone from datetime import datetime import json +import logging +_logger = logging.getLogger(__name__) class StockPicking(controller.Controller): prefix = '/api/v1/' @@ -143,26 +145,40 @@ class StockPicking(controller.Controller): 'name': picking_data.name }) - # @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) - # def udpate_status_from_bitehsip(self, **kw): - # try: - # if not request.jsonrequest: - # return "ok" - - # data = request.jsonrequest # Ambil data JSON dari request - # event = data.get('event') - - # # Handle Event Berdasarkan Jenisnya - # if event == "order.status": - # self.process_order_status(data) - # elif event == "order.price": - # self.process_order_price(data) - # elif event == "order.waybill_id": - # self.process_order_waybill(data) - - # return {'success': True, 'message': f'Webhook {event} received'} - # except Exception as e: - # return {'success': False, 'message': str(e)} + + @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) + def update_status_from_biteship(self, **kw): + _logger.info("Biteship Webhook: Request received at controller start (type='json').") + + try: + # Karena type='json', Odoo secara otomatis akan mem-parsing JSON untuk Anda. + # 'data' akan berisi dictionary Python dari payload JSON Biteship. + data = request.jsonrequest + + # Log ini akan menunjukkan payload yang diterima (sudah dalam bentuk dict) + _logger.info(f"Biteship Webhook: Parsed JSON data from request.jsonrequest: {json.dumps(data)}") + + event = data.get('event') + if event: + _logger.info(f"Biteship Webhook: Processing event: {event}") + if event == "order.status": + self.process_order_status(data) + elif event == "order.price": + self.process_order_price(data) + elif event == "order.waybill_id": + self.process_order_waybill(data) + # Tambahkan logika untuk event lain jika ada + else: + _logger.info("Biteship Webhook: No specific event in payload. Likely an installation/verification ping or unknown event type.") + + # Untuk route type='json', Anda cukup mengembalikan dictionary Python. + # Odoo akan secara otomatis mengonversinya menjadi respons JSON yang valid. + return {'status': 'ok'} + + except Exception as e: + _logger.error(f"Biteship Webhook: Unhandled error during processing: {e}", exc_info=True) + # Untuk error, kembalikan dictionary error juga, Odoo akan mengonversinya ke JSON + return {'status': 'error', 'message': str(e)} # @http.route(prefix + 'webhook/biteship', auth='public', methods=['POST'], csrf=False) # def udpate_status_from_bitehsip(self, **kw): -- cgit v1.2.3 From 6e8591a6bd28c4faafc08eb9c539fe24bdecf419 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Fri, 20 Jun 2025 16:06:00 +0700 Subject: (andri) tracking webhook aktif dan menggantikan peran button sebelumnya --- indoteknik_api/controllers/api_v1/stock_picking.py | 33 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 0926bd26..09d0c585 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -184,13 +184,34 @@ class StockPicking(controller.Controller): # def udpate_status_from_bitehsip(self, **kw): # return "ok" + # def process_order_status(self, data): + # picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], + # limit=1) + # if data.get('status') == 'picked': + # picking_model.write({'driver_departure_date': datetime.utcnow()}) + # elif data.get('status') == 'delivered': + # picking_model.write({'driver_arrival_date': datetime.utcnow()}) + def process_order_status(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], - limit=1) - if data.get('status') == 'picked': - picking_model.write({'driver_departure_date': datetime.utcnow()}) - elif data.get('status') == 'delivered': - picking_model.write({'driver_arrival_date': datetime.utcnow()}) + picking = request.env['stock.picking'].sudo().search([ + ('biteship_id', '=', data.get('order_id')) + ], limit=1) + + if not picking: + _logger.warning(f"[Webhook] Tidak ditemukan picking untuk order_id {data.get('order_id')}") + return + + status = data.get('status') + timestamp = data.get('updated_at') or datetime.utcnow().isoformat() + + description = picking._get_biteship_status_description(status, { + "courier": {"company": data.get("courier_company", "")}, + "destination": {"contact_name": picking.partner_id.name or ""} + }) + + picking.log_biteship_event_from_webhook(status, timestamp, description) + + def process_order_price(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], -- cgit v1.2.3 From 47f83eefa28e7902c4f91c03ac6cd2f71a56e67d Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 21 Jun 2025 11:02:58 +0700 Subject: (andri) penyesuaian informasi delivery (biteship) pada BU OUT --- indoteknik_api/controllers/api_v1/stock_picking.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 09d0c585..9b2b5fe1 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -209,7 +209,17 @@ class StockPicking(controller.Controller): "destination": {"contact_name": picking.partner_id.name or ""} }) - picking.log_biteship_event_from_webhook(status, timestamp, description) + # Tambahkan extra data dari webhook + extra_data = { + "courier_driver_name": data.get("courier_driver_name"), + "courier_driver_phone": data.get("courier_driver_phone"), + "courier_driver_plate_number": data.get("courier_driver_plate_number"), + "courier_link": data.get("courier_link"), + "order_price": data.get("order_price"), + "status": data.get("status"), + } + + picking.log_biteship_event_from_webhook(status, timestamp, description, extra_data=extra_data) -- cgit v1.2.3 From a81685c4bf1508d72e0fc359fc9dfd73c6c1a719 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 21 Jun 2025 15:23:37 +0700 Subject: (andri) revisi order price webhook --- indoteknik_api/controllers/api_v1/stock_picking.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 9b2b5fe1..da18e16a 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -226,11 +226,13 @@ class StockPicking(controller.Controller): def process_order_price(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) - order = request.env['sale.order'].sudo().search([('name', '=', picking_model.sale_id.name)], limit=1) - if order: - order.write({ - 'delivery_amt': data.get('price') - }) + if not picking_model: + _logger.warning(f"Tidak ditemukan picking untuk order_id {data.get('order_id')}") + return + + picking_model.write({ + 'biteship_shipping_price': data.get('price') + }) def process_order_waybill(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], -- cgit v1.2.3 From fc6d38599b405820b3c266a31ef21a3a0f3f0a73 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 5 Jul 2025 10:51:52 +0700 Subject: (andri) fix --- indoteknik_api/controllers/api_v1/stock_picking.py | 60 +++++++++++++--------- 1 file changed, 36 insertions(+), 24 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index c5a4f7ed..1b247c8a 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -4,6 +4,9 @@ from odoo.http import request from pytz import timezone from datetime import datetime import json +import logging + +_logger = logging.getLogger(__name__) class StockPicking(controller.Controller): @@ -143,30 +146,39 @@ class StockPicking(controller.Controller): 'name': picking_data.name }) - # @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) - # def udpate_status_from_bitehsip(self, **kw): - # try: - # if not request.jsonrequest: - # return "ok" - - # data = request.jsonrequest # Ambil data JSON dari request - # event = data.get('event') - - # # Handle Event Berdasarkan Jenisnya - # if event == "order.status": - # self.process_order_status(data) - # elif event == "order.price": - # self.process_order_price(data) - # elif event == "order.waybill_id": - # self.process_order_waybill(data) - - # return {'success': True, 'message': f'Webhook {event} received'} - # except Exception as e: - # return {'success': False, 'message': str(e)} - - # @http.route(prefix + 'webhook/biteship', auth='public', methods=['POST'], csrf=False) - # def udpate_status_from_bitehsip(self, **kw): - # return "ok" + @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False) + def update_status_from_biteship(self, **kw): + _logger.info("Biteship Webhook: Request received at controller start (type='json').") + + try: + # Karena type='json', Odoo secara otomatis akan mem-parsing JSON untuk Anda. + # 'data' akan berisi dictionary Python dari payload JSON Biteship. + data = request.jsonrequest + + # Log ini akan menunjukkan payload yang diterima (sudah dalam bentuk dict) + _logger.info(f"Biteship Webhook: Parsed JSON data from request.jsonrequest: {json.dumps(data)}") + + event = data.get('event') + if event: + _logger.info(f"Biteship Webhook: Processing event: {event}") + if event == "order.status": + self.process_order_status(data) + elif event == "order.price": + self.process_order_price(data) + elif event == "order.waybill_id": + self.process_order_waybill(data) + # Tambahkan logika untuk event lain jika ada + else: + _logger.info("Biteship Webhook: No specific event in payload. Likely an installation/verification ping or unknown event type.") + + # Untuk route type='json', Anda cukup mengembalikan dictionary Python. + # Odoo akan secara otomatis mengonversinya menjadi respons JSON yang valid. + return {'status': 'ok'} + + except Exception as e: + _logger.error(f"Biteship Webhook: Unhandled error during processing: {e}", exc_info=True) + # Untuk error, kembalikan dictionary error juga, Odoo akan mengonversinya ke JSON + return {'status': 'error', 'message': str(e)} def process_order_status(self, data): picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], -- cgit v1.2.3 From a78f8184c2e7d45a65315eff0ea354996adb9cce Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 5 Jul 2025 15:54:17 +0700 Subject: (andri) info tambahan webhook --- indoteknik_api/controllers/api_v1/stock_picking.py | 44 +++++++++++++++------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/stock_picking.py') diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index 0525adc3..85b0fbba 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -213,22 +213,38 @@ class StockPicking(controller.Controller): def process_order_price(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], - limit=1) - if not picking_model: + picking = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1) + + if not picking: _logger.warning(f"Tidak ditemukan picking untuk order_id {data.get('order_id')}") return - picking_model.write({ - 'biteship_shipping_price': data.get('price') - }) + picking.log_biteship_event_from_webhook( + status='order.price', + timestamp=data.get('updated_at') or datetime.utcnow().isoformat(), + description='Biaya pengiriman telah diperbarui berdasarkan informasi terbaru dari Biteship.', + extra_data={ + "order_price": data.get("price") + } + ) + def process_order_waybill(self, data): - picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], - limit=1) - if picking_model: - picking_model.write({ - 'biteship_waybill_id': data.get('courier_waybill_id'), - 'delivery_tracking_no': data.get('courier_waybill_id'), - 'biteship_tracking_id': data.get('courier_tracking_id') - }) + picking = request.env['stock.picking'].sudo().search([ + ('biteship_id', '=', data.get('order_id')) + ], limit=1) + + if not picking: + _logger.warning(f"Tidak ditemukan picking untuk order_id {data.get('order_id')}") + return + + picking.log_biteship_event_from_webhook( + status='order.waybill_id', + timestamp=data.get('updated_at') or datetime.utcnow().isoformat(), + description="Nomor waybill dan tracking diperbarui melalui Biteship.", + extra_data={ + "tracking_id": data.get("courier_tracking_id"), + "waybill_id": data.get("courier_waybill_id") + } + ) + -- cgit v1.2.3