summaryrefslogtreecommitdiff
path: root/indoteknik_api/controllers/api_v1
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2023-07-24 03:31:59 +0000
committerIT Fixcomart <it@fixcomart.co.id>2023-07-24 03:31:59 +0000
commitc1ac22304b557b9982b5fb79d23d29b6faf48090 (patch)
treea1e6db531a5bf19994374e895d5d8a8c9abf1ffa /indoteknik_api/controllers/api_v1
parent6966c00bf2ef2bd9c2261d9363ac6b463a7766dd (diff)
parent30909e82d7ff1f3cac4700e284f80552a0d38523 (diff)
Merged in feature/voucher-cart (pull request #65)
Feature/voucher cart
Diffstat (limited to 'indoteknik_api/controllers/api_v1')
-rw-r--r--indoteknik_api/controllers/api_v1/cart.py53
-rw-r--r--indoteknik_api/controllers/api_v1/product_variant.py12
-rw-r--r--indoteknik_api/controllers/api_v1/promotion.py70
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py135
-rw-r--r--indoteknik_api/controllers/api_v1/voucher.py69
5 files changed, 248 insertions, 91 deletions
diff --git a/indoteknik_api/controllers/api_v1/cart.py b/indoteknik_api/controllers/api_v1/cart.py
index a8628432..0265ec57 100644
--- a/indoteknik_api/controllers/api_v1/cart.py
+++ b/indoteknik_api/controllers/api_v1/cart.py
@@ -5,55 +5,70 @@ from odoo.http import request
class Cart(controller.Controller):
prefix = '/api/v1/'
+ PREFIX_USER = prefix + 'user/<user_id>/'
- @http.route(prefix + 'cart', auth='public', methods=['GET'])
+ @http.route(PREFIX_USER + 'cart', auth='public', methods=['GET', 'OPTIONS'])
@controller.Controller.must_authorized()
- def get_cart_by_user_id(self, **kw):
- user_id = int(kw.get('user_id', 0))
+ def get_cart_by_user_id(self, user_id, **kw):
+ user_cart = request.env['website.user.cart']
+ user_id = int(user_id)
limit = int(kw.get('limit', 0))
offset = int(kw.get('offset', 0))
query = [('user_id', '=', user_id)]
- carts = request.env['website.user.cart'].search(query, limit=limit, offset=offset, order='create_date desc')
+ carts = user_cart.search(query, limit=limit, offset=offset, order='create_date desc')
data = {
- 'product_total': request.env['website.user.cart'].search_count(query),
- 'products': []
+ 'product_total': user_cart.search_count(query),
+ 'products': carts.get_products()
}
- for cart in carts:
- product = request.env['product.product'].api_single_response(cart.product_id)
- product['template_id'] = cart.product_id.product_tmpl_id.id
- product['quantity'] = cart.qty
- data['products'].append(product)
return self.response(data)
- @http.route(prefix + 'cart/create-or-update', auth='public', methods=['POST'], csrf=False)
+ @http.route(PREFIX_USER + 'cart/count', auth='public', methods=['GET', 'OPTIONS'])
@controller.Controller.must_authorized()
- def create_or_update_cart(self, **kw):
- user_id = int(kw.get('user_id', 0))
+ def get_cart_count_by_user_id(self, user_id, **kw):
+ user_id = int(user_id)
+ query = [('user_id', '=', user_id)]
+ carts = request.env['website.user.cart'].search_count(query)
+ return self.response(carts)
+
+ @http.route(PREFIX_USER + 'cart/create-or-update', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
+ @controller.Controller.must_authorized()
+ def create_or_update_cart(self, user_id, **kw):
+ user_id = int(user_id)
product_id = int(kw.get('product_id', 0))
qty = int(kw.get('qty', 0))
+ is_selected = kw.get('selected', False)
+ program_line_id = kw.get('program_line_id', False)
+ program_line_id = False if program_line_id == 'null' or not program_line_id else int(program_line_id)
+ if is_selected:
+ is_selected = True if is_selected == 'true' else False
if not user_id or not product_id or not qty:
return self.response(code=400, description='user_id, product_id and qty is required')
query = [('user_id', '=', user_id), ('product_id', '=', product_id)]
cart = request.env['website.user.cart'].search(query, limit=1)
result = {}
+ data_to_update = {
+ 'qty': qty,
+ 'is_selected': is_selected,
+ 'program_line_id': program_line_id
+ }
if cart:
- cart.write({'qty': qty})
+ cart.write(data_to_update)
result['id'] = cart.id
else:
create = request.env['website.user.cart'].create({
'user_id': user_id,
'product_id': product_id,
- 'qty': qty
+ **data_to_update
})
result['id'] = create.id
return self.response(result)
- @http.route(prefix + 'cart', auth='public', methods=['DELETE'], csrf=False)
+ @http.route(PREFIX_USER + 'cart', auth='public', methods=['DELETE', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
- def delete_cart_by_user_id(self, **kw):
- user_id = int(kw.get('user_id', 0))
+ def delete_cart_by_user_id(self, user_id, **kw):
+ user_id = int(user_id)
query = [('user_id', '=', user_id)]
product_ids = kw.get('product_ids')
if product_ids:
diff --git a/indoteknik_api/controllers/api_v1/product_variant.py b/indoteknik_api/controllers/api_v1/product_variant.py
index 999ced6f..8de4669e 100644
--- a/indoteknik_api/controllers/api_v1/product_variant.py
+++ b/indoteknik_api/controllers/api_v1/product_variant.py
@@ -2,6 +2,7 @@ from .. import controller
from odoo import http
from odoo.http import request
+
class ProductVariant(controller.Controller):
prefix = '/api/v1/'
@@ -20,3 +21,14 @@ class ProductVariant(controller.Controller):
return self.response(data)
+ @http.route(prefix + 'product_variant/<product_id>/promotions', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def get_product_variant_promotions(self, product_id):
+ product_id = int(product_id)
+ user_data = self.verify_user_token()
+
+ program_line = request.env['promotion.program.line']
+ program_lines = program_line.get_active_promotions(product_id)
+ program_lines = program_lines.res_format(user=user_data)
+
+ return self.response(program_lines)
diff --git a/indoteknik_api/controllers/api_v1/promotion.py b/indoteknik_api/controllers/api_v1/promotion.py
index b137fe2e..f84b8c1c 100644
--- a/indoteknik_api/controllers/api_v1/promotion.py
+++ b/indoteknik_api/controllers/api_v1/promotion.py
@@ -1,12 +1,13 @@
from .. import controller
from odoo import http
from odoo.http import request
-import ast
+from datetime import datetime
class Promotion(controller.Controller):
prefix = '/api/v1/'
-
+
+
@http.route(prefix + 'promotion/<id>', auth='public', methods=['GET'])
@controller.Controller.must_authorized()
def get_promotion_by_id(self, **kw):
@@ -14,7 +15,7 @@ class Promotion(controller.Controller):
id = kw.get('id')
if not id:
return self.response(code=400, description='id is required')
-
+
data = {}
id = int(id)
coupon_program = request.env['coupon.program'].search([('id', '=', id)])
@@ -24,6 +25,67 @@ class Promotion(controller.Controller):
'image': base_url + 'api/image/coupon.program/x_studio_image_promo/' + str(coupon_program.id) if coupon_program.x_studio_image_promo else '',
'name': coupon_program.name,
}
+
+ return self.response(data)
+
+
+ @http.route(prefix + 'promotion/home', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def v1_get_promotion_home(self):
+ current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ programs = request.env['promotion.program'].search([
+ ('start_time', '<=', current_time),
+ ('end_time', '>=', current_time),
+ ('program_line.display_on_homepage', '=', True)
+ ])
+
+ if not programs:
+ return self.response(None)
+
+ data = []
+ for program in programs:
+ data_program = {
+ 'id': program.id,
+ 'name': program.name,
+ 'banner': request.env['ir.attachment'].api_image('promotion.program', 'banner', program.id),
+ 'icon': request.env['ir.attachment'].api_image('promotion.program', 'icon', program.id)
+ }
+ data.append(data_program)
+
+ return self.response(data)
+
+
+ @http.route(prefix + 'promotion/home/<id>', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def v1_get_promotion_home_detail(self, id):
+ program_lines = request.env['promotion.program.line'].search([
+ ('display_on_homepage', '=', True),
+ ('promotion_type', '=', 'special_price'),
+ ('program_id', '=', int(id))
+ ])
+ data = []
+ for line in program_lines:
+ product = request.env['product.product'].v2_api_single_response(line.product_id)
+ product_template = line.product_id.product_tmpl_id
+
+ product.update({
+ 'id': product['parent']['id'],
+ 'image': product['parent']['image'],
+ 'name': product['parent']['name'],
+ 'variant_total': len(product_template.product_variant_ids),
+ 'lowest_price': line.calculate_price(product['price']),
+ 'stock_total': product['stock'],
+ 'icon': {
+ 'top': request.env['ir.attachment'].api_image('promotion.program', 'icon_top', line.program_id.id),
+ 'bottom': request.env['ir.attachment'].api_image('promotion.program', 'icon_bottom', line.program_id.id)
+ }
+ })
+
+ product.pop('parent', None)
+ product.pop('price', None)
+ product.pop('stock', None)
+ data.append(product)
+
return self.response(data)
- \ No newline at end of file
+
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index e036751e..6c878197 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -231,21 +231,24 @@ class SaleOrder(controller.Controller):
sale_order.state = 'cancel'
data = sale_order.id
return self.response(data)
-
+
+ @http.route(prefix + 'user/<user_id>/sale_order/checkout', auth='public', method=['GET', 'OPTIONS'], csrf=False)
+ @controller.Controller.must_authorized(private=True, private_key='user_id')
+ def get_user_checkout_so(self, user_id, **kw):
+ cart = request.env['website.user.cart']
+ voucher_code = kw.get('voucher')
+ voucher = request.env['voucher'].search([('code', '=', voucher_code)], limit=1)
+ result = cart.get_user_checkout(user_id, voucher)
+ return self.response(result)
+
@http.route(PREFIX_PARTNER + 'sale_order/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False)
@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'))
params = self.get_request_params(kw, {
+ 'user_id': ['number'],
'partner_id': ['number'],
'partner_shipping_id': ['required', 'number'],
'partner_invoice_id': ['required', 'number'],
@@ -258,7 +261,7 @@ class SaleOrder(controller.Controller):
'delivery_service_type': [],
'voucher': []
})
-
+
if not params['valid']:
return self.response(code=400, description=params)
@@ -290,68 +293,78 @@ class SaleOrder(controller.Controller):
if params['value']['type'] == 'sale_order':
parameters['approval_status'] = 'pengajuan1'
sale_order = request.env['sale.order'].create([parameters])
- order_line = json.loads(params['value']['order_line'])
parameters = []
- 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)
- discount = product._get_website_disc(0)
-
- price_tier = False
- pricelist = {
- 'tier1': product._get_pricelist_tier1,
- 'tier2': product._get_pricelist_tier2,
- '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 price_tier:
- price = pricelist[price_tier]()
- discount_key = 'discount_%s' % price_tier
- 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:
- discount = flashsale_discount
-
- parameters.append({
+ user_id = params['value']['user_id']
+ user_cart = request.env['website.user.cart']
+ products = user_cart.get_product_by_user(user_id=user_id, selected=True)
+ for product in products:
+ total_qty = product['quantity']
+ price_unit = product['price']['price']
+ price_discount =product['price']['discount_percentage']
+ if product['program'] and product['program']['type']['value'] != 'special_price':
+ total_qty += sum(x['quantity'] for x in product['program']['items'])
+ price_unit = product['subtotal'] / total_qty
+ price_discount = 0
+
+ param = {
'company_id': 1,
'order_id': sale_order.id,
- 'product_id': line['product_id'],
- 'product_uom_qty': line['quantity'],
- 'price_unit': product._get_website_price_exclude_tax(),
- 'discount': discount
- })
+ 'price_unit': price_unit,
+ 'discount': price_discount
+ }
+
+ primary_product = {
+ **param,
+ 'product_id': product['id'],
+ 'product_uom_qty': product['quantity']
+ }
+ if product['program']:
+ primary_product.update({
+ 'program_line_id': product['program']['id']
+ })
+ parameters.append(primary_product)
+
+ if not product['program']:
+ continue
+
+ for item in product['program']['items']:
+ parameters.append({
+ **param,
+ 'product_id': item['id'],
+ 'product_uom_qty': item['quantity'],
+ })
request.env['sale.order.line'].create(parameters)
- amount_untaxed = sale_order.amount_untaxed
- voucher = request.env['voucher'].search([
- ('code', '=', params['value']['voucher'])
- ])
+ voucher_code = params['value']['voucher']
+ voucher = request.env['voucher'].search([('code', '=', voucher_code)])
if voucher:
- sale_order.voucher_id = voucher.id
+ amount_untaxed = 0
+ manufacture_ids = [x.id for x in voucher.manufacture_ids]
+ for line in sale_order.order_line:
+ manufacture_id = line.product_id.x_manufacture.id or False
+ if len(manufacture_ids) == 0 or manufacture_id in manufacture_ids:
+ amount_untaxed += line.price_subtotal
+
voucher_discount = voucher.calculate_discount(amount_untaxed)
- total_qty = sum(line.product_uom_qty for line in sale_order.order_line)
- voucher_discount_item = voucher_discount / total_qty
+ sale_order.voucher_id = voucher.id
+ sale_order.amount_voucher_disc = voucher_discount
+
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
+ manufacture_id = line.product_id.x_manufacture.id or False
+ if len(manufacture_ids) > 0 and manufacture_id not in manufacture_ids:
+ continue
+ voucher_discount_line = line.price_subtotal / amount_untaxed * voucher_discount
+ line.amount_voucher_disc = voucher_discount_line
+ discount_decimal = line.discount / 100
+ voucher_discount_item = voucher_discount_line / line.product_uom_qty
+ voucher_disc_before_line_disc = voucher_discount_item / (1 - discount_decimal)
+ line.price_unit -= voucher_disc_before_line_disc
+
+ cart_ids = [x['cart_id'] for x in products]
+ user_cart.browse(cart_ids).unlink()
return self.response({
'id': sale_order.id,
'name': sale_order.name
diff --git a/indoteknik_api/controllers/api_v1/voucher.py b/indoteknik_api/controllers/api_v1/voucher.py
index 0990a1a0..a6a88cad 100644
--- a/indoteknik_api/controllers/api_v1/voucher.py
+++ b/indoteknik_api/controllers/api_v1/voucher.py
@@ -2,21 +2,76 @@ 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()
+ @http.route(prefix + 'user/<user_id>/voucher', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized(private=True, private_key='user_id')
def get_vouchers(self, **kw):
+ cart = request.env['website.user.cart']
code = kw.get('code')
- visibility = 'public'
+ user_id = kw.get('user_id')
+ visibility = ['public']
parameter = []
if code:
- visibility = 'private'
+ visibility.append('private')
parameter += [('code', '=', code)]
+ user_pricelist = request.env.user_pricelist
+ if user_pricelist:
+ parameter += [('excl_pricelist_ids', 'not in', [user_pricelist.id])]
- parameter += [('visibility', '=', visibility)]
+ parameter += [('visibility', 'in', visibility)]
vouchers = request.env['voucher'].get_active_voucher(parameter)
- data = vouchers.res_format()
- return self.response(data)
+ vouchers = vouchers.res_format()
+ checkout = cart.get_user_checkout(user_id)
+
+ for voucher in vouchers:
+ apply_status = ''
+ products = checkout['products']
+ min_purchase_amount = voucher['min_purchase_amount']
+ max_discount_amount = voucher['max_discount_amount']
+ discount_type = voucher['discount_type']
+ discount_amount = voucher['discount_amount']
+ can_apply = True
+ difference_to_apply = 0
+
+ manufacture_ids = voucher['manufacture_ids']
+ subtotal = 0
+ has_match_manufacture = False
+ for product in products:
+ price = product['price']['price']
+ price_discount = product['price']['price_discount']
+ quantity = product['quantity']
+ manufacture_id = product['manufacture']['id'] or False
+
+ if len(manufacture_ids) == 0 or manufacture_id in manufacture_ids:
+ purchase_amt = price * quantity
+ discount_amt = (price - price_discount) * quantity
+ subtotal += purchase_amt - discount_amt
+ has_match_manufacture = True
+
+ if not has_match_manufacture:
+ can_apply = False
+ apply_status = 'UM'
+ elif subtotal < min_purchase_amount:
+ can_apply = False
+ apply_status = 'MPA'
+ difference_to_apply = min_purchase_amount - subtotal
+
+ discount_voucher = 0
+ if discount_type == 'fixed_price':
+ discount_voucher = discount_amount
+ if discount_type == 'percentage':
+ discount_voucher = subtotal * discount_amount / 100
+
+ if max_discount_amount > 0 and discount_voucher > max_discount_amount:
+ discount_voucher = max_discount_amount
+
+ voucher['can_apply'] = can_apply
+ voucher['apply_status'] = apply_status
+ voucher['discount_voucher'] = discount_voucher
+ voucher['difference_to_apply'] = difference_to_apply
+
+ return self.response(vouchers)