diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-07-14 13:09:29 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-07-14 13:09:29 +0700 |
| commit | 6bd30cc76c8d822840a6063959bfe50c6625fd12 (patch) | |
| tree | 890fd4b46c8697fdb4763e4fbdcbc47a9713de9c /indoteknik_api | |
| parent | 717dbfa7070e94c0af2bb39e2cebb4dc71d123b9 (diff) | |
| parent | b70acc8a458e9544f672ecc9549eb1fc3606bc35 (diff) | |
<miqdad> merge
Diffstat (limited to 'indoteknik_api')
| -rw-r--r-- | indoteknik_api/controllers/api_v1/stock_picking.py | 140 |
1 files changed, 97 insertions, 43 deletions
diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py index c5a4f7ed..85b0fbba 100644 --- a/indoteknik_api/controllers/api_v1/stock_picking.py +++ b/indoteknik_api/controllers/api_v1/stock_picking.py @@ -1,10 +1,14 @@ 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__) + +_logger = logging.getLogger(__name__) class StockPicking(controller.Controller): prefix = '/api/v1/' @@ -143,54 +147,104 @@ 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" + @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)} - # data = request.jsonrequest # Ambil data JSON dari request - # event = data.get('event') + def process_order_status(self, data): + picking = request.env['stock.picking'].sudo().search([ + ('biteship_id', '=', data.get('order_id')) + ], limit=1) - # # 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) + if not picking: + _logger.warning(f"[Webhook] Tidak ditemukan picking untuk order_id {data.get('order_id')}") + return - # return {'success': True, 'message': f'Webhook {event} received'} - # except Exception as e: - # return {'success': False, 'message': str(e)} + 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 ""} + }) + + # 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) - # @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'))], - 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) - order = request.env['sale.order'].sudo().search([('name', '=', picking_model.sale_id.name)], limit=1) - if order: - order.write({ - 'delivery_amt': data.get('price') - }) + 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.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") + } + ) + |
