diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2023-07-26 06:38:43 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2023-07-26 06:38:43 +0000 |
| commit | dd0b3e2f10615b3f4db2e35590d2931bf1912d7f (patch) | |
| tree | 23ce091ec7a42e26304b402759afb8c0cc69fcf8 | |
| parent | ba6ef5090d092a618c0dee56c8bbe29684ae8688 (diff) | |
| parent | 4b281c6e037fc3b793a6a4b028542b3d73c97d49 (diff) | |
Merged in feature/voucher-cart (pull request #73)
Feature/voucher cart
| -rw-r--r-- | indoteknik_api/controllers/api_v1/cart.py | 33 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/sale_order.py | 9 | ||||
| -rw-r--r-- | indoteknik_custom/models/website_user_cart.py | 19 | ||||
| -rwxr-xr-x | indoteknik_custom/views/website_user_cart.xml | 2 |
4 files changed, 48 insertions, 15 deletions
diff --git a/indoteknik_api/controllers/api_v1/cart.py b/indoteknik_api/controllers/api_v1/cart.py index 0265ec57..6faac27f 100644 --- a/indoteknik_api/controllers/api_v1/cart.py +++ b/indoteknik_api/controllers/api_v1/cart.py @@ -14,7 +14,7 @@ class Cart(controller.Controller): user_id = int(user_id) limit = int(kw.get('limit', 0)) offset = int(kw.get('offset', 0)) - query = [('user_id', '=', user_id)] + query = [('user_id', '=', user_id), ('source', '=', 'add_to_cart')] carts = user_cart.search(query, limit=limit, offset=offset, order='create_date desc') data = { 'product_total': user_cart.search_count(query), @@ -26,37 +26,54 @@ class Cart(controller.Controller): @controller.Controller.must_authorized() def get_cart_count_by_user_id(self, user_id, **kw): user_id = int(user_id) - query = [('user_id', '=', user_id)] + query = [('user_id', '=', user_id), ('source', '=', 'add_to_cart')] 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): + # Convert input values to appropriate types user_id = int(user_id) product_id = int(kw.get('product_id', 0)) qty = int(kw.get('qty', 0)) + source = kw.get('source') 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 + is_selected = is_selected in ('true', True) + + # Check required fields 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) + + website_user_cart = request.env['website.user.cart'] + + # Remove previous 'buy' entries for the user + user_query = ('user_id', '=', user_id) + website_user_cart.search([user_query, ('source', '=', 'buy')]).unlink() + + # Prepare query to find existing cart entry for the product + query = [user_query, ('product_id', '=', product_id), ('source', '=', 'add_to_cart')] + cart = 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: + + if source: + data_to_update['source'] = source + + if cart and source in (None, 'add_to_cart'): + # Update existing cart entry cart.write(data_to_update) result['id'] = cart.id else: - create = request.env['website.user.cart'].create({ + # Create a new cart entry if it doesn't exist + create = website_user_cart.create({ 'user_id': user_id, 'product_id': product_id, **data_to_update diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 208789af..a8b2fd11 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -237,8 +237,9 @@ class SaleOrder(controller.Controller): def get_user_checkout_so(self, user_id, **kw): cart = request.env['website.user.cart'] voucher_code = kw.get('voucher') + source = kw.get('source') voucher = request.env['voucher'].search([('code', '=', voucher_code)], limit=1) - result = cart.get_user_checkout(user_id, voucher) + result = cart.get_user_checkout(user_id, voucher, source) return self.response(result) @http.route(PREFIX_PARTNER + 'sale_order/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False) @@ -259,7 +260,8 @@ class SaleOrder(controller.Controller): 'delivery_amount': ['number', 'default:0'], 'carrier_id': [], 'delivery_service_type': [], - 'voucher': [] + 'voucher': [], + 'source': [] }) if not params['valid']: @@ -297,7 +299,8 @@ class SaleOrder(controller.Controller): 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) + source = params['value']['source'] + products = user_cart.get_product_by_user(user_id=user_id, selected=True, source=source) for product in products: total_qty = product['quantity'] price_unit = product['price']['price'] diff --git a/indoteknik_custom/models/website_user_cart.py b/indoteknik_custom/models/website_user_cart.py index 29bf4291..4d85e64d 100644 --- a/indoteknik_custom/models/website_user_cart.py +++ b/indoteknik_custom/models/website_user_cart.py @@ -10,6 +10,10 @@ class WebsiteUserCart(models.Model): program_line_id = fields.Many2one('promotion.program.line', string='Program', help="Apply program") qty = fields.Float(string='Quantity', digits='Product Unit of Measure') is_selected = fields.Boolean(string='Selected?', digits='Is selected to process checkout') + source = fields.Selection([ + ('add_to_cart', 'Add To Cart'), + ('buy', 'Buy') + ], 'Source', default='add_to_cart') def get_product(self): user_data = { @@ -36,17 +40,24 @@ class WebsiteUserCart(models.Model): def get_products(self): return [x.get_product() for x in self] - def get_product_by_user(self, user_id, selected = False): + def get_product_by_user(self, user_id, selected=False, source=False): user_id = int(user_id) - parameters = [('user_id', '=', user_id)] + source = source if source else 'add_to_cart' + + parameters = [ + ('user_id', '=', user_id), + ('source', '=', source) + ] + if selected: parameters.append(('is_selected', '=', True)) + carts = self.search(parameters) products = carts.get_products() return products - def get_user_checkout(self, user_id, voucher=False): - products = self.get_product_by_user(user_id=user_id, selected=True) + def get_user_checkout(self, user_id, voucher=False, source=False): + products = self.get_product_by_user(user_id=user_id, selected=True, source=source) 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 diff --git a/indoteknik_custom/views/website_user_cart.xml b/indoteknik_custom/views/website_user_cart.xml index fbd08acb..f942cdda 100755 --- a/indoteknik_custom/views/website_user_cart.xml +++ b/indoteknik_custom/views/website_user_cart.xml @@ -16,6 +16,7 @@ <field name="program_line_id"/> <field name="qty"/> <field name="is_selected"/> + <field name="source"/> </tree> </field> </record> @@ -33,6 +34,7 @@ <field name="program_line_id" domain="[('product_id', '=', product_id)]"/> <field name="qty"/> <field name="is_selected"/> + <field name="source"/> </group> <group></group> </group> |
