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') 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') 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/product.py | 74 ++++++++++++++++++++-- indoteknik_api/controllers/api_v1/stock_picking.py | 16 +++-- 2 files changed, 78 insertions(+), 12 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index a88c3368..260dd462 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -96,22 +96,25 @@ class Product(controller.Controller): }) @http.route(prefix + 'product_variant//stock', auth='public', methods=['GET', 'OPTIONS']) - @controller.Controller.must_authorized() + @controller.Controller.must_authorized() def get_product_template_stock_by_id(self, **kw): id = int(kw.get('id')) date_7_days_ago = datetime.now() - timedelta(days=7) - product = request.env['product.product'].search( - [('id', '=', id)], limit=1) + product_pruchase = request.env['purchase.pricelist'].search([ + ('product_id', '=', id), + ('is_winner', '=', True) + ]) product_sla = request.env['product.sla'].search( [('product_variant_id', '=', id)], limit=1) stock_vendor = request.env['stock.vendor'].search([ ('product_variant_id', '=', id), ('write_date', '>=', date_7_days_ago.strftime("%Y-%m-%d %H:%M:%S")) ], limit=1) + + product = product_pruchase.product_id qty_available = product.qty_free_bandengan - if qty_available < 1 : qty_available = 0 @@ -157,7 +160,68 @@ class Product(controller.Controller): 'sla_date': sla_date } - return self.response(data, headers=[('Cache-Control', 'max-age=600, private')]) + return self.response(data, headers=[('Cache-Control', 'max-age=600, private')]) + # def get_product_template_stock_by_id(self, **kw): + # id = int(kw.get('id')) + # date_7_days_ago = datetime.now() - timedelta(days=7) + # product = request.env['product.product'].search( + # [('id', '=', id)], limit=1) + # product_sla = request.env['product.sla'].search( + # [('product_variant_id', '=', id)], limit=1) + # stock_vendor = request.env['stock.vendor'].search([ + # ('product_variant_id', '=', id), + # ('write_date', '>=', date_7_days_ago.strftime("%Y-%m-%d %H:%M:%S")) + # ], limit=1) + + # qty_available = product.qty_free_bandengan + + + # if qty_available < 1 : + # qty_available = 0 + + # qty = 0 + # sla_date = '-' + + # # Qty Stock Vendor + # qty_vendor = stock_vendor.quantity + # qty_vendor -= int(qty_vendor * 0.1) + # qty_vendor = math.ceil(float(qty_vendor)) + # total_excell = qty_vendor + + # is_altama_product = product.x_manufacture.id in [10, 122, 89] + # if is_altama_product: + # try: + # # Qty Altama + # qty_altama = request.env['product.template'].get_stock_altama( + # product.default_code) + # qty_altama -= int(qty_altama * 0.1) + # qty_altama = math.ceil(float(qty_altama)) + # total_adem = qty_altama + + # if qty_available > 0: + # qty = qty_available + total_adem + total_excell + # sla_date = product_sla.sla or 1 + # elif qty_altama > 0 or qty_vendor > 0: + # qty = total_adem if qty_altama > 0 else total_excell + # sla_date = product_sla.sla + # else: + # sla_date = product_sla.sla + # except: + # print('error') + # else: + # if qty_available > 0: + # qty = qty_available + # sla_date = product_sla.sla or 'Indent' + # elif qty_vendor > 0: + # qty = total_excell + # sla_date = '2-4 Hari' + + # data = { + # 'qty': qty, + # 'sla_date': sla_date + # } + + # return self.response(data, headers=[('Cache-Control', 'max-age=600, private')]) @http.route(prefix + 'product_variant//qty_available', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() 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 a76389076431e63519835656eebdba4e4d0eda3a Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Mon, 21 Apr 2025 11:57:38 +0700 Subject: feedback renca --- indoteknik_api/controllers/api_v1/product.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index 260dd462..7d5fc580 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -104,14 +104,24 @@ class Product(controller.Controller): ('product_id', '=', id), ('is_winner', '=', True) ]) - product_sla = request.env['product.sla'].search( - [('product_variant_id', '=', id)], limit=1) stock_vendor = request.env['stock.vendor'].search([ ('product_variant_id', '=', id), ('write_date', '>=', date_7_days_ago.strftime("%Y-%m-%d %H:%M:%S")) ], limit=1) product = product_pruchase.product_id + + vendor_sla = request.env['vendor.sla'].search([('id_vendor', '=', product_pruchase.vendor_id.id)], limit=1) + slatime = 15 + if vendor_sla: + if vendor_sla.unit == 'hari': + vendor_duration = vendor_sla.duration * 24 * 60 + else : + vendor_duration = vendor_sla.duration * 60 + + estimation_sla = (1 * 24 * 60) + vendor_duration + estimation_sla_days = estimation_sla / (24 * 60) + slatime = math.ceil(estimation_sla_days) qty_available = product.qty_free_bandengan @@ -119,7 +129,7 @@ class Product(controller.Controller): qty_available = 0 qty = 0 - sla_date = '-' + sla_date = f'{slatime} Hari' # Qty Stock Vendor qty_vendor = stock_vendor.quantity @@ -139,21 +149,21 @@ class Product(controller.Controller): if qty_available > 0: qty = qty_available + total_adem + total_excell - sla_date = product_sla.sla or 1 + sla_date = '1 Hari' elif qty_altama > 0 or qty_vendor > 0: qty = total_adem if qty_altama > 0 else total_excell - sla_date = product_sla.sla + sla_date = f'{slatime} Hari' else: - sla_date = product_sla.sla + sla_date = f'{slatime} Hari' except: print('error') else: if qty_available > 0: qty = qty_available - sla_date = product_sla.sla or 'Indent' + sla_date = f'{slatime} Hari' elif qty_vendor > 0: qty = total_excell - sla_date = '2-4 Hari' + sla_date = f'{slatime} Hari' data = { 'qty': qty, -- cgit v1.2.3 From d9d8b9f3afc0ad60ca1199b08ab6e2836663a0de Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Thu, 24 Apr 2025 13:54:06 +0700 Subject: fixing revisi renca --- indoteknik_api/controllers/api_v1/product.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index 7d5fc580..7d6ebdb6 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -51,7 +51,7 @@ class Product(controller.Controller): additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date) include_instant = True - if(len(products) != len(product_ids)): + if(len(products) == len(product_ids)): products_data_params = {product["id"] : product for product in product_data } all_fast_products = all( -- cgit v1.2.3 From 914705630f61f2e02f15ee24a479191e945a0f22 Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Sat, 26 Apr 2025 08:39:32 +0700 Subject: handle bugs additional time when checkout > 15.00 --- indoteknik_api/controllers/api_v1/product.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index 7d6ebdb6..bd969f67 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -2,6 +2,7 @@ from .. import controller from odoo import http from odoo.http import request, Response from datetime import datetime, timedelta +import pytz import ast import logging import math @@ -46,8 +47,9 @@ class Product(controller.Controller): ('product_id', 'in', product_ids), ('is_winner', '=', True) ]) - - start_date = datetime.today().date() + jakarta = pytz.timezone("Asia/Jakarta") + start_date = datetime.now(jakarta) + print(start_date.strftime('%H:%M')) additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date) include_instant = True @@ -64,7 +66,7 @@ class Product(controller.Controller): 'include_instant': include_instant, 'sla_duration': 1, 'sla_additional_days': additional_days, - 'sla_total' : int(1) + int(additional_days), + 'sla_total' : int(additional_days), 'sla_unit': 'Hari' }) @@ -160,7 +162,7 @@ class Product(controller.Controller): else: if qty_available > 0: qty = qty_available - sla_date = f'{slatime} Hari' + sla_date = f'1 Hari' elif qty_vendor > 0: qty = total_excell sla_date = f'{slatime} Hari' -- cgit v1.2.3 From 509eb9406e6c48caf3e6366c3d8ac60643b71546 Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Tue, 29 Apr 2025 09:09:05 +0700 Subject: fixing jam 15 --- indoteknik_api/controllers/api_v1/product.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index bd969f67..0c26f064 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -66,7 +66,7 @@ class Product(controller.Controller): 'include_instant': include_instant, 'sla_duration': 1, 'sla_additional_days': additional_days, - 'sla_total' : int(additional_days), + 'sla_total' : 1 + int(additional_days), 'sla_unit': 'Hari' }) -- cgit v1.2.3 From c77d250353dbed0ba1ec5cd8abd940ba95a011fc Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Wed, 30 Apr 2025 13:55:26 +0700 Subject: handle 15am dan holidays --- indoteknik_api/controllers/api_v1/product.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index 0c26f064..9566ed05 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -49,7 +49,9 @@ class Product(controller.Controller): ]) jakarta = pytz.timezone("Asia/Jakarta") start_date = datetime.now(jakarta) - print(start_date.strftime('%H:%M')) + additional_days_after_3pm = request.env['sale.order'].handling_order_after_3pm(start_date) + start_date += timedelta(days=additional_days_after_3pm) + additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date) include_instant = True -- cgit v1.2.3 From 7897614cee8a347dfdd933df72db95859cb1a558 Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Wed, 30 Apr 2025 16:43:38 +0700 Subject: fixing handle 15 pm, weekend, and holidays --- indoteknik_api/controllers/api_v1/product.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index 9566ed05..ecd37cda 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -49,10 +49,9 @@ class Product(controller.Controller): ]) jakarta = pytz.timezone("Asia/Jakarta") start_date = datetime.now(jakarta) - additional_days_after_3pm = request.env['sale.order'].handling_order_after_3pm(start_date) - start_date += timedelta(days=additional_days_after_3pm) additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date) + include_instant = True if(len(products) == len(product_ids)): @@ -67,8 +66,8 @@ class Product(controller.Controller): return self.response({ 'include_instant': include_instant, 'sla_duration': 1, - 'sla_additional_days': additional_days, - 'sla_total' : 1 + int(additional_days), + 'sla_additional_days': int(additional_days), + 'sla_total' : int(additional_days), 'sla_unit': 'Hari' }) -- cgit v1.2.3 From 847a025e889ae9dcfe9ff97c913c9310695fc2c5 Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Fri, 16 May 2025 08:46:53 +0700 Subject: handle is 3 pm --- indoteknik_api/controllers/api_v1/product.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index ecd37cda..e97a7ff8 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -50,7 +50,8 @@ class Product(controller.Controller): jakarta = pytz.timezone("Asia/Jakarta") start_date = datetime.now(jakarta) - additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date) + offset, is3pm = request.env['sale.order'].get_days_until_next_business_day(start_date) + additional_days = offset include_instant = True -- cgit v1.2.3 From 48a2eae94b66f7bb8916dcd984bce17fbb36d45e Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Fri, 23 May 2025 09:44:34 +0700 Subject: (andri) add flag di API untuk mengetahui quotation SO dibuat dari website atau bukan --- indoteknik_api/controllers/api_v1/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 98b13cad..065dddbb 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -438,7 +438,7 @@ class SaleOrder(controller.Controller): if params['value']['type'] == 'sale_order': parameters['approval_status'] = 'pengajuan1' - sale_order = request.env['sale.order'].create([parameters]) + sale_order = request.env['sale.order'].with_context(from_website_checkout=True).create([parameters]) sale_order.onchange_partner_contact() user_id = params['value']['user_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') 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') 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') 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') 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') 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 2760b81f8a650ea95d36c125d1ab4e2feb011e44 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 9 Jun 2025 17:12:48 +0700 Subject: (andri) fix berat produk jika transaksi dari website --- indoteknik_api/controllers/api_v1/sale_order.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 12eac2e5..e1c643e5 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -481,6 +481,7 @@ class SaleOrder(controller.Controller): 'product_available_quantity': cart['available_quantity'] }) order_line.product_id_change() + order_line.weight = order_line.product_id.weight order_line.onchange_vendor_id() order_line.price_unit = cart['price']['price'] order_line.discount = cart['price']['discount_percentage'] @@ -516,6 +517,7 @@ class SaleOrder(controller.Controller): elif sale_order._requires_approval_margin_manager(): sale_order.approval_status = 'pengajuan1' # user_cart.browse(cart_ids).unlink() + sale_order._auto_set_shipping_from_website() return self.response({ 'id': sale_order.id, 'name': sale_order.name -- cgit v1.2.3 From 762444b0e678b160108c4f12d63c7896ce0a132b Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Thu, 12 Jun 2025 14:52:46 +0700 Subject: (hafid) fix tidak bisa edit alamat pada website --- indoteknik_api/controllers/api_v1/partner.py | 182 +++++++++++++++------------ 1 file changed, 99 insertions(+), 83 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py index 126fded4..c0f8f630 100644 --- a/indoteknik_api/controllers/api_v1/partner.py +++ b/indoteknik_api/controllers/api_v1/partner.py @@ -61,46 +61,48 @@ class Partner(controller.Controller): partner = request.env['res.users'].api_address_response(partner) return self.response(partner) - @http.route(prefix + 'partner//address', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) + @http.route(prefix + 'partner//address', type="json", auth='public', methods=['PUT', 'OPTIONS'], csrf=False, cors='*') @controller.Controller.must_authorized() - def write_partner_address_by_id(self, **kw): + def write_partner_address_by_id(self, id, **kw): + headers = { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': '*' + } + if request.httprequest.method == 'OPTIONS': + return Response(status=200, headers=headers) try: - params = self.get_request_params(kw, { - 'id': ['required', 'number'], - 'type': ['default:other'], - 'name': ['required'], - 'email': ['required'], - 'mobile': ['required'], - 'phone': [''], - 'street': ['required'], - 'state_id': ['required', 'number', 'alias:state_id'], - 'city_id': ['required', 'number', 'alias:kota_id'], - 'district_id': ['number', 'alias:kecamatan_id'], - 'sub_district_id': ['number', 'alias:kelurahan_id', 'exclude_if_null'], - 'zip': ['required'], - 'longtitude': '', - 'latitude': '', - 'address_map': [], - 'alamat_lengkap_text': [] - }) + params = self.get_request_params(request.jsonrequest, { + 'id': ['required', 'number'], + 'type': ['default:other'], + 'name': ['required'], + 'email': ['required'], + 'mobile': ['required'], + 'phone': [''], + 'street': ['required'], + 'state_id': ['required', 'alias:state_id'], + 'city_id': ['required', 'alias:kota_id'], + 'district_id': ['alias:kecamatan_id'], + 'sub_district_id': ['alias:kelurahan_id', 'exclude_if_null'], + 'zip': ['required'], + 'longtitude': '', + 'latitude': '', + 'address_map': [], + 'alamat_lengkap_text': [] + }) if not params['valid']: - return self.response(code=400, description=params) - - partner = request.env[self._name].sudo().search([('id', '=', params['value']['id'])], limit=1) + return {'headers' : headers,'code': 400, 'description': params} + partner = request.env['res.partner'].sudo().search([('id', '=', id)], limit=1) if not partner: - return self.response(code=404, description='User not found') - - try: - partner.write(params['value']) - except Exception as e: - return self.response(code=500, description=f'Error writing partner data: {str(e)}') + return {'headers' : headers,'code': 404, 'description': 'User not found'} - return self.response({'id': partner.id}) + partner.write(params['value']) + return {'id': partner.id, 'headers' : headers} except Exception as e: - return self.response(code=500, description=f'Unexpected error: {str(e)}') + return {'headers' : headers,'code': 500, 'description': f'Internal Error: {str(e)}'} @http.route(prefix + 'partner/address', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() @@ -132,69 +134,83 @@ class Partner(controller.Controller): 'id': partner.id, }) - @http.route(prefix + 'partner/', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) + @http.route(prefix + 'partner/', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() - def write_partner_by_id(self, **kw): - params = self.get_request_params(kw, { - 'id': ['', 'number'], - 'name': [], - 'company_type_id': ['number'], - 'industry_id': ['number'], - 'tax_name': ['alias:nama_wajib_pajak'], - 'npwp': [], - 'alamat_lengkap_text': [], - 'street': [], - 'email': [], - 'mobile': [] - }) - id_user = self.get_request_params(kw, { - 'id_user': ['number'] - }) - params_user = self.get_request_params(kw, { - 'company_type_id': ['number'], - 'industry_id': ['number'], - 'tax_name': ['alias:nama_wajib_pajak'], - 'npwp': [], - 'alamat_lengkap_text': [], - }) + def write_partner_by_id(self, id, **kw): + try: + # Ambil data JSON langsung + request_data = kw + + partner = request.env['res.partner'].sudo().browse(id) + if not partner.exists(): + return self.response({ + 'code': 400, + 'description': 'Partner not found' + }) - if not params['valid']: - return self.response(code=400, description=params) + partner_params = self.get_request_params(request_data, { + 'tax_name': ['alias:nama_wajib_pajak'], + 'company_type_id': ['number'], + 'industry_id': ['number'], + 'npwp': [], + 'alamat_lengkap_text': [], + 'street': [], + 'email': [], + 'mobile': [] + }) - partner = request.env[self._name].search([('id', '=', params['value']['id'])], limit=1) - user = request.env[self._name].search([('id', '=', id_user['value']['id_user'])], limit=1) - if not partner: - return self.response(code=404, description='Partner not found') + if not partner_params['valid']: + return self.response({ + 'code': 400, + 'description': partner_params + }) - if not params['value'].get('tax_name'): - params['value']['nama_wajib_pajak'] = params['value'].get('name') - params_user['value']['nama_wajib_pajak'] = params_user['value'].get('name') + partner_values = partner_params['value'] - if not params['value'].get('alamat_lengkap_text'): - params['value']['alamat_lengkap_text'] = params['value'].get('street') - params_user['value']['alamat_lengkap_text'] = params_user['value'].get('street') + if 'id_user' in request_data: + user_params = self.get_request_params(request_data, { + 'id_user': ['required', 'number'], + 'company_type_id': ['number'], + 'industry_id': ['number'], + 'tax_name': ['alias:nama_wajib_pajak'], + 'npwp': [], + 'alamat_lengkap_text': [], + }) - if not params['value'].get('npwp'): - params['value']['npwp'] = "00.000.000.0-000.000" - params_user['value']['npwp'] = "00.000.000.0-000.000" + if not user_params['valid']: + return self.response({ + 'code': 400, + 'description': user_params + }) - # Filter parameter yang memiliki nilai saja untuk partner - params_filtered = {k: v for k, v in params['value'].items() if v} + user = request.env['res.partner'].sudo().browse(int(user_params['value']['id_user'])) + if user.exists(): + user_values = user_params['value'] - # Filter parameter yang memiliki nilai saja untuk user - params_user_filtered = {k: v for k, v in params_user['value'].items() if v} + if not user_values.get('tax_name'): + user_values['nama_wajib_pajak'] = user_values.get('name', user.name) - # Update partner dan user hanya dengan parameter yang memiliki nilai - if params_filtered: - partner.write(params_filtered) + if not user_values.get('alamat_lengkap_text'): + user_values['alamat_lengkap_text'] = user_values.get('street', user.street) - if params_user_filtered: - user.write(params_user_filtered) + if not user_values.get('npwp'): + user_values['npwp'] = "00.000.000.0-000.000" - # Return response dengan ID partner yang di-update - return self.response({ - 'id': partner.id - }) + user_values_filtered = {k: v for k, v in user_values.items() if k != 'id_user' and v is not None} + if user_values_filtered: + user.write(user_values_filtered) + + partner.write(partner_values) + + return self.response({ + 'partner_id': partner.id + }) + + except Exception as e: + return self.response({ + 'code': 500, + 'description': f'Internal Error: {str(e)}' + }) @http.route(prefix + 'partner/industry', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() -- cgit v1.2.3 From 626e93d3a0bfad2bc87002d9e0a7ae860ea9baba Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 12 Jun 2025 16:12:02 +0700 Subject: fix pricelist product --- indoteknik_api/controllers/api_v1/cart.py | 35 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/cart.py b/indoteknik_api/controllers/api_v1/cart.py index 7a40b1e2..fdc237cf 100644 --- a/indoteknik_api/controllers/api_v1/cart.py +++ b/indoteknik_api/controllers/api_v1/cart.py @@ -16,24 +16,31 @@ class Cart(controller.Controller): offset = int(kw.get('offset', 0)) query = [('user_id', '=', user_id)] carts = user_cart.search(query, limit=limit, offset=offset, order='create_date desc') - # carts.write({'source': 'add_to_cart'}) + products = [] products_inactive = [] + for cart in carts: - if cart.product_id: - price = cart.product_id._v2_get_website_price_include_tax() - if cart.product_id.active and price > 0: - product = cart.with_context(price_for="web").get_products() - for product_active in product: - products.append(product_active) + try: + if cart.product_id: + price = cart.product_id._v2_get_website_price_include_tax() + + if cart.product_id.active and price > 0: + product = cart.with_context(price_for="web").get_products() + for product_active in product: + products.append(product_active) + else: + product_inactives = cart.with_context(price_for="web").get_products() + for inactives in product_inactives: + products_inactive.append(inactives) else: - product_inactives = cart.with_context(price_for="web").get_products() - for inactives in product_inactives: - products_inactive.append(inactives) - else: - program = cart.with_context(price_for="web").get_products() - for programs in program: - products.append(programs) + program = cart.with_context(price_for="web").get_products() + for programs in program: + products.append(programs) + + except Exception as e: + continue + data = { 'product_total': user_cart.search_count(query), 'products': products, -- cgit v1.2.3 From 6616f73259c9e146449af3f2579263b42270bf8b Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 12 Jun 2025 16:18:32 +0700 Subject: Revert " commit" This reverts commit 95cef4d4d3936f8a612dadf00e83f9cddcccc0dc, reversing changes made to 626e93d3a0bfad2bc87002d9e0a7ae860ea9baba. --- indoteknik_api/controllers/api_v1/stock_picking.py | 6 +++--- 1 file changed, 3 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 7cbd3c96..49547779 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', type='json', 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 741ccc28589388c1214f5da44b9a7d56ef32680c Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 12 Jun 2025 16:19:09 +0700 Subject: Reapply " commit" This reverts commit 6616f73259c9e146449af3f2579263b42270bf8b. --- indoteknik_api/controllers/api_v1/stock_picking.py | 6 +++--- 1 file changed, 3 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 49547779..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', type='json', 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 a921017a829ebef8442740fac964260d98566e6a Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Thu, 12 Jun 2025 19:26:46 +0700 Subject: (andri) try gmaps sebagai pengganti openstreetmaps --- indoteknik_api/controllers/api_v1/partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py index c0f8f630..37ae8d5f 100644 --- a/indoteknik_api/controllers/api_v1/partner.py +++ b/indoteknik_api/controllers/api_v1/partner.py @@ -1,6 +1,6 @@ from .. import controller from odoo import http -from odoo.http import request +from odoo.http import request, Response from odoo import fields import json import base64 -- cgit v1.2.3 From 38ac8a13e20e8197c4f4acce5e667ce3ac51e820 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 19 Jun 2025 13:14:29 +0700 Subject: fix province api --- indoteknik_api/controllers/api_v1/state.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'indoteknik_api/controllers/api_v1') diff --git a/indoteknik_api/controllers/api_v1/state.py b/indoteknik_api/controllers/api_v1/state.py index 958359a7..c03042e7 100644 --- a/indoteknik_api/controllers/api_v1/state.py +++ b/indoteknik_api/controllers/api_v1/state.py @@ -8,12 +8,8 @@ class District(controller.Controller): @http.route(prefix + 'state', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_state(self, **kw): - tempo = kw.get('tempo') - parameters = [] - if tempo == 'true': - parameters.append(('country_id', '=', 100)) + parameters = [('country_id', '=', 100)] # selalu ambil country_id = 100 - name = kw.get('name') if name: name = '%' + name.replace(' ', '%') + '%' @@ -22,7 +18,7 @@ class District(controller.Controller): states = request.env['res.country.state'].search(parameters) data = [] for state in states: - data.append({ 'id': state.id, 'name': state.name}) - + data.append({'id': state.id, 'name': state.name}) + return self.response(data) -- 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') 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') 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') 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') 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') 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') 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