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/__init__.py2
-rw-r--r--indoteknik_api/controllers/api_v1/activity.py18
-rw-r--r--indoteknik_api/controllers/api_v1/product.py48
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py143
-rw-r--r--indoteknik_api/controllers/api_v1/voucher.py22
5 files changed, 185 insertions, 48 deletions
diff --git a/indoteknik_api/controllers/api_v1/__init__.py b/indoteknik_api/controllers/api_v1/__init__.py
index d05cdf3a..65bcf926 100644
--- a/indoteknik_api/controllers/api_v1/__init__.py
+++ b/indoteknik_api/controllers/api_v1/__init__.py
@@ -1,3 +1,4 @@
+from . import activity
from . import banner
from . import blog
from . import cart
@@ -24,3 +25,4 @@ from . import content
from . import midtrans
from . import wati
from . import courier
+from . import voucher \ No newline at end of file
diff --git a/indoteknik_api/controllers/api_v1/activity.py b/indoteknik_api/controllers/api_v1/activity.py
new file mode 100644
index 00000000..142db845
--- /dev/null
+++ b/indoteknik_api/controllers/api_v1/activity.py
@@ -0,0 +1,18 @@
+from .. import controller
+from odoo import http
+from odoo.http import request
+
+
+class Activity(controller.Controller):
+ @http.route('/api/v1/activity', auth='public', csrf=False, methods=['POST', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def create_user_activity(self, **kw):
+ user_data = self.verify_user_token()
+ user_id = user_data['user_id'] if user_data else False
+ request.env['user.activity.log'].create({
+ 'page_title': kw.get('page_title', ''),
+ 'url': kw.get('url', ''),
+ 'res_user_id': user_id,
+ 'ip_address': kw.get('ip_address', '')
+ })
+ return self.response(True) \ No newline at end of file
diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py
index 54b039c7..8803bae3 100644
--- a/indoteknik_api/controllers/api_v1/product.py
+++ b/indoteknik_api/controllers/api_v1/product.py
@@ -4,6 +4,7 @@ from odoo.http import request
from datetime import datetime, timedelta
import ast
import logging
+import math
_logger = logging.getLogger(__name__)
@@ -11,6 +12,49 @@ _logger = logging.getLogger(__name__)
class Product(controller.Controller):
prefix = '/api/v1/'
+ @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'))
+ product = request.env['product.product'].search([('id', '=', id)], limit=1)
+ product_sla = request.env['product.sla'].search([('product_variant_id', '=', id)], limit=1)
+
+ qty_available = product.qty_onhand_bandengan
+ qty_available -= 10
+ if qty_available < 10:
+ qty_available = 0
+
+ qty = 0
+ sla_date = '-'
+
+ is_altama_product = product.x_manufacture.id in [10,122,89]
+ if is_altama_product:
+ try:
+ 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))
+ qty = qty_altama
+ if qty_available > 10:
+ qty += qty_available
+ sla_date = '1 Hari'
+ elif qty_altama > 0:
+ sla_date = '2-4 Hari'
+ else:
+ sla_date = 'Indent'
+ except:
+ print('error')
+ else:
+ qty = qty_available
+ sla_date = product_sla.sla or '-'
+
+ data = {
+ 'qty': qty,
+ 'sla_date': sla_date,
+ }
+
+ return self.response(data, headers=[('Cache-Control', 'max-age=180, private')])
+
+
@http.route(prefix + 'product/template/price/<id>', auth='public', methods=['GET', 'OPTIONS'])
def get_product_template_price_by_id(self, **kw):
if not self.authenticate():
@@ -54,7 +98,7 @@ class Product(controller.Controller):
if not self.authenticate():
return self.response(code=401, description='Unauthorized')
id = kw.get('id')
- partner_id = int(kw.get('partner_id', 0))
+ partner_id = int(kw.get('partner_id', 0))
product_product = request.env['product.product'].search([('id', '=', id)], limit=1)
data = {
@@ -90,7 +134,7 @@ class Product(controller.Controller):
# ('create_date', '>=', delta_time),
]
new_products = request.env['product.template'].search(query_products, order='create_date desc', limit=limit_new_products)
- brands = []
+ brands = []
for product in new_products:
brands.append(product.x_manufacture)
brands = list(dict.fromkeys(brands))
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index 406ab577..7c38d47d 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -58,25 +58,28 @@ class SaleOrder(controller.Controller):
limit = params['value']['limit']
offset = params['value']['offset']
if not params['valid']:
- return self.response(code=400, description=params)
+ return self.response(code=400, description=params)
- partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
+ partner_child_ids = self.get_partner_child_ids(
+ params['value']['partner_id'])
domain = [('partner_id', 'in', partner_child_ids)]
context = params['value']['context']
if context == 'quotation':
- domain += ["|","|",("state","=","draft"),("state","=","sent"),("state","=","cancel")]
+ domain += ["|", "|", ("state", "=", "draft"),
+ ("state", "=", "sent"), ("state", "=", "cancel")]
if not context:
- domain += ["|",("state","=","sale"),("state","=","done")]
+ domain += ["|", ("state", "=", "sale"), ("state", "=", "done")]
if params['value']['name']:
name = params['value']['name'].replace(' ', '%')
domain += [
'|',
- ('name', 'ilike', '%'+ name +'%'),
- ('partner_purchase_order_name', 'ilike', '%'+ name +'%')
+ ('name', 'ilike', '%' + name + '%'),
+ ('partner_purchase_order_name', 'ilike', '%' + name + '%')
]
- sale_orders = request.env['sale.order'].search(domain, offset=offset, limit=limit)
+ sale_orders = request.env['sale.order'].search(
+ domain, offset=offset, limit=limit)
data = {
'sale_order_total': request.env['sale.order'].search_count(domain),
'sale_orders': [request.env['sale.order'].api_v1_single_response(x) for x in sale_orders]
@@ -91,9 +94,10 @@ class SaleOrder(controller.Controller):
'id': ['number']
})
if not params['valid']:
- return self.response(code=400, description=params)
-
- partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
+ return self.response(code=400, description=params)
+
+ partner_child_ids = self.get_partner_child_ids(
+ params['value']['partner_id'])
domain = [
('id', '=', params['value']['id']),
('partner_id', 'in', partner_child_ids)
@@ -101,8 +105,9 @@ class SaleOrder(controller.Controller):
data = {}
sale_order = request.env['sale.order'].search(domain)
if sale_order:
- data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail')
-
+ data = request.env['sale.order'].api_v1_single_response(
+ sale_order, context='with_detail')
+
return self.response(data)
@http.route(PREFIX_PARTNER + 'sale_order/<id>/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False)
@@ -113,9 +118,10 @@ class SaleOrder(controller.Controller):
'id': ['number']
})
if not params['valid']:
- return self.response(code=400, description=params)
+ return self.response(code=400, description=params)
- partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
+ partner_child_ids = self.get_partner_child_ids(
+ params['value']['partner_id'])
domain = [
('id', '=', params['value']['id']),
('partner_id', 'in', partner_child_ids)
@@ -124,13 +130,14 @@ class SaleOrder(controller.Controller):
sale_order = request.env['sale.order'].search(domain)
if sale_order:
sale_order.approval_status = 'pengajuan1'
- data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail')
+ data = request.env['sale.order'].api_v1_single_response(
+ sale_order, context='with_detail')
return self.response(data)
@http.route(PREFIX_PARTNER + 'sale_order/<id>/upload_po', auth='public', method=['POST', 'OPTIONS'], csrf=False)
def partner_upload_po_sale_order(self, **kw):
- user_token = self.authenticate()
+ user_token = self.authenticate()
if not user_token:
return self.unauthorized_response()
@@ -144,7 +151,8 @@ class SaleOrder(controller.Controller):
return self.unauthorized_response()
if not params['valid']:
return self.response(code=400, description=params)
- partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
+ partner_child_ids = self.get_partner_child_ids(
+ params['value']['partner_id'])
domain = [
('id', '=', params['value']['id']),
('partner_id', 'in', partner_child_ids)
@@ -153,6 +161,7 @@ class SaleOrder(controller.Controller):
sale_order = request.env['sale.order'].search(domain)
if sale_order:
sale_order.partner_purchase_order_name = params['value']['name']
+ sale_order.client_order_ref = params['value']['name']
sale_order.partner_purchase_order_file = params['value']['file']
data = sale_order.id
return self.response(data)
@@ -165,9 +174,11 @@ class SaleOrder(controller.Controller):
md5_valid = rest_api.md5_salt_valid(id, 'sale.order', token)
if not md5_valid:
return self.response('Unauthorized')
-
- sale_order = request.env['sale.order'].sudo().search_read([('id', '=', id)], ['partner_purchase_order_name'])
- attachment = rest_api.get_single_attachment('sale.order', 'partner_purchase_order_file', id)
+
+ sale_order = request.env['sale.order'].sudo().search_read(
+ [('id', '=', id)], ['partner_purchase_order_name'])
+ attachment = rest_api.get_single_attachment(
+ 'sale.order', 'partner_purchase_order_file', id)
if attachment and len(sale_order) > 0:
return rest_api.response_attachment({
'content': attachment['datas'],
@@ -185,9 +196,11 @@ class SaleOrder(controller.Controller):
md5_valid = rest_api.md5_salt_valid(id, 'sale.order', token)
if not md5_valid:
return self.response('Unauthorized')
-
- sale_order = request.env['sale.order'].sudo().search_read([('id', '=', id)], ['name'])
- pdf, type = request.env['ir.actions.report'].sudo().search([('report_name', '=', 'indoteknik_custom.report_saleorder_website')])._render_qweb_pdf([id])
+
+ sale_order = request.env['sale.order'].sudo(
+ ).search_read([('id', '=', id)], ['name'])
+ pdf, type = request.env['ir.actions.report'].sudo().search(
+ [('report_name', '=', 'indoteknik_custom.report_saleorder_website')])._render_qweb_pdf([id])
if pdf and len(sale_order) > 0:
return rest_api.response_attachment({
'content': pdf,
@@ -204,9 +217,10 @@ class SaleOrder(controller.Controller):
'id': ['number']
})
if not params['valid']:
- return self.response(code=400, description=params)
+ return self.response(code=400, description=params)
- partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
+ partner_child_ids = self.get_partner_child_ids(
+ params['value']['partner_id'])
domain = [
('id', '=', params['value']['id']),
('partner_id', 'in', partner_child_ids)
@@ -248,10 +262,14 @@ class SaleOrder(controller.Controller):
@controller.Controller.must_authorized(private=True, private_key='partner_id')
def create_partner_sale_order(self, **kw):
config = request.env['ir.config_parameter']
- product_pricelist_default_discount_id = int(config.get_param('product.pricelist.default_discount_id'))
- product_pricelist_tier1 = int(config.get_param('product.pricelist.tier1'))
- product_pricelist_tier2 = int(config.get_param('product.pricelist.tier2'))
- product_pricelist_tier3 = int(config.get_param('product.pricelist.tier3'))
+ product_pricelist_default_discount_id = int(
+ config.get_param('product.pricelist.default_discount_id'))
+ product_pricelist_tier1 = int(
+ config.get_param('product.pricelist.tier1'))
+ product_pricelist_tier2 = int(
+ config.get_param('product.pricelist.tier2'))
+ product_pricelist_tier3 = int(
+ config.get_param('product.pricelist.tier3'))
params = self.get_request_params(kw, {
'partner_id': ['number'],
@@ -263,16 +281,17 @@ class SaleOrder(controller.Controller):
'type': [],
'delivery_amount': ['number', 'default:0'],
'carrier_id': [],
- 'delivery_service_type': []
+ 'delivery_service_type': [],
+ 'voucher': []
})
-
+
if not params['valid']:
return self.response(code=400, description=params)
parameters = {
'warehouse_id': 8,
'carrier_id': 1,
- 'sales_tax_id': 23,
+ 'sales_tax_id': 20,
'pricelist_id': product_pricelist_default_discount_id,
'payment_term_id': 26,
'team_id': 2,
@@ -291,6 +310,8 @@ class SaleOrder(controller.Controller):
'shipping_paid_by': 'customer',
'carrier_id': params['value']['carrier_id'],
'delivery_service_type': params['value']['delivery_service_type'],
+ 'customer_type': 'nonpkp',
+ 'npwp': '0'
}
if params['value']['type'] == 'sale_order':
parameters['approval_status'] = 'pengajuan1'
@@ -298,10 +319,12 @@ class SaleOrder(controller.Controller):
order_line = json.loads(params['value']['order_line'])
parameters = []
- partner = request.env['res.partner'].browse(params['value']['partner_id'])
+ partner = request.env['res.partner'].browse(
+ params['value']['partner_id'])
partner_pricelist = partner.property_product_pricelist
for line in order_line:
- product = request.env['product.product'].search([('id', '=', line['product_id'])], limit=1)
+ product = request.env['product.product'].search(
+ [('id', '=', line['product_id'])], limit=1)
discount = product._get_website_disc(0)
price_tier = False
@@ -311,15 +334,19 @@ class SaleOrder(controller.Controller):
'tier3': product._get_pricelist_tier3,
}
partner_pricelist_id = partner_pricelist.id if partner_pricelist else False
- if partner_pricelist_id == product_pricelist_tier1: price_tier = 'tier1'
- if partner_pricelist_id == product_pricelist_tier2: price_tier = 'tier2'
- if partner_pricelist_id == product_pricelist_tier3: price_tier = 'tier3'
+ if partner_pricelist_id == product_pricelist_tier1:
+ price_tier = 'tier1'
+ if partner_pricelist_id == product_pricelist_tier2:
+ price_tier = 'tier2'
+ if partner_pricelist_id == product_pricelist_tier3:
+ price_tier = 'tier3'
if price_tier:
price = pricelist[price_tier]()
discount_key = 'discount_%s' % price_tier
- if price[discount_key] > 0: discount = price[discount_key]
-
+ if price[discount_key] > 0:
+ discount = price[discount_key]
+
flashsale = product._get_flashsale_price()
flashsale_discount = flashsale['flashsale_discount']
if flashsale_discount > 0 and flashsale_discount > discount:
@@ -333,13 +360,32 @@ class SaleOrder(controller.Controller):
'price_unit': product._get_website_price_exclude_tax(),
'discount': discount
})
-
+
request.env['sale.order.line'].create(parameters)
+
+ amount_untaxed = sale_order.amount_untaxed
+ voucher = request.env['voucher'].search([
+ ('code', '=', params['value']['voucher'])
+ ])
+ if voucher:
+ voucher_discount = voucher.calculate_discount(amount_untaxed)
+ sale_order.voucher_id = voucher.id
+ sale_order.amount_voucher_disc = voucher_discount
+
+ total_qty = sum(line.product_uom_qty for line in sale_order.order_line)
+ voucher_discount_item = voucher_discount / total_qty
+ for line in sale_order.order_line:
+ discount_decimal = line.discount / 100
+ voucher_discount_line = voucher_discount_item / (1 - discount_decimal)
+ price = line.price_unit - voucher_discount_line
+ line.price_unit = price
+ line.amount_voucher_disc = voucher_discount_item * line.product_uom_qty
+
return self.response({
'id': sale_order.id,
'name': sale_order.name
})
-
+
@http.route('/api/sale_order/invoiced', auth='public', methods=['GET'])
def get_sale_order_invoiced_by_partner_id(self, **kw):
if not self.authenticate():
@@ -351,8 +397,10 @@ class SaleOrder(controller.Controller):
partner_id = int(partner_id)
# Get company member by partner_id
- parent_partner_id = request.env['res.partner'].search([('id', '=', partner_id)], limit=1).parent_id.id
- partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))])
+ parent_partner_id = request.env['res.partner'].search(
+ [('id', '=', partner_id)], limit=1).parent_id.id
+ partner_childs = request.env['res.partner'].search(
+ [('parent_id', '=', int(parent_partner_id))])
partner_child_ids = [v['id'] for v in partner_childs] + [partner_id]
# Get sale order by company member and invoiced
@@ -401,9 +449,12 @@ class SaleOrder(controller.Controller):
('id', '=', id),
('state', 'in', ['sale', 'done'])
]
- parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id
- partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))])
- partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)]
+ parent_partner_id = request.env['res.partner'].search(
+ [('id', '=', int(partner_id))], limit=1).parent_id.id
+ partner_childs = request.env['res.partner'].search(
+ [('parent_id', '=', int(parent_partner_id))])
+ partner_child_ids = [v['id']
+ for v in partner_childs] + [int(partner_id)]
default_domain.append(('partner_id', 'in', partner_child_ids))
sale_order = self.search_filter('sale.order', kw, default_domain)
diff --git a/indoteknik_api/controllers/api_v1/voucher.py b/indoteknik_api/controllers/api_v1/voucher.py
new file mode 100644
index 00000000..0990a1a0
--- /dev/null
+++ b/indoteknik_api/controllers/api_v1/voucher.py
@@ -0,0 +1,22 @@
+from .. import controller
+from odoo import http
+from odoo.http import request
+
+class Voucher(controller.Controller):
+ prefix = '/api/v1/'
+
+ @http.route(prefix + 'voucher', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def get_vouchers(self, **kw):
+ code = kw.get('code')
+ visibility = 'public'
+
+ parameter = []
+ if code:
+ visibility = 'private'
+ parameter += [('code', '=', code)]
+
+ parameter += [('visibility', '=', visibility)]
+ vouchers = request.env['voucher'].get_active_voucher(parameter)
+ data = vouchers.res_format()
+ return self.response(data)