summaryrefslogtreecommitdiff
path: root/indoteknik_api/controllers/api_v1
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_api/controllers/api_v1')
-rw-r--r--indoteknik_api/controllers/api_v1/product.py90
-rw-r--r--indoteknik_api/controllers/api_v1/stock_picking.py42
2 files changed, 119 insertions, 13 deletions
diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py
index 32362582..93ef305c 100644
--- a/indoteknik_api/controllers/api_v1/product.py
+++ b/indoteknik_api/controllers/api_v1/product.py
@@ -1,6 +1,6 @@
from .. import controller
from odoo import http
-from odoo.http import request
+from odoo.http import request, Response
from datetime import datetime, timedelta
import ast
import logging
@@ -9,6 +9,17 @@ import json
_logger = logging.getLogger(__name__)
+def get_days_until_next_business_day(start_date=None, *args, **kwargs):
+ today = start_date or datetime.today().date()
+ offset = 0 # Counter jumlah hari yang ditambahkan
+
+ while today.weekday() >= 5 :
+ today += timedelta(days=1)
+ offset += 1
+
+ return offset
+
+
class Product(controller.Controller):
prefix = '/api/v1/'
@@ -33,9 +44,64 @@ class Product(controller.Controller):
categories.reverse()
return self.response(categories, headers=[('Cache-Control', 'max-age=3600, public')])
-
- @http.route(prefix + 'product_variant/<id>/stock', auth='public', methods=['GET', 'OPTIONS'])
+
+ @http.route(prefix + 'product/variants/sla', auth='public', methods=['GET', 'OPTIONS'])
@controller.Controller.must_authorized()
+ def get_product_template_sla_by_id(self, **kwargs):
+ body_params = kwargs.get('ids')
+
+ if not body_params:
+ return self.response('Failed', code=400, description='id is required')
+
+ ids = [int(id.strip()) for id in body_params.split(',') if id.strip().isdigit()]
+
+ sla_duration = 0
+ sla_unit = 'Hari'
+ include_instant = True
+ products = request.env['product.product'].search([('id', 'in', ids)])
+ if len(products) < 1:
+ return self.response(
+ 'Failed',
+ code=400,
+ description='Produk Tidak Di Temukan.'
+ )
+
+ product_slas = request.env['product.sla'].search([('product_variant_id', 'in', ids)])
+ if len(product_slas) < 1:
+ return self.response(
+ 'Failed',
+ code=400,
+ description='SLA Tidak Di Temukan.'
+ )
+
+ # Mapping SLA untuk mempermudah lookup
+ sla_map = {sla.product_variant_id.id: sla for sla in product_slas}
+
+ for product in products:
+ product_sla = sla_map.get(product.id)
+ if product_sla:
+ sla_duration = max(sla_duration, int(product_sla.sla))
+ sla_unit = product_sla.sla_vendor_id.unit
+ if product.qty_free_bandengan < 1 :
+ if product_sla.sla_vendor_id.unit != 'jam':
+ include_instant = False
+ break
+
+ start_date = datetime.today().date()
+ additional_days = get_days_until_next_business_day(start_date)
+
+ # Jika semua loop selesai tanpa include_instant menjadi False
+ return self.response({
+ 'include_instant': include_instant,
+ 'sla_duration': sla_duration,
+ 'sla_additional_days': additional_days,
+ 'sla_total' : int(sla_duration) + int(additional_days),
+ 'sla_unit': 'Hari' if additional_days > 0 else sla_unit
+ }
+ )
+
+ @http.route(prefix + 'product_variant/<id>/stock', auth='public', methods=['GET', 'OPTIONS'])
+ @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)
@@ -49,10 +115,11 @@ class Product(controller.Controller):
], limit=1)
qty_available = product.qty_free_bandengan
-
- if qty_available < 0:
- qty_available = 0
-
+
+
+ if qty_available < 1 :
+ qty_available = 0
+
qty = 0
sla_date = '-'
@@ -74,24 +141,25 @@ class Product(controller.Controller):
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 = '2-4 Hari'
+ sla_date = product_sla.sla
else:
- sla_date = '3-7 Hari'
+ sla_date = product_sla.sla
except:
print('error')
else:
if qty_available > 0:
qty = qty_available
- sla_date = product_sla.sla or '-'
+ 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,
+ 'sla_date': sla_date
}
return self.response(data, headers=[('Cache-Control', 'max-age=600, private')])
diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py
index 2e0c4ad0..9da9575b 100644
--- a/indoteknik_api/controllers/api_v1/stock_picking.py
+++ b/indoteknik_api/controllers/api_v1/stock_picking.py
@@ -101,7 +101,7 @@ 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/<id>/tracking', auth='public', method=['GET', 'OPTIONS'])
@@ -136,4 +136,42 @@ class StockPicking(controller.Controller):
return self.response({
'name': picking_data.name
- }) \ No newline at end of file
+ })
+
+ @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False)
+ def udpate_status_from_bitehsip(self, **kw):
+ try:
+ data = request.jsonrequest # Ambil data JSON dari request
+ event = data.get('event')
+
+ # Log Webhook ke Model Odoo
+ request.env['webhook.logs'].sudo().create({
+ 'event': event,
+ 'order_id': data.get('order_id'),
+ 'courier_tracking_id': data.get('courier_tracking_id'),
+ 'courier_waybill_id': data.get('courier_waybill_id'),
+ 'status': data.get('status'),
+ 'order_price': data.get('price'),
+ 'cash_on_delivery_fee': data.get('cash_on_delivery_fee'),
+ 'proof_of_delivery_fee': data.get('proof_of_delivery_fee'),
+ 'shippment_fee': data.get('shippment_fee'),
+ })
+
+ # 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)}
+
+ def process_order_status(self, data):
+ """Update status order di Odoo"""
+ order = request.env['sale.order'].sudo().search([('id', '=', data.get('order_id'))], limit=1)
+ if order:
+ order.write({'state': data.get('status')})
+ \ No newline at end of file