summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2023-07-26 06:38:43 +0000
committerIT Fixcomart <it@fixcomart.co.id>2023-07-26 06:38:43 +0000
commitdd0b3e2f10615b3f4db2e35590d2931bf1912d7f (patch)
tree23ce091ec7a42e26304b402759afb8c0cc69fcf8
parentba6ef5090d092a618c0dee56c8bbe29684ae8688 (diff)
parent4b281c6e037fc3b793a6a4b028542b3d73c97d49 (diff)
Merged in feature/voucher-cart (pull request #73)
Feature/voucher cart
-rw-r--r--indoteknik_api/controllers/api_v1/cart.py33
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py9
-rw-r--r--indoteknik_custom/models/website_user_cart.py19
-rwxr-xr-xindoteknik_custom/views/website_user_cart.xml2
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>