From bc6bc85f455c4b8bc9f73b779b521faa5fcdcf96 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Thu, 15 Jun 2023 16:48:29 +0700 Subject: Update user cart model and API --- indoteknik_api/controllers/api_v1/sale_order.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 35361ba4..9df710ec 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -218,6 +218,26 @@ class SaleOrder(controller.Controller): data = sale_order.id return self.response(data) + @http.route(prefix + 'user//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): + cart = request.env['website.user.cart'] + products = cart.get_product_by_user(user_id=user_id, selected=True) + total_purchase = sum(x['price']['price'] for x in products) + total_discount = sum((x['price']['price'] - x['price']['price_discount']) for x in products) + subtotal = total_purchase - total_discount + tax = round(subtotal * 0.11) + grand_total = subtotal + tax + result = { + 'total_purchase': total_purchase, + 'total_discount': total_discount, + 'subtotal': subtotal, + 'tax': tax, + 'grand_total': round(grand_total), + 'products': products + } + 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): -- cgit v1.2.3 From 12c821732b31ff68dec7e0a7a8390466b4181692 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Fri, 16 Jun 2023 11:08:21 +0700 Subject: Fix add to cart api --- indoteknik_api/controllers/api_v1/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 9df710ec..89e96206 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -266,7 +266,7 @@ class SaleOrder(controller.Controller): parameters = { 'warehouse_id': 8, 'carrier_id': 1, - 'sales_tax_id': 21, + 'sales_tax_id': 23, 'pricelist_id': product_pricelist_default_discount_id, 'payment_term_id': 26, 'team_id': 2, -- cgit v1.2.3 From 4e9a5a025012afe63133524eeea8987b9af9e050 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 19 Jun 2023 15:13:55 +0700 Subject: Add response on get user checkout data API --- indoteknik_api/controllers/api_v1/sale_order.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 89e96206..406ab577 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -223,17 +223,23 @@ class SaleOrder(controller.Controller): def get_user_checkout_so(self, user_id): cart = request.env['website.user.cart'] products = cart.get_product_by_user(user_id=user_id, selected=True) - total_purchase = sum(x['price']['price'] for x in products) - total_discount = sum((x['price']['price'] - x['price']['price_discount']) for x in products) + total_purchase = sum(x['price']['price'] * x['quantity'] for x in products) + total_discount = sum((x['price']['price'] - x['price']['price_discount']) * x['quantity'] for x in products) subtotal = total_purchase - total_discount tax = round(subtotal * 0.11) grand_total = subtotal + tax + total_weight = sum(x['weight'] * x['quantity'] for x in products) result = { 'total_purchase': total_purchase, 'total_discount': total_discount, 'subtotal': subtotal, 'tax': tax, 'grand_total': round(grand_total), + 'total_weight': { + 'kg': total_weight, + 'g': total_weight * 1000 + }, + 'has_product_without_weight': any(not product.get('weight') or product.get('weight') == 0 for product in products), 'products': products } return self.response(result) -- cgit v1.2.3 From e0102841e6e21c7b583f096914aa4ba1a28e1587 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Tue, 18 Jul 2023 14:00:34 +0700 Subject: Merge sale order voucher with promotion program --- indoteknik_api/controllers/api_v1/sale_order.py | 96 ++++++++++++------------- 1 file changed, 44 insertions(+), 52 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 7c38d47d..a2e28cda 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -262,16 +262,10 @@ 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')) params = self.get_request_params(kw, { + 'user_id': ['number'], 'partner_id': ['number'], 'partner_shipping_id': ['required', 'number'], 'partner_invoice_id': ['required', 'number'], @@ -281,10 +275,9 @@ class SaleOrder(controller.Controller): 'type': [], 'delivery_amount': ['number', 'default:0'], 'carrier_id': [], - 'delivery_service_type': [], - 'voucher': [] + 'delivery_service_type': [] }) - + if not params['valid']: return self.response(code=400, description=params) @@ -316,51 +309,50 @@ 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'], + }) + + cart_ids = [x['cart_id'] for x in products] + user_cart.browse(cart_ids).unlink() request.env['sale.order.line'].create(parameters) amount_untaxed = sale_order.amount_untaxed @@ -380,7 +372,7 @@ class SaleOrder(controller.Controller): 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 -- cgit v1.2.3 From d966917a5ba95074b6773f49fcb2c3c924296029 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Tue, 18 Jul 2023 16:38:29 +0700 Subject: Fix lost merge voucher with promotion program --- indoteknik_api/controllers/api_v1/sale_order.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index a2e28cda..8135da33 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -275,7 +275,8 @@ class SaleOrder(controller.Controller): 'type': [], 'delivery_amount': ['number', 'default:0'], 'carrier_id': [], - 'delivery_service_type': [] + 'delivery_service_type': [], + 'voucher': [] }) if not params['valid']: -- cgit v1.2.3 From 7b76facc6b7fdbff83a98a1b3251f1d3dad48937 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Thu, 20 Jul 2023 10:42:32 +0700 Subject: Add get_user_checkout on user cart --- indoteknik_api/controllers/api_v1/sale_order.py | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 8135da33..29649315 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -236,26 +236,7 @@ class SaleOrder(controller.Controller): @controller.Controller.must_authorized(private=True, private_key='user_id') def get_user_checkout_so(self, user_id): cart = request.env['website.user.cart'] - products = cart.get_product_by_user(user_id=user_id, selected=True) - total_purchase = sum(x['price']['price'] * x['quantity'] for x in products) - total_discount = sum((x['price']['price'] - x['price']['price_discount']) * x['quantity'] for x in products) - subtotal = total_purchase - total_discount - tax = round(subtotal * 0.11) - grand_total = subtotal + tax - total_weight = sum(x['weight'] * x['quantity'] for x in products) - result = { - 'total_purchase': total_purchase, - 'total_discount': total_discount, - 'subtotal': subtotal, - 'tax': tax, - 'grand_total': round(grand_total), - 'total_weight': { - 'kg': total_weight, - 'g': total_weight * 1000 - }, - 'has_product_without_weight': any(not product.get('weight') or product.get('weight') == 0 for product in products), - 'products': products - } + result = cart.get_user_checkout(user_id) return self.response(result) @http.route(PREFIX_PARTNER + 'sale_order/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False) -- cgit v1.2.3 From 3c9ef63acb42298d948ee86407d9a5ca67004246 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Thu, 20 Jul 2023 11:20:21 +0700 Subject: Add discount_voucher on get checkout data API --- indoteknik_api/controllers/api_v1/sale_order.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 29649315..88a72755 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -234,9 +234,11 @@ class SaleOrder(controller.Controller): @http.route(prefix + 'user//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): + def get_user_checkout_so(self, user_id, **kw): cart = request.env['website.user.cart'] - result = cart.get_user_checkout(user_id) + 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) -- cgit v1.2.3 From c758c2c63243a01e090a7640839b2dd7ce9476be Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Fri, 21 Jul 2023 16:33:22 +0700 Subject: Update contribute pro-rate on create sale order API --- indoteknik_api/controllers/api_v1/sale_order.py | 32 +++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) (limited to 'indoteknik_api/controllers/api_v1/sale_order.py') diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 88a72755..6c878197 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -335,28 +335,36 @@ class SaleOrder(controller.Controller): 'product_uom_qty': item['quantity'], }) - cart_ids = [x['cart_id'] for x in products] - user_cart.browse(cart_ids).unlink() 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: + 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) 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: + 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_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 + 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 -- cgit v1.2.3