summaryrefslogtreecommitdiff
path: root/indoteknik_api
diff options
context:
space:
mode:
authortrisusilo48 <tri.susilo@altama.co.id>2025-03-17 09:03:51 +0700
committertrisusilo48 <tri.susilo@altama.co.id>2025-03-17 09:03:51 +0700
commite4d86ee7cb2fac5c09876b1aeefda04f27ebedd0 (patch)
tree024f708d2f1a8635f78ab36892848f74d468e1c9 /indoteknik_api
parent2b1783368e7be632e18be524b5288713125e7902 (diff)
biteship handle sla SO
Diffstat (limited to 'indoteknik_api')
-rw-r--r--indoteknik_api/controllers/api_v1/product.py97
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py2
2 files changed, 52 insertions, 47 deletions
diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py
index ef2d8bf2..a88c3368 100644
--- a/indoteknik_api/controllers/api_v1/product.py
+++ b/indoteknik_api/controllers/api_v1/product.py
@@ -34,63 +34,66 @@ class Product(controller.Controller):
categories.reverse()
return self.response(categories, headers=[('Cache-Control', 'max-age=3600, public')])
- @http.route(prefix + 'product/variants/sla', auth='public', methods=['POST', 'OPTIONS'])
+ @http.route(prefix + 'product/variants/sla', auth='public', methods=['POST', 'OPTIONS'] , csrf=False)
@controller.Controller.must_authorized()
def get_product_template_sla_by_id(self, **kwargs):
- params = kwargs
+ raw_data = kwargs.get('products', '[]')
+ product_data = json.loads(raw_data)
- body_params = kwargs.get('ids')
+ product_ids = [int(item["id"]) for item in product_data]
+ products = request.env['purchase.pricelist'].search([
+ ('product_id', 'in', product_ids),
+ ('is_winner', '=', True)
+ ])
- 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'
+ start_date = datetime.today().date()
+ additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date)
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.'
- )
+ if(len(products) != len(product_ids)):
+ products_data_params = {product["id"] : product for product in product_data }
- # 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 = request.env['sale.order'].get_days_until_next_business_day(start_date)
+ all_fast_products = all(
+ product.product_id.qty_free_bandengan >= products_data_params.get(product.product_id.id, {}).get("quantity", 0)
+ for product in products
+ )
- # Jika semua loop selesai tanpa include_instant menjadi False
+ if all_fast_products:
+ return self.response({
+ 'include_instant': include_instant,
+ 'sla_duration': 1,
+ 'sla_additional_days': additional_days,
+ 'sla_total' : int(1) + int(additional_days),
+ 'sla_unit': 'Hari'
+ })
+
+ max_slatime = 1
+
+ for vendor in products:
+ vendor_sla = request.env['vendor.sla'].search([('id_vendor', '=', vendor.vendor_id.id)], limit=1)
+ slatime = 15
+ if vendor_sla:
+ if vendor_sla.unit == 'hari':
+ vendor_duration = vendor_sla.duration * 24 * 60
+ include_instant = False
+ else :
+ vendor_duration = vendor_sla.duration * 60
+ include_instant = True
+
+ estimation_sla = (1 * 24 * 60) + vendor_duration
+ estimation_sla_days = estimation_sla / (24 * 60)
+ slatime = math.ceil(estimation_sla_days)
+
+ max_slatime = max(max_slatime, slatime)
+
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
- }
- )
+ 'include_instant': include_instant,
+ 'sla_duration': max_slatime,
+ 'sla_additional_days': additional_days,
+ 'sla_total' : int(max_slatime) + int(additional_days),
+ 'sla_unit': 'Hari'
+ })
@http.route(prefix + 'product_variant/<id>/stock', auth='public', methods=['GET', 'OPTIONS'])
@controller.Controller.must_authorized()
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index 6815bf6c..98b13cad 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -466,6 +466,8 @@ class SaleOrder(controller.Controller):
'program_line_id': cart['id'],
'quantity': cart['quantity']
})
+
+ sale_order._compute_etrts_date()
request.env['sale.order.promotion'].create(promotions)