summaryrefslogtreecommitdiff
path: root/indoteknik_api/controllers
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-06-18 11:16:12 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-06-18 11:16:12 +0700
commit1a6ad278493ef88e01485d72ebc697b61aec077a (patch)
treef0db9f96cea9cd2a3e490d01b2dd1e0020fb0bf3 /indoteknik_api/controllers
parent9d7d71f23de6335464d96d2a04ba8b36db620105 (diff)
parentcca31a5f582e097518701a192d4cda88525fc979 (diff)
<hafid> merging & fix tempo
Diffstat (limited to 'indoteknik_api/controllers')
-rw-r--r--indoteknik_api/controllers/api_v1/cart.py35
-rw-r--r--indoteknik_api/controllers/api_v1/partner.py186
-rw-r--r--indoteknik_api/controllers/api_v1/product.py114
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py4
-rw-r--r--indoteknik_api/controllers/api_v1/stock_picking.py2
5 files changed, 222 insertions, 119 deletions
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,
diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py
index 126fded4..b8bd21be 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
@@ -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/<id>/address', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ @http.route(prefix + 'partner/<id>/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/<id>', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ @http.route(prefix + 'partner/<int:id>', 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()
@@ -306,7 +322,7 @@ class Partner(controller.Controller):
data = True if pengajuan_tempo.id else False
return self.response(data)
- @http.route(prefix + 'partner/pengajuan_tempo', auth='public', methods=['POST'], csrf=False)
+ @http.route(prefix + 'partner/pengajuan_tempo', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
def write_pengajuan_tempo(self, **kw):
try:
diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py
index a88c3368..e97a7ff8 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,12 +47,15 @@ class Product(controller.Controller):
('product_id', 'in', product_ids),
('is_winner', '=', True)
])
+ jakarta = pytz.timezone("Asia/Jakarta")
+ start_date = datetime.now(jakarta)
+
+ offset, is3pm = request.env['sale.order'].get_days_until_next_business_day(start_date)
+ additional_days = offset
- start_date = datetime.today().date()
- 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(
@@ -63,8 +67,8 @@ class Product(controller.Controller):
return self.response({
'include_instant': include_instant,
'sla_duration': 1,
- 'sla_additional_days': additional_days,
- 'sla_total' : int(1) + int(additional_days),
+ 'sla_additional_days': int(additional_days),
+ 'sla_total' : int(additional_days),
'sla_unit': 'Hari'
})
@@ -96,27 +100,40 @@ class Product(controller.Controller):
})
@http.route(prefix + 'product_variant/<id>/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_sla = request.env['product.sla'].search(
- [('product_variant_id', '=', id)], limit=1)
+ product_pruchase = request.env['purchase.pricelist'].search([
+ ('product_id', '=', id),
+ ('is_winner', '=', True)
+ ])
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
-
if qty_available < 1 :
qty_available = 0
qty = 0
- sla_date = '-'
+ sla_date = f'{slatime} Hari'
# Qty Stock Vendor
qty_vendor = stock_vendor.quantity
@@ -136,28 +153,89 @@ 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'1 Hari'
elif qty_vendor > 0:
qty = total_excell
- sla_date = '2-4 Hari'
+ sla_date = f'{slatime} Hari'
data = {
'qty': qty,
'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/<id>/qty_available', 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 e8c2c75a..e1c643e5 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -462,7 +462,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']
@@ -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
diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py
index 7cbd3c96..c5a4f7ed 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):
@@ -103,7 +104,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/<id>/tracking', auth='public', method=['GET', 'OPTIONS'])