summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/website_user_cart.py
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2023-07-24 13:43:53 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2023-07-24 13:43:53 +0700
commit92c97849b0755ab3396508fc6e6d5a12380bc549 (patch)
tree5d5942199a1f15916fb4ac95a9fb130d856b515f /indoteknik_custom/models/website_user_cart.py
parent4f743b1b2aa7001466404ebef0516fded12d674d (diff)
parentc1ac22304b557b9982b5fb79d23d29b6faf48090 (diff)
Merge branch 'production' of bitbucket.org:altafixco/indoteknik-addons into production
Diffstat (limited to 'indoteknik_custom/models/website_user_cart.py')
-rw-r--r--indoteknik_custom/models/website_user_cart.py68
1 files changed, 66 insertions, 2 deletions
diff --git a/indoteknik_custom/models/website_user_cart.py b/indoteknik_custom/models/website_user_cart.py
index 8046469f..29bf4291 100644
--- a/indoteknik_custom/models/website_user_cart.py
+++ b/indoteknik_custom/models/website_user_cart.py
@@ -5,6 +5,70 @@ class WebsiteUserCart(models.Model):
_name = 'website.user.cart'
_rec_name = 'user_id'
- user_id = fields.Many2one('res.users', string='User', help="User ID yang terdaftar di table res.users")
- product_id = fields.Many2one('product.product', string='Product', help="Product yang terdaftar di table product.product")
+ user_id = fields.Many2one('res.users', string='User')
+ product_id = fields.Many2one('product.product', string='Product')
+ 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')
+
+ def get_product(self):
+ user_data = {
+ 'partner_id': self.user_id.partner_id.id,
+ 'user_id': self.user_id.id
+ }
+ product = self.product_id.v2_api_single_response(self.product_id)
+ product['cart_id'] = self.id
+ product['quantity'] = self.qty
+ product['subtotal'] = self.qty * product['price']['price_discount']
+ product['selected'] = self.is_selected
+ product['program'] = None
+ product['can_buy'] = True
+ if self.program_line_id:
+ product['program'] = self.program_line_id.res_format_cart(user=user_data, quantity=self.qty)
+
+ if product['program']:
+ if self.qty < product['program']['minimum_purchase_qty'] or self.qty > product['program']['remaining_qty']['transaction']:
+ product['can_buy'] = False
+ product['price'] = product['program']['price']
+
+ return product
+
+ def get_products(self):
+ return [x.get_product() for x in self]
+
+ def get_product_by_user(self, user_id, selected = False):
+ user_id = int(user_id)
+ parameters = [('user_id', '=', user_id)]
+ 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)
+ 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
+ discount_voucher = 0
+ if voucher:
+ discount_voucher = voucher.calculate_discount(subtotal)
+ subtotal -= discount_voucher
+ 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,
+ 'discount_voucher': discount_voucher,
+ '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 result \ No newline at end of file