from odoo import models from pytz import timezone from datetime import datetime class ProductPricelist(models.Model): _inherit = 'product.pricelist' def get_product_price(self, pricelist_id: int, product_id: int): price = 0 discounts = [] is_compute_formula = True while is_compute_formula: pricelist = self.env['product.pricelist.item'].search([ ('pricelist_id', '=', pricelist_id), ('product_id', '=', product_id) ], limit=1) if pricelist: if pricelist.compute_price == 'formula': pricelist_id = pricelist.base_pricelist_id.id discounts.append(pricelist.price_discount) else: price = pricelist.fixed_price is_compute_formula = False else: is_compute_formula = False return price, discounts def compute_price(self, pricelist_id: int, product_id: int): """ Compute price with tax, discount formula, and fixed_price @param pricelist_id: id of product.pricelist @param product_id: id of product.product @return: returns price value from pricelist. """ is_flash_sale_product = self.is_flash_sale_product(product_id) if is_flash_sale_product: pricelist_id = is_flash_sale_product price, discounts = self.get_product_price(pricelist_id, product_id) if price == 0: product_pricelist_default_price_id = self.env['ir.config_parameter'].get_param('product.pricelist.default_price_id') price, discounts = self.get_product_price(int(product_pricelist_default_price_id), product_id) price_discount = price discount_percentage = 0 if price > 0: product = self.env['product.product'].browse(product_id) if product: product = product.product_tmpl_id if product.web_tax_id and not product.web_tax_id.price_include: price *= (100 + product.web_tax_id.amount) / 100 price_discount = price for discount in discounts: price_discount *= (100 - discount) / 100 if len(discounts) > 0: discount_percentage = (price - price_discount) / price * 100 return { 'price': price, 'price_discount': price_discount, 'discount_percentage': float("%.2f" % discount_percentage) } def get_lowest_product_variant_price(self, product_template: dict, pricelist_id: int): """ @param product_template: dict of product_template @param pricelist_id: id of pricelist which have default price @return price: object """ product_pricelist_default_price_id = self.env['ir.config_parameter'].get_param('product.pricelist.default_price_id') product_pricelist_default_price_id = int(product_pricelist_default_price_id) product_variant_ids = [x.id for x in product_template.product_variant_ids] product = self.env['product.pricelist.item'].search([ ('pricelist_id', '=', product_pricelist_default_price_id), ('product_id', 'in', product_variant_ids) ], order='fixed_price asc', limit=1) product_id = 0 if product: product_id = product.product_id.id return self.compute_price(pricelist_id, product_id) def get_active_flash_sale(self): """ Check whether have active flash sale in range of date @return: returns pricelist: object """ current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') pricelist = self.search([ ('is_flash_sale', '=', True), ('start_date', '<=', current_time), ('end_date', '>=', current_time) ], limit=1, order='start_date asc') return pricelist def get_is_show_program_flash_sale(self, is_show_program): """ Check whether have active flash sale in range of date @return: returns pricelist: object """ if is_show_program == 'true': is_show_program = True else: is_show_program = False current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') pricelist = self.search([ ('is_flash_sale', '=', True), ('is_show_program', '=', is_show_program), ('start_date', '<=', current_time), ('end_date', '>=', current_time) ], order='number asc') return pricelist def is_flash_sale_product(self, product_id: int): """ Check whether product is flash sale. @param product_id: id of product.product @return: returns pricelist_id: int, if product is flash sale. """ pricelist = self.get_active_flash_sale() if pricelist: pricelist_product_ids = [x.product_id.id for x in pricelist.item_ids] if product_id in pricelist_product_ids: return pricelist.id return False class ProductPricelistItem(models.Model): _inherit = 'product.pricelist.item' def api_single_response(self, item): data = { 'id': item.product_id.id, 'parent': { 'id': item.product_id.product_tmpl_id.id, 'name': item.product_id.product_tmpl_id.name, 'image': self.env['ir.attachment'].api_image('product.template', 'image_256', item.product_id.product_tmpl_id.id) }, 'code': item.product_id.default_code or item.product_tmpl_id.default_code or '', 'name': item.product_id.display_name, 'price':{ 'price': item.product_id._get_website_price_exclude_tax(), 'discount': item.product_id._get_website_disc(0), 'price_discount': item.product_id._get_website_price_after_disc_and_tax() }, 'stock': item.product_id.qty_stock_vendor, 'weight': item.product_id.weight, 'attributes': [x.name for x in item.product_id.product_template_attribute_value_ids], 'manufacture': item.product_id.api_manufacture(item.product_id) } return data