summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2023-08-04 03:59:33 +0000
committerIT Fixcomart <it@fixcomart.co.id>2023-08-04 03:59:33 +0000
commit6d17228cd6c789fe4460e28807d5b39fb1bbe9b7 (patch)
treea4c961062c026e1005ebdc82547903c3f30c0a06
parentcc182dd9963fb8985661ca1b64a53e7f11f095c5 (diff)
parentbcc35009da39e9ee8b5e181006d3690316b83c59 (diff)
Merged in development (pull request #82)
Development
-rw-r--r--indoteknik_api/controllers/api_v1/flash_sale.py5
-rw-r--r--indoteknik_api/controllers/api_v1/voucher.py30
-rw-r--r--indoteknik_api/models/product_template.py6
-rw-r--r--indoteknik_custom/models/product_pricelist.py11
-rwxr-xr-xindoteknik_custom/models/product_template.py23
-rw-r--r--indoteknik_custom/models/website_user_cart.py2
-rw-r--r--indoteknik_custom/views/product_pricelist.xml37
7 files changed, 73 insertions, 41 deletions
diff --git a/indoteknik_api/controllers/api_v1/flash_sale.py b/indoteknik_api/controllers/api_v1/flash_sale.py
index dc7c3928..dff8bec3 100644
--- a/indoteknik_api/controllers/api_v1/flash_sale.py
+++ b/indoteknik_api/controllers/api_v1/flash_sale.py
@@ -1,4 +1,3 @@
-from datetime import datetime
import logging
from .. import controller
from odoo import http
@@ -28,7 +27,7 @@ class FlashSale(controller.Controller):
'banner': request.env['ir.attachment'].api_image('product.pricelist', 'banner', pricelist.id),
'banner_mobile': request.env['ir.attachment'].api_image('product.pricelist', 'banner_mobile', pricelist.id),
'banner_top': request.env['ir.attachment'].api_image('product.pricelist', 'banner_top', pricelist.id),
- 'duration': round((pricelist.end_date - datetime.now()).total_seconds()),
+ 'duration': pricelist._remaining_time_in_second(),
'product_total': request.env['product.pricelist.item'].search_count(query),
})
return self.response(data)
@@ -94,7 +93,7 @@ class FlashSale(controller.Controller):
'name': active_flash_sale.name,
'banner': base_url + 'api/image/product.pricelist/banner/' + str(active_flash_sale.id) if active_flash_sale.banner else '',
'banner_mobile': base_url + 'api/image/product.pricelist/banner_mobile/' + str(active_flash_sale.id) if active_flash_sale.banner_mobile else '',
- 'duration': round((active_flash_sale.end_date - datetime.now()).total_seconds()),
+ 'duration': active_flash_sale._remaining_time_in_second(),
'flashsale_option': active_flash_sale.flashsale_option,
'product_total': request.env['product.template'].search_count(query),
'products': [request.env['product.template'].api_single_response(x) for x in product_templates]
diff --git a/indoteknik_api/controllers/api_v1/voucher.py b/indoteknik_api/controllers/api_v1/voucher.py
index 4baa93b7..f82e1aef 100644
--- a/indoteknik_api/controllers/api_v1/voucher.py
+++ b/indoteknik_api/controllers/api_v1/voucher.py
@@ -31,9 +31,9 @@ class Voucher(controller.Controller):
apply_status = ''
products = checkout['products']
min_purchase_amount = voucher['min_purchase_amount']
- can_apply = True
+ can_apply = False
difference_to_apply = 0
-
+
manufacture_ids = voucher['manufacture_ids']
subtotal = 0
has_match_manufacture = False
@@ -43,18 +43,25 @@ class Voucher(controller.Controller):
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
+ if len(manufacture_ids) == 0 or (not product['has_flashsale'] and manufacture_id in manufacture_ids):
has_match_manufacture = True
-
+
+ if product['has_flashsale']:
+ continue
+
+ purchase_amt = price * quantity
+ discount_amt = (price - price_discount) * quantity
+ subtotal += purchase_amt - discount_amt
+
+ has_flashsale_products = any(product['has_flashsale'] for product in products)
if not has_match_manufacture:
- can_apply = False
- apply_status = 'UM'
+ apply_status = 'UM' # Unqualified Manufacture
elif subtotal < min_purchase_amount:
- can_apply = False
- apply_status = 'MPA'
+ apply_status = 'MPA' # Minimum Purchase Amount
+ else:
+ can_apply = True
+
+ if subtotal < min_purchase_amount:
difference_to_apply = min_purchase_amount - subtotal
obj_voucher = request.env['voucher'].browse(voucher['id'])
@@ -62,6 +69,7 @@ class Voucher(controller.Controller):
voucher['can_apply'] = can_apply
voucher['apply_status'] = apply_status
+ voucher['has_flashsale_products'] = has_flashsale_products
voucher['discount_voucher'] = discount_voucher
voucher['difference_to_apply'] = difference_to_apply
diff --git a/indoteknik_api/models/product_template.py b/indoteknik_api/models/product_template.py
index 68ab79c2..fb77769f 100644
--- a/indoteknik_api/models/product_template.py
+++ b/indoteknik_api/models/product_template.py
@@ -70,8 +70,12 @@ class ProductTemplate(models.Model):
for variant in variants:
if variant["price"]["price_discount"] < lowest_price["price_discount"]:
lowest_price = variant['price']
-
+ template_pricelist = product_template._get_active_flash_sale()
data_with_detail = {
+ 'flash_sale': {
+ 'remaining_time': template_pricelist._remaining_time_in_second() if template_pricelist else 0,
+ 'tag': template_pricelist.flashsale_tag if template_pricelist else None
+ },
'lowest_price': lowest_price,
'image': self.env['ir.attachment'].api_image('product.template', 'image_512', product_template.id),
'display_name': product_template.display_name,
diff --git a/indoteknik_custom/models/product_pricelist.py b/indoteknik_custom/models/product_pricelist.py
index 2edaeb80..95e63cf0 100644
--- a/indoteknik_custom/models/product_pricelist.py
+++ b/indoteknik_custom/models/product_pricelist.py
@@ -1,5 +1,6 @@
from odoo import models, fields, api
from odoo.exceptions import UserError
+from datetime import datetime
class ProductPricelist(models.Model):
@@ -13,8 +14,16 @@ class ProductPricelist(models.Model):
flashsale_option = fields.Selection([
('all', 'For All User'),
('registered_user', 'Only for Registered User')
- ], string='Flashsale Option')
+ ], string='Flash Sale Option')
banner_top = fields.Binary(string='Banner Top')
+ flashsale_tag = fields.Char(string='Flash Sale Tag')
+
+ def _remaining_time_in_second(self):
+ if not self.end_date:
+ return 0
+ remaining_time = (self.end_date - datetime.now()).total_seconds()
+ remaining_time = round(remaining_time)
+ return max(remaining_time, 0)
class ProductPricelistItem(models.Model):
diff --git a/indoteknik_custom/models/product_template.py b/indoteknik_custom/models/product_template.py
index e48136fa..bc54b703 100755
--- a/indoteknik_custom/models/product_template.py
+++ b/indoteknik_custom/models/product_template.py
@@ -29,8 +29,7 @@ class ProductTemplate(models.Model):
digits='Product Price', inverse='_set_product_lst_price',
help="Web Price with pricelist_id = 1")
qty_stock_vendor = fields.Float('QTY Stock Vendor', compute='_compute_qty_stock_vendor')
- have_promotion_program = fields.Boolean('Have Promotion Program', compute='_have_promotion_program',
- help="Punya promotion program gak?")
+ have_promotion_program = fields.Boolean('Have Promotion Program', compute='_have_promotion_program', help="Punya promotion program gak?")
product_rating = fields.Float('Product Rating', help="Digunakan untuk sorting product di website", default=0.0)
virtual_rating = fields.Float('Virtual Rating', compute='_compute_virtual_rating', help="Column Virtual untuk product rating, digunakan oleh Solr", default=0.0)
last_calculate_rating = fields.Datetime("Last Calculate Rating")
@@ -155,6 +154,14 @@ class ProductTemplate(models.Model):
else:
template.have_promotion_program = False
+ def _get_active_flash_sale(self):
+ variant_ids = [x.id for x in self.product_variant_ids]
+ pricelist = self.env['product.pricelist'].search([
+ ('is_flash_sale', '=', True),
+ ('item_ids.product_id', 'in', variant_ids)
+ ], limit=1)
+ return pricelist
+
@api.model
def _calculate_rating_product(self, limit=1000, expiry_days=30, ids=False):
current_time = datetime.now()
@@ -312,4 +319,14 @@ class ProductProduct(models.Model):
def unlink(self):
if self._name == 'product.product':
- raise UserError('Maaf anda tidak bisa delete product') \ No newline at end of file
+ raise UserError('Maaf anda tidak bisa delete product')
+
+ def _get_active_flash_sale(self):
+ current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ pricelist = self.env['product.pricelist'].search([
+ ('is_flash_sale', '=', True),
+ ('item_ids.product_id', '=', self.id),
+ ('start_date', '<=', current_time),
+ ('end_date', '>=', current_time)
+ ], limit=1)
+ return pricelist \ No newline at end of file
diff --git a/indoteknik_custom/models/website_user_cart.py b/indoteknik_custom/models/website_user_cart.py
index 4d85e64d..9b82aa93 100644
--- a/indoteknik_custom/models/website_user_cart.py
+++ b/indoteknik_custom/models/website_user_cart.py
@@ -27,6 +27,8 @@ class WebsiteUserCart(models.Model):
product['selected'] = self.is_selected
product['program'] = None
product['can_buy'] = True
+ product_flashsale = self.product_id._get_active_flash_sale()
+ product['has_flashsale'] = True if len(product_flashsale) > 0 else False
if self.program_line_id:
product['program'] = self.program_line_id.res_format_cart(user=user_data, quantity=self.qty)
diff --git a/indoteknik_custom/views/product_pricelist.xml b/indoteknik_custom/views/product_pricelist.xml
index 0ad9e200..55139a24 100644
--- a/indoteknik_custom/views/product_pricelist.xml
+++ b/indoteknik_custom/views/product_pricelist.xml
@@ -7,29 +7,22 @@
<field name="arch" type="xml">
<field name="company_id" position="after">
<field name="is_flash_sale"/>
- <field name="flashsale_option" attrs="{'invisible':[('is_flash_sale', '=', False)]}"/>
</field>
- <group name="pricelist_settings" position="after">
- <group name="flash_sale_setting">
- <field name="banner" widget="image" attrs="{
- 'invisible': [('is_flash_sale', '=', False)]
- }" />
- <field name="banner_mobile" widget="image" attrs="{
- 'invisible': [('is_flash_sale', '=', False)]
- }" />
- <field name="banner_top" widget="image" attrs="{
- 'invisible': [('is_flash_sale', '=', False)]
- }" />
- <field name="start_date" attrs="{
- 'invisible': [('is_flash_sale', '=', False)],
- 'required': [('is_flash_sale', '=', True)]
- }" />
- <field name="end_date" attrs="{
- 'invisible': [('is_flash_sale', '=', False)],
- 'required': [('is_flash_sale', '=', True)]
- }" />
- </group>
- </group>
+ <page name="pricelist_rules" position="before">
+ <page name="flash_sale_setting" string="Flash Sale" attrs="{'invisible': [('is_flash_sale', '=', False)]}">
+ <group>
+ <group>
+ <field name="flashsale_option" />
+ <field name="flashsale_tag" />
+ <field name="banner" widget="image" />
+ <field name="banner_mobile" widget="image" />
+ <field name="banner_top" widget="image" />
+ <field name="start_date" attrs="{'required': [('is_flash_sale', '=', True)]}" />
+ <field name="end_date" attrs="{'required': [('is_flash_sale', '=', True)]}" />
+ </group>
+ </group>
+ </page>
+ </page>
</field>
</record>
</odoo> \ No newline at end of file