@ -0,0 +1,47 @@ | 
				
			|||||
 | 
					.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg | 
				
			||||
 | 
					    :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html | 
				
			||||
 | 
					    :alt: License: AGPL-3 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Product Brand In Ecommerce | 
				
			||||
 | 
					========================== | 
				
			||||
 | 
					* This module allows you to manage the Product brands easily. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Installation | 
				
			||||
 | 
					============ | 
				
			||||
 | 
					- www.odoo.com/documentation/17.0/setup/install.html | 
				
			||||
 | 
					- Install our custom addon | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					License | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) | 
				
			||||
 | 
					(https://www.gnu.org/licenses/agpl-3.0-standalone.html) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Company | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Credits | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* Developers: Afras Habis, | 
				
			||||
 | 
					             (V15) Midilaj V K, | 
				
			||||
 | 
					             (V16) Neenu Merlin Jose, | 
				
			||||
 | 
					             (V17) Akhil Ashok, Contact : odoo@cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Contacts | 
				
			||||
 | 
					-------- | 
				
			||||
 | 
					* Mail Contact : odoo@cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Bug Tracker | 
				
			||||
 | 
					----------- | 
				
			||||
 | 
					Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Maintainer | 
				
			||||
 | 
					========== | 
				
			||||
 | 
					.. image:: https://cybrosys.com/images/logo.png | 
				
			||||
 | 
					   :target: https://cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					For support and more information, please visit https://www.cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Further information | 
				
			||||
 | 
					=================== | 
				
			||||
 | 
					HTML Description: `<static/description/index.html>`__ | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################### | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Akhil Ashok (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################### | 
				
			||||
 | 
					from . import controllers | 
				
			||||
@ -0,0 +1,43 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################### | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Akhil Ashok (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################### | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					    'name': 'Product Brand In Ecommerce', | 
				
			||||
 | 
					    'version': '17.0.1.0.0', | 
				
			||||
 | 
					    'category': 'eCommerce', | 
				
			||||
 | 
					    'summary': 'Manage Product brand in eCommerce', | 
				
			||||
 | 
					    'description': 'This module allows you to manage the Product brands ' | 
				
			||||
 | 
					                   'easily.', | 
				
			||||
 | 
					    'author': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'company': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'maintainer': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'website': 'https://www.cybrosys.com', | 
				
			||||
 | 
					    'depends': ['product_brand_sale', 'website_sale'], | 
				
			||||
 | 
					    'data': [ | 
				
			||||
 | 
					        'views/product_brand_templates.xml', | 
				
			||||
 | 
					        'views/sale_report_views.xml' | 
				
			||||
 | 
					    ], | 
				
			||||
 | 
					    'images': ['static/description/banner.png'], | 
				
			||||
 | 
					    'license': 'AGPL-3', | 
				
			||||
 | 
					    'installable': True, | 
				
			||||
 | 
					    'auto_install': False, | 
				
			||||
 | 
					    'application': False, | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################### | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Akhil Ashok (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################### | 
				
			||||
 | 
					from . import main | 
				
			||||
@ -0,0 +1,468 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Akhil Ashok (<https://www.cybrosys.com>) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU LESSER | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (LGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					import logging | 
				
			||||
 | 
					from datetime import datetime | 
				
			||||
 | 
					from werkzeug.exceptions import NotFound | 
				
			||||
 | 
					from odoo import fields, http, tools | 
				
			||||
 | 
					from odoo.http import request | 
				
			||||
 | 
					from odoo.addons.http_routing.models.ir_http import slug | 
				
			||||
 | 
					from odoo.addons.payment.controllers import portal as payment_portal | 
				
			||||
 | 
					from odoo.addons.website.controllers.main import QueryURL | 
				
			||||
 | 
					from odoo.addons.website.models.ir_http import sitemap_qs2dom | 
				
			||||
 | 
					from odoo.tools import lazy | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					_logger = logging.getLogger(__name__) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class TableCompute(object): | 
				
			||||
 | 
					    """ | 
				
			||||
 | 
					    Class for computing the arrangement of products on a grid. | 
				
			||||
 | 
					    """ | 
				
			||||
 | 
					    def __init__(self): | 
				
			||||
 | 
					        self.table = {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _check_place(self, posx, posy, sizex, sizey, ppr): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Check if a specified rectangular area is available in the table. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        Parameters: | 
				
			||||
 | 
					            - posx (int): The starting x-coordinate of the area. | 
				
			||||
 | 
					            - posy (int): The starting y-coordinate of the area. | 
				
			||||
 | 
					            - sizex (int): The width of the area. | 
				
			||||
 | 
					            - sizey (int): The height of the area. | 
				
			||||
 | 
					            - ppr (int): Maximum allowed x-coordinate in the table. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        Returns: | 
				
			||||
 | 
					            bool: True if the area is available, False otherwise. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        The function iterates over the specified area and checks if each cell is | 
				
			||||
 | 
					        within the bounds of the table and if the cell is unoccupied. It returns | 
				
			||||
 | 
					        True if the entire area is available; otherwise, it returns False. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        res = True | 
				
			||||
 | 
					        for y in range(sizey): | 
				
			||||
 | 
					            for x in range(sizex): | 
				
			||||
 | 
					                if posx + x >= ppr: | 
				
			||||
 | 
					                    res = False | 
				
			||||
 | 
					                    break | 
				
			||||
 | 
					                row = self.table.setdefault(posy + y, {}) | 
				
			||||
 | 
					                if row.setdefault(posx + x) is not None: | 
				
			||||
 | 
					                    res = False | 
				
			||||
 | 
					                    break | 
				
			||||
 | 
					            for x in range(ppr): | 
				
			||||
 | 
					                self.table[posy + y].setdefault(x, None) | 
				
			||||
 | 
					        return res | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def process(self, products, ppg=20, ppr=4): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Arrange a list of products on a grid and format the result for HTML | 
				
			||||
 | 
					        representation. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        Parameters: | 
				
			||||
 | 
					            - products (list): A list of product objects to be arranged on the | 
				
			||||
 | 
					            grid. | 
				
			||||
 | 
					            - ppg (int): The maximum number of products per grid page | 
				
			||||
 | 
					            (default is 20). | 
				
			||||
 | 
					            - ppr (int): The maximum number of products per row in the grid | 
				
			||||
 | 
					            (default is 4). | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        Returns: | 
				
			||||
 | 
					            list: A formatted representation of the arranged products suitable | 
				
			||||
 | 
					             for HTML rendering.The result is a list of rows, where each row is | 
				
			||||
 | 
					             a list of dictionaries representing products and their positions on | 
				
			||||
 | 
					             the grid. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        The function iterates over the list of products and computes their | 
				
			||||
 | 
					        positions on the grid.It uses a heuristic algorithm to determine the | 
				
			||||
 | 
					        position of each product, taking into account the dimensions of the | 
				
			||||
 | 
					        products, the maximum products per page, and the maximum products per | 
				
			||||
 | 
					        row.The result is formatted as a list of rows, each containing | 
				
			||||
 | 
					        dictionaries representing the products and their positions on the grid. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        # Compute products positions on the grid | 
				
			||||
 | 
					        minpos = 0 | 
				
			||||
 | 
					        index = 0 | 
				
			||||
 | 
					        maxy = 0 | 
				
			||||
 | 
					        x = 0 | 
				
			||||
 | 
					        for p in products: | 
				
			||||
 | 
					            x = min(max(p.website_size_x, 1), ppr) | 
				
			||||
 | 
					            y = min(max(p.website_size_y, 1), ppr) | 
				
			||||
 | 
					            if index >= ppg: | 
				
			||||
 | 
					                x = y = 1 | 
				
			||||
 | 
					            pos = minpos | 
				
			||||
 | 
					            while not self._check_place(pos % ppr, pos // ppr, x, y, ppr): | 
				
			||||
 | 
					                pos += 1 | 
				
			||||
 | 
					            # if 21st products (index 20) and the last line is full (ppr products in it), break | 
				
			||||
 | 
					            # (pos + 1.0) / ppr is the line where the product would be inserted | 
				
			||||
 | 
					            # maxy is the number of existing lines | 
				
			||||
 | 
					            # + 1.0 is because pos begins at 0, thus pos 20 is actually the 21st block | 
				
			||||
 | 
					            # and to force python to not round the division operation | 
				
			||||
 | 
					            if index >= ppg and ((pos + 1.0) // ppr) > maxy: | 
				
			||||
 | 
					                break | 
				
			||||
 | 
					            if x == 1 and y == 1:  # simple heuristic for CPU optimization | 
				
			||||
 | 
					                minpos = pos // ppr | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            for y2 in range(y): | 
				
			||||
 | 
					                for x2 in range(x): | 
				
			||||
 | 
					                    self.table[(pos // ppr) + y2][(pos % ppr) + x2] = False | 
				
			||||
 | 
					            self.table[pos // ppr][pos % ppr] = { | 
				
			||||
 | 
					                'product': p, 'x': x, 'y': y, | 
				
			||||
 | 
					                'ribbon': p.sudo().website_ribbon_id, | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            if index <= ppg: | 
				
			||||
 | 
					                maxy = max(maxy, y + (pos // ppr)) | 
				
			||||
 | 
					            index += 1 | 
				
			||||
 | 
					        # Format table according to HTML needs | 
				
			||||
 | 
					        rows = sorted(self.table.items()) | 
				
			||||
 | 
					        rows = [r[1] for r in rows] | 
				
			||||
 | 
					        for col in range(len(rows)): | 
				
			||||
 | 
					            cols = sorted(rows[col].items()) | 
				
			||||
 | 
					            x += len(cols) | 
				
			||||
 | 
					            rows[col] = [r[1] for r in cols if r[1]] | 
				
			||||
 | 
					        return rows | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class WebsiteSale(payment_portal.PaymentPortal): | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def sitemap_shop(env, rule, qs): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Generate sitemap entries for the Odoo eCommerce shop. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        if not qs or qs.lower() in '/shop': | 
				
			||||
 | 
					            yield {'loc': '/shop'} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        Category = env['product.public.category'] | 
				
			||||
 | 
					        dom = sitemap_qs2dom(qs, '/shop/category', Category._rec_name) | 
				
			||||
 | 
					        dom += env['website'].get_current_website().website_domain() | 
				
			||||
 | 
					        for cat in Category.search(dom): | 
				
			||||
 | 
					            loc = '/shop/category/%s' % slug(cat) | 
				
			||||
 | 
					            if not qs or qs.lower() in loc: | 
				
			||||
 | 
					                yield {'loc': loc} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route([ | 
				
			||||
 | 
					        '/shop', | 
				
			||||
 | 
					        '/shop/page/<int:page>', | 
				
			||||
 | 
					        '/shop/category/<model("product.public.category"):category>', | 
				
			||||
 | 
					        '/shop/category/<model("product.public.category"):category>/' | 
				
			||||
 | 
					        'page/<int:page>', | 
				
			||||
 | 
					        '''/shop/brand/<model("product.brand"):brand>''', | 
				
			||||
 | 
					    ], type='http', auth="public", website=True, sitemap=sitemap_shop) | 
				
			||||
 | 
					    def shop(self, page=0, category=None, search='', min_price=0.0, | 
				
			||||
 | 
					             max_price=0.0, | 
				
			||||
 | 
					             ppg=False, brand=None, **post): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Render the eCommerce shop page. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        This function handles the rendering of the eCommerce shop page based on | 
				
			||||
 | 
					        the provided parameters. | 
				
			||||
 | 
					        It retrieves and filters products, applies pricing rules, and prepares | 
				
			||||
 | 
					        the data for rendering. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        add_qty = int(post.get('add_qty', 1)) | 
				
			||||
 | 
					        try: | 
				
			||||
 | 
					            min_price = float(min_price) | 
				
			||||
 | 
					        except ValueError: | 
				
			||||
 | 
					            min_price = 0 | 
				
			||||
 | 
					        try: | 
				
			||||
 | 
					            max_price = float(max_price) | 
				
			||||
 | 
					        except ValueError: | 
				
			||||
 | 
					            max_price = 0 | 
				
			||||
 | 
					        compute_brand = brand | 
				
			||||
 | 
					        Category = request.env['product.public.category'] | 
				
			||||
 | 
					        if category: | 
				
			||||
 | 
					            category = Category.search([('id', '=', int(category))], limit=1) | 
				
			||||
 | 
					            if not category or not category.can_access_from_current_website(): | 
				
			||||
 | 
					                raise NotFound() | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            category = Category | 
				
			||||
 | 
					        product_brand = request.env['product.brand'] | 
				
			||||
 | 
					        if not brand: | 
				
			||||
 | 
					            brand = product_brand | 
				
			||||
 | 
					        website = request.env['website'].get_current_website() | 
				
			||||
 | 
					        website_domain = website.website_domain() | 
				
			||||
 | 
					        if ppg: | 
				
			||||
 | 
					            try: | 
				
			||||
 | 
					                ppg = int(ppg) | 
				
			||||
 | 
					                post['ppg'] = ppg | 
				
			||||
 | 
					            except ValueError: | 
				
			||||
 | 
					                ppg = False | 
				
			||||
 | 
					        if not ppg: | 
				
			||||
 | 
					            ppg = website.shop_ppg or 20 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        ppr = website.shop_ppr or 4 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        request_args = request.httprequest.args | 
				
			||||
 | 
					        attrib_list = request_args.getlist('attrib') | 
				
			||||
 | 
					        attrib_values = [[int(x) for x in v.split("-")] for v in attrib_list if | 
				
			||||
 | 
					                         v] | 
				
			||||
 | 
					        attributes_ids = {v[0] for v in attrib_values} | 
				
			||||
 | 
					        attrib_set = {v[1] for v in attrib_values} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        filter_by_tags_enabled = website.is_view_active( | 
				
			||||
 | 
					            'website_sale.filter_products_tags') | 
				
			||||
 | 
					        if filter_by_tags_enabled: | 
				
			||||
 | 
					            tags = request_args.getlist('tags') | 
				
			||||
 | 
					            # Allow only numeric tag values to avoid internal error. | 
				
			||||
 | 
					            if tags and all(tag.isnumeric() for tag in tags): | 
				
			||||
 | 
					                post['tags'] = tags | 
				
			||||
 | 
					                tags = {int(tag) for tag in tags} | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                post['tags'] = None | 
				
			||||
 | 
					                tags = {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        keep = QueryURL('/shop', **self._shop_get_query_url_kwargs( | 
				
			||||
 | 
					            category and int(category), search, min_price, max_price, **post)) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        now = datetime.timestamp(datetime.now()) | 
				
			||||
 | 
					        pricelist = website.pricelist_id | 
				
			||||
 | 
					        if 'website_sale_pricelist_time' in request.session: | 
				
			||||
 | 
					            # Check if we need to refresh the cached pricelist | 
				
			||||
 | 
					            pricelist_save_time = request.session['website_sale_pricelist_time'] | 
				
			||||
 | 
					            if pricelist_save_time < now - 60 * 60: | 
				
			||||
 | 
					                request.session.pop('website_sale_current_pl', None) | 
				
			||||
 | 
					                website.invalidate_recordset(['pricelist_id']) | 
				
			||||
 | 
					                pricelist = website.pricelist_id | 
				
			||||
 | 
					                request.session['website_sale_pricelist_time'] = now | 
				
			||||
 | 
					                request.session['website_sale_current_pl'] = pricelist.id | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            request.session['website_sale_pricelist_time'] = now | 
				
			||||
 | 
					            request.session['website_sale_current_pl'] = pricelist.id | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        filter_by_price_enabled = website.is_view_active( | 
				
			||||
 | 
					            'website_sale.filter_products_price') | 
				
			||||
 | 
					        if filter_by_price_enabled: | 
				
			||||
 | 
					            company_currency = website.company_id.currency_id | 
				
			||||
 | 
					            conversion_rate = request.env['res.currency']._get_conversion_rate( | 
				
			||||
 | 
					                company_currency, website.currency_id, | 
				
			||||
 | 
					                request.website.company_id, | 
				
			||||
 | 
					                fields.Date.today()) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            conversion_rate = 1 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        url = '/shop' | 
				
			||||
 | 
					        if search: | 
				
			||||
 | 
					            post['search'] = search | 
				
			||||
 | 
					        if attrib_list: | 
				
			||||
 | 
					            post['attrib'] = attrib_list | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        options = self._get_search_options( | 
				
			||||
 | 
					            category=category, | 
				
			||||
 | 
					            attrib_values=attrib_values, | 
				
			||||
 | 
					            min_price=min_price, | 
				
			||||
 | 
					            max_price=max_price, | 
				
			||||
 | 
					            conversion_rate=conversion_rate, | 
				
			||||
 | 
					            display_currency=website.currency_id, | 
				
			||||
 | 
					            **post | 
				
			||||
 | 
					        ) | 
				
			||||
 | 
					        fuzzy_search_term, product_count, search_product = self._shop_lookup_products( | 
				
			||||
 | 
					            attrib_set, options, post, search, website) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        filter_by_price_enabled = website.is_view_active( | 
				
			||||
 | 
					            'website_sale.filter_products_price') | 
				
			||||
 | 
					        if filter_by_price_enabled: | 
				
			||||
 | 
					            # TODO Find an alternative way to obtain the domain through the search metadata. | 
				
			||||
 | 
					            Product = request.env['product.template'].with_context( | 
				
			||||
 | 
					                bin_size=True) | 
				
			||||
 | 
					            domain = self._get_shop_domain(search, category, attrib_values) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            # This is ~4 times more efficient than a search for the cheapest and most expensive products | 
				
			||||
 | 
					            query = Product._where_calc(domain) | 
				
			||||
 | 
					            Product._apply_ir_rules(query, 'read') | 
				
			||||
 | 
					            from_clause, where_clause, where_params = query.get_sql() | 
				
			||||
 | 
					            query = f""" | 
				
			||||
 | 
					                SELECT COALESCE(MIN(list_price), 0) * {conversion_rate}, COALESCE(MAX(list_price), 0) * {conversion_rate} | 
				
			||||
 | 
					                  FROM {from_clause} | 
				
			||||
 | 
					                 WHERE {where_clause} | 
				
			||||
 | 
					            """ | 
				
			||||
 | 
					            request.env.cr.execute(query, where_params) | 
				
			||||
 | 
					            available_min_price, available_max_price = request.env.cr.fetchone() | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            if min_price or max_price: | 
				
			||||
 | 
					                # The if/else condition in the min_price / max_price value assignment | 
				
			||||
 | 
					                # tackles the case where we switch to a list of products with different | 
				
			||||
 | 
					                # available min / max prices than the ones set in the previous page. | 
				
			||||
 | 
					                # In order to have logical results and not yield empty product lists, the | 
				
			||||
 | 
					                # price filter is set to their respective available prices when the specified | 
				
			||||
 | 
					                # min exceeds the max, and / or the specified max is lower than the available min. | 
				
			||||
 | 
					                if min_price: | 
				
			||||
 | 
					                    min_price = min_price if min_price <= available_max_price else available_min_price | 
				
			||||
 | 
					                    post['min_price'] = min_price | 
				
			||||
 | 
					                if max_price: | 
				
			||||
 | 
					                    max_price = max_price if max_price >= available_min_price else available_max_price | 
				
			||||
 | 
					                    post['max_price'] = max_price | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if filter_by_tags_enabled: | 
				
			||||
 | 
					            if ( | 
				
			||||
 | 
					                    search_product.product_tag_ids | 
				
			||||
 | 
					                    or search_product.product_variant_ids.additional_product_tag_ids | 
				
			||||
 | 
					            ): | 
				
			||||
 | 
					                ProductTag = request.env['product.tag'] | 
				
			||||
 | 
					                all_tags = ProductTag.search( | 
				
			||||
 | 
					                    [('product_ids.is_published', '=', True), | 
				
			||||
 | 
					                     ('visible_on_ecommerce', '=', True)] | 
				
			||||
 | 
					                    + website_domain | 
				
			||||
 | 
					                ) | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                all_tags = [] | 
				
			||||
 | 
					        categs_domain = [('parent_id', '=', False)] + website_domain | 
				
			||||
 | 
					        if search: | 
				
			||||
 | 
					            search_categories = Category.search( | 
				
			||||
 | 
					                [( | 
				
			||||
 | 
					                 'product_tmpl_ids', 'in', search_product.ids)] + website_domain | 
				
			||||
 | 
					            ).parents_and_self | 
				
			||||
 | 
					            categs_domain.append(('id', 'in', search_categories.ids)) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            search_categories = Category | 
				
			||||
 | 
					        categs = lazy(lambda: Category.search(categs_domain)) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if category: | 
				
			||||
 | 
					            url = "/shop/category/%s" % slug(category) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        pager = website.pager(url=url, total=product_count, page=page, step=ppg, | 
				
			||||
 | 
					                              scope=7, url_args=post) | 
				
			||||
 | 
					        offset = pager['offset'] | 
				
			||||
 | 
					        products = search_product[offset:offset + ppg] | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        ProductAttribute = request.env['product.attribute'] | 
				
			||||
 | 
					        if products: | 
				
			||||
 | 
					            # get all products without limit | 
				
			||||
 | 
					            attributes = lazy(lambda: ProductAttribute.search([ | 
				
			||||
 | 
					                ('product_tmpl_ids', 'in', search_product.ids), | 
				
			||||
 | 
					                ('visibility', '=', 'visible'), | 
				
			||||
 | 
					            ])) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            attributes = lazy(lambda: ProductAttribute.browse(attributes_ids)) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        layout_mode = request.session.get('website_sale_shop_layout_mode') | 
				
			||||
 | 
					        if not layout_mode: | 
				
			||||
 | 
					            if website.viewref('website_sale.products_list_view').active: | 
				
			||||
 | 
					                layout_mode = 'list' | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                layout_mode = 'grid' | 
				
			||||
 | 
					            request.session['website_sale_shop_layout_mode'] = layout_mode | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        # Try to fetch geoip based fpos or fallback on partner one | 
				
			||||
 | 
					        fiscal_position_sudo = website.fiscal_position_id.sudo() | 
				
			||||
 | 
					        products_prices = lazy( | 
				
			||||
 | 
					            lambda: products._get_sales_prices(pricelist, fiscal_position_sudo)) | 
				
			||||
 | 
					        products_prices_brand = lazy( | 
				
			||||
 | 
					            lambda: search_product._get_sales_prices(pricelist, fiscal_position_sudo)) | 
				
			||||
 | 
					        product_brand = request.env['product.brand'].search([]) | 
				
			||||
 | 
					        if compute_brand: | 
				
			||||
 | 
					            products_brand = request.env['product.template'].search( | 
				
			||||
 | 
					                ['&', '&', ('brand_id', '=', brand.id), ('sale_ok', '=', True), | 
				
			||||
 | 
					                 ('is_published', '=', True)]) | 
				
			||||
 | 
					            product_brand_count = len(products_brand) | 
				
			||||
 | 
					            pager_brand = request.website.pager(url=url, | 
				
			||||
 | 
					                                                total=product_brand_count, | 
				
			||||
 | 
					                                                page=page, step=ppg, scope=7, | 
				
			||||
 | 
					                                                url_args=post) | 
				
			||||
 | 
					            values = { | 
				
			||||
 | 
					                'search': fuzzy_search_term or search, | 
				
			||||
 | 
					                'original_search': fuzzy_search_term and search, | 
				
			||||
 | 
					                'order': post.get('order', ''), | 
				
			||||
 | 
					                'category': category, | 
				
			||||
 | 
					                'brand': brand, | 
				
			||||
 | 
					                'attrib_values': attrib_values, | 
				
			||||
 | 
					                'attrib_set': attrib_set, | 
				
			||||
 | 
					                'pager': pager_brand, | 
				
			||||
 | 
					                'pricelist': pricelist, | 
				
			||||
 | 
					                'fiscal_position': fiscal_position_sudo, | 
				
			||||
 | 
					                'add_qty': add_qty, | 
				
			||||
 | 
					                'products': products_brand, | 
				
			||||
 | 
					                'search_product': search_product, | 
				
			||||
 | 
					                'search_count': product_brand_count,  # common for all searchbox | 
				
			||||
 | 
					                'bins': lazy( | 
				
			||||
 | 
					                    lambda: TableCompute().process(products_brand, ppg, ppr)), | 
				
			||||
 | 
					                'ppg': ppg, | 
				
			||||
 | 
					                'ppr': ppr, | 
				
			||||
 | 
					                'categories': categs, | 
				
			||||
 | 
					                'attributes': attributes, | 
				
			||||
 | 
					                'keep': keep, | 
				
			||||
 | 
					                'search_categories_ids': search_categories.ids, | 
				
			||||
 | 
					                'layout_mode': layout_mode, | 
				
			||||
 | 
					                'brands':product_brand, | 
				
			||||
 | 
					                'products_prices': products_prices, | 
				
			||||
 | 
					                'get_product_prices': lambda product: lazy( | 
				
			||||
 | 
					                    lambda: products_prices_brand[product.id]), | 
				
			||||
 | 
					                'float_round': tools.float_round, | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            if filter_by_price_enabled: | 
				
			||||
 | 
					                values['min_price'] = min_price or available_min_price | 
				
			||||
 | 
					                values['max_price'] = max_price or available_max_price | 
				
			||||
 | 
					                values['available_min_price'] = tools.float_round( | 
				
			||||
 | 
					                    available_min_price, | 
				
			||||
 | 
					                    2) | 
				
			||||
 | 
					                values['available_max_price'] = tools.float_round( | 
				
			||||
 | 
					                    available_max_price, | 
				
			||||
 | 
					                    2) | 
				
			||||
 | 
					            if filter_by_tags_enabled: | 
				
			||||
 | 
					                values.update({'all_tags': all_tags, 'tags': tags}) | 
				
			||||
 | 
					            if category: | 
				
			||||
 | 
					                values['main_object'] = category | 
				
			||||
 | 
					            values.update(self._get_additional_shop_values(values)) | 
				
			||||
 | 
					            return request.render("website_sale.products", values) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            values = { | 
				
			||||
 | 
					                'brand': brand, | 
				
			||||
 | 
					                'search': search, | 
				
			||||
 | 
					                'category': category, | 
				
			||||
 | 
					                'original_search': fuzzy_search_term and search, | 
				
			||||
 | 
					                'order': post.get('order', ''), | 
				
			||||
 | 
					                'attrib_values': attrib_values, | 
				
			||||
 | 
					                'attrib_set': attrib_set, | 
				
			||||
 | 
					                'pager': pager, | 
				
			||||
 | 
					                'pricelist': pricelist, | 
				
			||||
 | 
					                'add_qty': add_qty, | 
				
			||||
 | 
					                'products': products, | 
				
			||||
 | 
					                'search_count': product_count,  # common for all searchbox | 
				
			||||
 | 
					                'bins': lazy( | 
				
			||||
 | 
					                    lambda: TableCompute().process(products, ppg, ppr)), | 
				
			||||
 | 
					                'ppg': ppg, | 
				
			||||
 | 
					                'ppr': ppr, | 
				
			||||
 | 
					                'categories': categs, | 
				
			||||
 | 
					                'attributes': attributes, | 
				
			||||
 | 
					                'keep': keep, | 
				
			||||
 | 
					                'search_categories_ids': search_categories.ids, | 
				
			||||
 | 
					                'layout_mode': layout_mode, | 
				
			||||
 | 
					                'brands': product_brand, | 
				
			||||
 | 
					                'products_prices': products_prices, | 
				
			||||
 | 
					                'get_product_prices': lambda product: lazy( | 
				
			||||
 | 
					                    lambda: products_prices[product.id]), | 
				
			||||
 | 
					                'float_round': tools.float_round, | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            if filter_by_price_enabled: | 
				
			||||
 | 
					                values['min_price'] = min_price or available_min_price | 
				
			||||
 | 
					                values['max_price'] = max_price or available_max_price | 
				
			||||
 | 
					                values['available_min_price'] = tools.float_round( | 
				
			||||
 | 
					                    available_min_price, | 
				
			||||
 | 
					                    2) | 
				
			||||
 | 
					                values['available_max_price'] = tools.float_round( | 
				
			||||
 | 
					                    available_max_price, | 
				
			||||
 | 
					                    2) | 
				
			||||
 | 
					            if filter_by_tags_enabled: | 
				
			||||
 | 
					                values.update({'all_tags': all_tags, 'tags': tags}) | 
				
			||||
 | 
					            if category: | 
				
			||||
 | 
					                values['main_object'] = category | 
				
			||||
 | 
					            values.update(self._get_additional_shop_values(values)) | 
				
			||||
 | 
					            return request.render("website_sale.products", values) | 
				
			||||
@ -0,0 +1,6 @@ | 
				
			|||||
 | 
					## Module <product_brand_ecommerce> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#### 23.04.2024 | 
				
			||||
 | 
					#### Version 17.0.1.0.0 | 
				
			||||
 | 
					#### ADD | 
				
			||||
 | 
					- Initial commit for Product Brand In Ecommerce | 
				
			||||
| 
		 After Width: | Height: | Size: 36 KiB  | 
| 
		 After Width: | Height: | Size: 3.6 KiB  | 
| 
		 After Width: | Height: | Size: 310 B  | 
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 576 B  | 
| 
		 After Width: | Height: | Size: 733 B  | 
| 
		 After Width: | Height: | Size: 911 B  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 673 B  | 
| 
		 After Width: | Height: | Size: 11 KiB  | 
| 
		 After Width: | Height: | Size: 878 B  | 
| 
		 After Width: | Height: | Size: 653 B  | 
| 
		 After Width: | Height: | Size: 905 B  | 
| 
		 After Width: | Height: | Size: 839 B  | 
| 
		 After Width: | Height: | Size: 427 B  | 
| 
		 After Width: | Height: | Size: 627 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 988 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 80 KiB  | 
| 
		 After Width: | Height: | Size: 3.2 KiB  | 
| 
		 After Width: | Height: | Size: 565 B  | 
| 
		 After Width: | Height: | Size: 26 KiB  | 
| 
		 After Width: | Height: | Size: 43 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 4.0 KiB  | 
| 
		 After Width: | Height: | Size: 38 KiB  | 
| 
		 After Width: | Height: | Size: 4.3 KiB  | 
| 
		 After Width: | Height: | Size: 87 KiB  | 
| 
		 After Width: | Height: | Size: 532 KiB  | 
| 
		 After Width: | Height: | Size: 85 KiB  | 
| 
		 After Width: | Height: | Size: 81 KiB  | 
| 
		 After Width: | Height: | Size: 44 KiB  | 
| 
		 After Width: | Height: | Size: 82 KiB  | 
| 
		 After Width: | Height: | Size: 288 KiB  | 
| 
		 After Width: | Height: | Size: 169 KiB  | 
| 
		 After Width: | Height: | Size: 58 KiB  | 
| 
		 After Width: | Height: | Size: 50 KiB  | 
| 
		 After Width: | Height: | Size: 143 KiB  | 
| 
		 After Width: | Height: | Size: 88 KiB  | 
| 
		 After Width: | Height: | Size: 12 KiB  | 
@ -0,0 +1,606 @@ | 
				
			|||||
 | 
					<!DOCTYPE html> | 
				
			||||
 | 
					<html lang="en"> | 
				
			||||
 | 
					<head> | 
				
			||||
 | 
					    <meta charset="UTF-8"> | 
				
			||||
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0"> | 
				
			||||
 | 
					    <title>Product Brand In Ecommerce</title> | 
				
			||||
 | 
					    <!-- Bootstrap CSS --> | 
				
			||||
 | 
					    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" | 
				
			||||
 | 
					        integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> | 
				
			||||
 | 
					    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css"> | 
				
			||||
 | 
					    <link rel="preconnect" href="https://fonts.googleapis.com"> | 
				
			||||
 | 
					    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | 
				
			||||
 | 
					    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> | 
				
			||||
 | 
					</head> | 
				
			||||
 | 
					<body> | 
				
			||||
 | 
					    <section> | 
				
			||||
 | 
					        <div class="container" style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;"> | 
				
			||||
 | 
					            <div class="row"> | 
				
			||||
 | 
					                <div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center" | 
				
			||||
 | 
					                    style="border-bottom:1px solid rgba(0, 0, 0, 0.22)"> | 
				
			||||
 | 
					                    <div class="my-3"> | 
				
			||||
 | 
					                        <img src="assets/misc/Cybrosys R.png" style="width:auto !important; height:40px !important"> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="my-3 d-flex align-items-center"> | 
				
			||||
 | 
					                        <div class="text-center" | 
				
			||||
 | 
					                            style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;"> | 
				
			||||
 | 
					                            Community | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="text-center" | 
				
			||||
 | 
					                            style="background-color:#875A7B !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important;min-width: 120px !important;"> | 
				
			||||
 | 
					                            Enterprise | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="text-center" | 
				
			||||
 | 
					                            style="background-color:#7C7BAD !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;"> | 
				
			||||
 | 
					                            Odoo.sh | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="row"> | 
				
			||||
 | 
					                <div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column" | 
				
			||||
 | 
					                    style="margin: 80px 0px !important;"> | 
				
			||||
 | 
					                    <h1 style="font-size: 2.8rem;font-weight: 700; color: | 
				
			||||
 | 
					                    #1A202C;"> | 
				
			||||
 | 
					                        Product Brand In Ecommerce</h1> | 
				
			||||
 | 
					                    <p class="my-3 mb-4" | 
				
			||||
 | 
					                        style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;"> | 
				
			||||
 | 
					                        Easily Manage Product Brands. | 
				
			||||
 | 
					                    </p> | 
				
			||||
 | 
					                    <div style="width: 80%; margin-top: 3rem;"> | 
				
			||||
 | 
					                        <img src="assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto"> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container mt-5 mb-5"> | 
				
			||||
 | 
					                <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> | 
				
			||||
 | 
					                    <p class="m-0" style="font-weight: 600; font-size: 24px; color:#714b67 !important">Key Highlights | 
				
			||||
 | 
					                    </p> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="row py-4"> | 
				
			||||
 | 
					                    <div class="col-md-6 col-sm-12 p-3"> | 
				
			||||
 | 
					                        <div class="d-flex   h-100" style="padding: 30px;border-radius: 12px; | 
				
			||||
 | 
					                                    background: #FFF; | 
				
			||||
 | 
					                                    box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> | 
				
			||||
 | 
					                            <div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; | 
				
			||||
 | 
					                                    display: flex; justify-content: center; align-items: center; | 
				
			||||
 | 
					                                    margin-right: 10px; flex-shrink: 0;"> | 
				
			||||
 | 
					                                <i class="fa-solid fa-star  " style="color: #fff;font-size:14px;"></i> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div> | 
				
			||||
 | 
					                                <p style="color: #1A202C;font-weight: 600; | 
				
			||||
 | 
					                                      font-size: 1.2rem; margin-bottom: 2px;">Activate Product Brand Filter.</p> | 
				
			||||
 | 
					                                <p class="m-0" style="color:#718096"> | 
				
			||||
 | 
					                                    The product brand filter will be displayed on the e-commerce website. | 
				
			||||
 | 
					                                </p> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-6 col-sm-12 p-3"> | 
				
			||||
 | 
					                        <div class="d-flex   h-100" style="padding: 30px;border-radius: 12px; | 
				
			||||
 | 
					                                    background: #FFF; | 
				
			||||
 | 
					                                    box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> | 
				
			||||
 | 
					                            <div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; | 
				
			||||
 | 
					                                    display: flex; justify-content: center; align-items: center; | 
				
			||||
 | 
					                                    margin-right: 10px; flex-shrink: 0;"> | 
				
			||||
 | 
					                                <i class="fa-solid fa-star  " style="color: #fff;font-size:14px;"></i> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div> | 
				
			||||
 | 
					                                <p style="color: #1A202C;font-weight: 600; | 
				
			||||
 | 
					                                      font-size: 1.2rem; margin-bottom: 2px;">Product Brand in Pivot View.</p> | 
				
			||||
 | 
					                                <p class="m-0" style="color:#718096"> | 
				
			||||
 | 
					                                    User can Filter by product brand in pivot view. | 
				
			||||
 | 
					                                </p> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-6 col-sm-12 p-3"> | 
				
			||||
 | 
					                        <div class="d-flex   h-100" style="padding: 30px;border-radius: 12px; | 
				
			||||
 | 
					                                    background: #FFF; | 
				
			||||
 | 
					                                    box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> | 
				
			||||
 | 
					                            <div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; | 
				
			||||
 | 
					                                    display: flex; justify-content: center; align-items: center; | 
				
			||||
 | 
					                                    margin-right: 10px; flex-shrink: 0;"> | 
				
			||||
 | 
					                                <i class="fa-solid fa-star  " style="color: #fff;font-size:14px;"></i> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div> | 
				
			||||
 | 
					                                <p style="color: #1A202C;font-weight: 600; | 
				
			||||
 | 
					                                      font-size: 1.2rem; margin-bottom: 2px;">Community & Enterprise Support</p> | 
				
			||||
 | 
					                                <p class="m-0" style="color:#718096"> | 
				
			||||
 | 
					                                    Support in Enterprise and Community versions. | 
				
			||||
 | 
					                                </p> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container rounded" > | 
				
			||||
 | 
					                <ul class="nav nav-tabs d-flex" style="width: fit-content;margin: 0 auto;gap: 1rem;"> | 
				
			||||
 | 
					                    <li class="col text-center py-2 text-nowrap " | 
				
			||||
 | 
					                        style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"><a | 
				
			||||
 | 
					                            class="active show" data-toggle="tab" href="#tab1" | 
				
			||||
 | 
					                            style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;"> | 
				
			||||
 | 
					                            <i class="fa-regular fa-image  pr-2" style="color: #fff;"></i> | 
				
			||||
 | 
					                            Screenshots</a></li> | 
				
			||||
 | 
					                    <li class="col text-center py-2 text-nowrap " | 
				
			||||
 | 
					                        style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"><a | 
				
			||||
 | 
					                            data-toggle="tab" href="#tab2" | 
				
			||||
 | 
					                            style="color: #fff;font-weight: 500;  text-decoration: none;"><i | 
				
			||||
 | 
					                                class="fa-solid fa-star  pr-2" style="color: #fff;"></i>Features</a></li> | 
				
			||||
 | 
					                    <li class="col text-center py-2 text-nowrap " | 
				
			||||
 | 
					                        style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"><a | 
				
			||||
 | 
					                            data-toggle="tab" href="#tab3" | 
				
			||||
 | 
					                            style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i | 
				
			||||
 | 
					                                class="fa-solid fa-book-open  pr-2" style="color: #fff;"></i>Released Notes</a></li> | 
				
			||||
 | 
					                </ul> | 
				
			||||
 | 
					                <div class="tab-content" style="background-color: rgba(121, 113, 119, 0.04);"> | 
				
			||||
 | 
					                    <div id="tab1" class="tab-pane fade in active show"> | 
				
			||||
 | 
					                        <div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> | 
				
			||||
 | 
					                            <div | 
				
			||||
 | 
					                                style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                <div class="row justify-content-center p-3 w-100 m-0"> | 
				
			||||
 | 
					                                    <img src="assets/screenshots/1.png" class="img-responsive" width="100%" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <div class="px-3"> | 
				
			||||
 | 
					                                    <h4 class="mt-2" | 
				
			||||
 | 
					                                        style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> | 
				
			||||
 | 
					                                        The product brand filter will be displayed on the e-commerce website.</h4> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> | 
				
			||||
 | 
					                            <div | 
				
			||||
 | 
					                                style="border: 1px solid #d8d6d6; border-radius: 4px;  background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                <div class="row justify-content-center p-3 w-100 m-0"> | 
				
			||||
 | 
					                                    <img src="assets/screenshots/2.png" class="img-responsive" width="100%" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <div class="px-3"> | 
				
			||||
 | 
					                                    <h4 class="mt-2" | 
				
			||||
 | 
					                                        style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> | 
				
			||||
 | 
					                                         Products in the selected brand.</h4> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> | 
				
			||||
 | 
					                            <div | 
				
			||||
 | 
					                                style="border: 1px solid #d8d6d6; border-radius: 4px;  background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                <div class="row justify-content-center p-3 w-100 m-0"> | 
				
			||||
 | 
					                                    <img src="assets/screenshots/3.png" class="img-responsive" width="100%" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <div class="px-3"> | 
				
			||||
 | 
					                                    <h4 class="mt-2" | 
				
			||||
 | 
					                                        style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> | 
				
			||||
 | 
					                                        Brand filter available in pivot view.</h4> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col-lg-12 py-2" style="padding: 1rem 4rem !important;"> | 
				
			||||
 | 
					                            <div | 
				
			||||
 | 
					                                style="border: 1px solid #d8d6d6; border-radius: 4px;  background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                <div class="row justify-content-center p-3 w-100 m-0"> | 
				
			||||
 | 
					                                    <img src="assets/screenshots/4.png" class="img-responsive" width="100%" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <div class="px-3"> | 
				
			||||
 | 
					                                    <h4 class="mt-2" | 
				
			||||
 | 
					                                        style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> | 
				
			||||
 | 
					                                        User can filter by product brand in pivot view.</h4> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                        <div id="tab2" class="tab-pane fade"> | 
				
			||||
 | 
					                        <div class="col-mg-12" style="padding: 1rem 4rem;"> | 
				
			||||
 | 
					                            <ul style="list-style: none; padding: 1rem 0;font-weight: 500;"> | 
				
			||||
 | 
					                                <li class="py-3" | 
				
			||||
 | 
					                                    style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                    <span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" | 
				
			||||
 | 
					                                            width="16px"></span>Product Brand Filter will be displayed in the eCommerce website. | 
				
			||||
 | 
					                                </li> | 
				
			||||
 | 
					                                <li class="py-3" | 
				
			||||
 | 
					                                    style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                    <span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" | 
				
			||||
 | 
					                                            width="16px"></span>View of products available under each brand. | 
				
			||||
 | 
					                                </li> | 
				
			||||
 | 
					                                <li class="py-3" | 
				
			||||
 | 
					                                    style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                    <span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" | 
				
			||||
 | 
					                                            width="16px"></span>Brand filter available in pivot view. | 
				
			||||
 | 
					                                </li> | 
				
			||||
 | 
					                                <li class="py-3" | 
				
			||||
 | 
					                                    style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                    <span style="margin-right: 12px;"><img src="assets/misc/star (1) 2.svg" alt="" | 
				
			||||
 | 
					                                            width="16px"></span>User can Filter by product brand in pivot view. | 
				
			||||
 | 
					                                </li> | 
				
			||||
 | 
					                            </ul> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div id="tab3" class="tab-pane fade"> | 
				
			||||
 | 
					                        <div class="col-mg-12 active" style="padding: 1rem 4rem;"> | 
				
			||||
 | 
					                            <div class="py-3" | 
				
			||||
 | 
					                                style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> | 
				
			||||
 | 
					                                <div class="d-flex mb-3" style="font-size: 0.8rem; font-weight: 500;"><span>Version | 
				
			||||
 | 
					                                        17.0.1.0.0</span><span class="px-2">|</span><span | 
				
			||||
 | 
					                                        style="color: #714B67;font-weight: 600;">Released on:23rd April 2024</span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <p class="m-0" | 
				
			||||
 | 
					                                    style=" color:#718096!important; font-size:1rem !important;line-height: 28px;"> | 
				
			||||
 | 
					                                    Initial Commit for PRODUCT BRAND IN ECOMMERCE.</p> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container mt-5"> | 
				
			||||
 | 
					                <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> | 
				
			||||
 | 
					                    <p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Related Products</p> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div id="myCarousel" class="carousel slide py-3" data-ride="carousel"> | 
				
			||||
 | 
					              <div class="carousel-inner"> | 
				
			||||
 | 
					                <div class="carousel-item active"> | 
				
			||||
 | 
					                    <div class="row p-4"> | 
				
			||||
 | 
					                        <div class="col"> | 
				
			||||
 | 
					                            <div class="p-3"> | 
				
			||||
 | 
					                                <a href="https://apps.odoo.com/apps/modules/17.0/base_accounting_kit/" | 
				
			||||
 | 
					                                   style="color: #000; text-decoration: none;"> | 
				
			||||
 | 
					                                    <div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> | 
				
			||||
 | 
					                                        <div style="width: 300px; "> | 
				
			||||
 | 
					                                            <img src="assets/modules/1.jpg" | 
				
			||||
 | 
					                                                 alt="" width="100%" | 
				
			||||
 | 
					                                                 height="auto"> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <p class="text-center pt-2 text-black font-weight-bold"> | 
				
			||||
 | 
					                                            Odoo 17 Full Accounting Kit</p> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col"> | 
				
			||||
 | 
					                            <div class="p-3"> | 
				
			||||
 | 
					                                <a href="https://apps.odoo.com/apps/modules/17.0/auto_database_backup/" | 
				
			||||
 | 
					                                   style="color: #000; text-decoration: none;"> | 
				
			||||
 | 
					                                    <div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> | 
				
			||||
 | 
					                                        <div style="width: 300px; "> | 
				
			||||
 | 
					                                            <img src="assets/modules/2.gif" | 
				
			||||
 | 
					                                                 alt="" width="100%" | 
				
			||||
 | 
					                                                 height="auto"> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <p class="text-center pt-2 text-black font-weight-bold"> | 
				
			||||
 | 
					                                            Automatic Database Backup To Local Server, Remote Server,Google Drive, Dropbox, Onedrive, Nextcloud and Amazon S3</p> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col"> | 
				
			||||
 | 
					                            <div class="p-3"> | 
				
			||||
 | 
					                                <a href="https://apps.odoo.com/apps/modules/17.0/whatsapp_redirect/" | 
				
			||||
 | 
					                                   style="color: #000; text-decoration: none;"> | 
				
			||||
 | 
					                                    <div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> | 
				
			||||
 | 
					                                        <div style="width: 300px; "> | 
				
			||||
 | 
					                                            <img src="assets/modules/3.jpg" | 
				
			||||
 | 
					                                                 alt="" width="100%" | 
				
			||||
 | 
					                                                 height="auto"> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <p class="text-center pt-2 text-black font-weight-bold"> | 
				
			||||
 | 
					                                            Send Whatsapp Message</p> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="carousel-item"> | 
				
			||||
 | 
					                    <div class="row p-4"> | 
				
			||||
 | 
					                        <div class="col"> | 
				
			||||
 | 
					                            <div class="p-3"> | 
				
			||||
 | 
					                                <a href="https://apps.odoo.com/apps/modules/17.0/base_account_budget/" | 
				
			||||
 | 
					                                   style="color: #000; text-decoration: none;"> | 
				
			||||
 | 
					                                    <div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> | 
				
			||||
 | 
					                                        <div style="width: 300px; "> | 
				
			||||
 | 
					                                            <img src="assets/modules/4.jpg" | 
				
			||||
 | 
					                                                 alt="" width="100%" | 
				
			||||
 | 
					                                                 height="auto"> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <p class="text-center pt-2 text-black font-weight-bold"> | 
				
			||||
 | 
					                                            Budget Management</p> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col"> | 
				
			||||
 | 
					                            <div class="p-3"> | 
				
			||||
 | 
					                                <a href="https://apps.odoo.com/apps/modules/17.0/login_user_detail/" | 
				
			||||
 | 
					                                   style="color: #000; text-decoration: none;"> | 
				
			||||
 | 
					                                    <div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> | 
				
			||||
 | 
					                                        <div style="width: 300px;"> | 
				
			||||
 | 
					                                            <img src="assets/modules/5.png" | 
				
			||||
 | 
					                                                 alt="" width="100%" | 
				
			||||
 | 
					                                                 height="auto"> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <p class="text-center pt-2 text-black font-weight-bold"> | 
				
			||||
 | 
					                                            User Log Details</p> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="col"> | 
				
			||||
 | 
					                            <div class="p-3"> | 
				
			||||
 | 
					                                <a href="https://apps.odoo.com/apps/modules/17.0/hr_payroll_account_community/" | 
				
			||||
 | 
					                                   style="color: #000; text-decoration: none;"> | 
				
			||||
 | 
					                                    <div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> | 
				
			||||
 | 
					                                        <div style="width: 300px;"> | 
				
			||||
 | 
					                                            <img src="assets/modules/6.jpg" | 
				
			||||
 | 
					                                                 alt="" width="100%" | 
				
			||||
 | 
					                                                 height="auto"> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <p class="text-center pt-2 text-black font-weight-bold"> | 
				
			||||
 | 
					                                            Odoo17 Payroll Accounting</p> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					                <a class="carousel-control-prev" href="#myCarousel" data-slide="prev" style="width: 35px; color: #000;"> | 
				
			||||
 | 
					                    <span class="carousel-control-prev-icon"> | 
				
			||||
 | 
					                        <i class="fa fa-chevron-left" style="font-size: 24px;"></i> | 
				
			||||
 | 
					                    </span> | 
				
			||||
 | 
					                </a> | 
				
			||||
 | 
					                <a class="carousel-control-next" href="#myCarousel" data-slide="next" style="width: 35px; color: #000;"> | 
				
			||||
 | 
					                    <span class="carousel-control-next-icon"> | 
				
			||||
 | 
					                        <i class="fa fa-chevron-right" style="font-size: 24px;"></i> | 
				
			||||
 | 
					                    </span> | 
				
			||||
 | 
					                </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container mt-5"> | 
				
			||||
 | 
					                <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> | 
				
			||||
 | 
					                    <p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Our Services</p> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container my-5"> | 
				
			||||
 | 
					                <div class="row py-3"> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center;  box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/cogs.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Customization</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#DBC711; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/wrench.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Implementation</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center;  box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/lifebuoy.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Support</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/user.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Hire Odoo Developer</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center;  box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#54A0FF; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/puzzle.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Integration</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center;  box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/update.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Migration</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center;  box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/consultation.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Consultancy</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/training.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Implementation</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-4 col-sm-6 px-4 py-4"> | 
				
			||||
 | 
					                        <div | 
				
			||||
 | 
					                            style="background-color: #fff; padding: 25px; text-align: center;  box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> | 
				
			||||
 | 
					                            <div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> | 
				
			||||
 | 
					                                <div style="background-color:#E6BE26; border-radius: 50%; padding: 15px;    width: 68px; | 
				
			||||
 | 
					                                    height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> | 
				
			||||
 | 
					                                    <img src="assets/icons/license.png" alt="service-icon" width="38px" height="auto"> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <p style="margin-top: 20px; font-weight: bold;">Odoo Licensing Consultancy</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container mt-5"> | 
				
			||||
 | 
					                <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> | 
				
			||||
 | 
					                    <p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Our Industries</p> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container"> | 
				
			||||
 | 
					                <div class="row my-5 py-4"> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6 p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100 " | 
				
			||||
 | 
					                            style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid  rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);"> | 
				
			||||
 | 
					                            <img src="assets/icons/trading-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                           font-size: 1.2rem; margin-bottom: 2px;">Trading</p> | 
				
			||||
 | 
					                            <p>Easily procure and sell your products</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6  p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid  rgb(209, 209, 209); padding: 30px;"> | 
				
			||||
 | 
					                            <img src="assets/icons/pos-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">POS</p> | 
				
			||||
 | 
					                            <p>Easy configuration and convivial experience</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6  p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style="border-right: 1px solid  rgb(209, 209, 209);border-bottom: 1px solid   rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px  rgba(228, 227, 227, 0.373)"> | 
				
			||||
 | 
					                            <img src="assets/icons/education-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">Education</p> | 
				
			||||
 | 
					                            <p>A platform for educational management</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6  p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style="border-bottom: 1px solid  rgb(209, 209, 209); padding: 30px; "> | 
				
			||||
 | 
					                            <img src="assets/icons/manufacturing-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">Manufacturing</p> | 
				
			||||
 | 
					                            <p>Plan, track and schedule your operations</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6 p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style="border-right: 1px solid  rgb(209, 209, 209); padding: 30px;"> | 
				
			||||
 | 
					                            <img src="assets/icons/ecom-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">E-commerce & Website</p> | 
				
			||||
 | 
					                            <p>Mobile friendly, awe-inspiring product pages</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6   p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style="border-right: 1px solid  rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px  rgba(228, 227, 227, 0.373);"> | 
				
			||||
 | 
					                            <img src="assets/icons/service-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">Service Management</p> | 
				
			||||
 | 
					                            <p>Keep track of services and invoice</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6    p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style="border-right: 1px solid  rgb(209, 209, 209); padding: 30px; "> | 
				
			||||
 | 
					                            <img src="assets/icons/restaurant-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">Restaurant</p> | 
				
			||||
 | 
					                            <p>Run your bar or restaurant methodically</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-3 col-sm-6   p-0"> | 
				
			||||
 | 
					                        <div class="d-flex flex-column h-100" | 
				
			||||
 | 
					                            style=" padding: 30px;box-shadow: -5px 0 10px  rgba(228, 227, 227, 0.373);"> | 
				
			||||
 | 
					                            <img src="assets/icons/hotel-black.png" width="42px" height="auto" alt=""> | 
				
			||||
 | 
					                            <p style="color: #714B67;font-weight: 600; margin-top: 10px; | 
				
			||||
 | 
					                            font-size: 1.2rem; margin-bottom: 2px;">Hotel Management</p> | 
				
			||||
 | 
					                            <p>An all-inclusive hotel management application</p> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container mt-5"> | 
				
			||||
 | 
					                <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> | 
				
			||||
 | 
					                    <p class="m-0" style="font-weight: 600; font-size: 24px; color:#000 !important">Support</p> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="container my-5"> | 
				
			||||
 | 
					                <div class="row" style="background-color: #FFFAFE;"> | 
				
			||||
 | 
					                    <div class="col-md-6 pb-4  d-flex align-items-center justify-content-center" | 
				
			||||
 | 
					                        style="border-right: 1px solid #D9D9D9;"> | 
				
			||||
 | 
					                        <div style="padding: 30px;"> | 
				
			||||
 | 
					                            <div class="d-flex align-items-center"> | 
				
			||||
 | 
					                                <img src="assets/misc/support (1) 1.svg" alt="" width="60px" style="margin-right: 12px;"> | 
				
			||||
 | 
					                                <div style="padding: 0px 8px;"> | 
				
			||||
 | 
					                                    <span | 
				
			||||
 | 
					                                        style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need | 
				
			||||
 | 
					                                        Help?</span> | 
				
			||||
 | 
					                                    <p class="m-0" style="color:#718096;">Got questions or need help? Get in touch.</p> | 
				
			||||
 | 
					                                    <div style="font-weight: 400;"><span><img src="assets/misc/support-email.svg" alt="" | 
				
			||||
 | 
					                                                width="18px" | 
				
			||||
 | 
					                                                style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"> | 
				
			||||
 | 
					                        <div style="padding: 30px;"> | 
				
			||||
 | 
					                            <div class="d-flex align-items-center"> | 
				
			||||
 | 
					                                <img src="assets/misc/whatsapp 1.svg" alt="" width="60px" style="margin-right: 12px;"> | 
				
			||||
 | 
					                                <div> | 
				
			||||
 | 
					                                    <span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span> | 
				
			||||
 | 
					                                    <p class="m-0" style="color:#718096;">Say hi to us on WhatsApp!</p> | 
				
			||||
 | 
					                                    <div style="font-weight: 400; font-size: 16px;"><span><img src="assets/misc/phone.svg" | 
				
			||||
 | 
					                                                alt="" width="14px" | 
				
			||||
 | 
					                                                style="filter: invert(1); margin-right: 0.8rem;"></span>+91 | 
				
			||||
 | 
					                                        99456767686</div> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </section> | 
				
			||||
 | 
					    <!-- Optional JavaScript --> | 
				
			||||
 | 
					    <!-- jQuery first, then Popper.js, then Bootstrap JS --> | 
				
			||||
 | 
					    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> | 
				
			||||
 | 
					    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> | 
				
			||||
 | 
					</body> | 
				
			||||
 | 
					</html> | 
				
			||||
@ -0,0 +1,28 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8" ?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!-- This template generates a list item for a brand in a recursive manner. --> | 
				
			||||
 | 
					 <template id="brands_recursive" name="Category list"> | 
				
			||||
 | 
					        <li class="nav-item mb-1"> | 
				
			||||
 | 
					            <a t-att-href="keep('/shop/brand/' + slug(c), brand=0)" t-attf-class="nav-link #{'active' if c.id==brand.id else ''}"> | 
				
			||||
 | 
					                <span t-field="c.name"/> | 
				
			||||
 | 
					            </a> | 
				
			||||
 | 
					        </li> | 
				
			||||
 | 
					 </template> | 
				
			||||
 | 
					    <!-- This template inherits and extends the 'website_sale.products' template to add a product brand filter. --> | 
				
			||||
 | 
					    <template id="products_attributes" inherit_id="website_sale.products" active="True" name="Product Brand Filter"> | 
				
			||||
 | 
					        <xpath expr="//div[hasclass('products_attributes_filters')]" position="inside"> | 
				
			||||
 | 
					            <div class=" position-relative" id="wsale_products_brands_collapse"> | 
				
			||||
 | 
					                <ul class="nav nav-pills flex-column mb-2"> | 
				
			||||
 | 
					                    <li class="nav-item"> | 
				
			||||
 | 
					                       <a t-att-href="keep('/shop', brand=0)" t-attf-class="nav-link #{'' if brand else 'active'} o_not_editable">All Brands</a> | 
				
			||||
 | 
					                    </li> | 
				
			||||
 | 
					                    <t t-foreach="brands" t-as="c"> | 
				
			||||
 | 
					                        <div class="accordion-item nav-item mb-1"> | 
				
			||||
 | 
					                         <t t-call="product_brand_ecommerce.brands_recursive" /> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </t> | 
				
			||||
 | 
					                </ul> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </xpath> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,14 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8" ?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!-- This XML record customizes the sale.report view search in the website module. --> | 
				
			||||
 | 
					    <record id="sale_report_view_search_website" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">sale.report.view.search.inherit.product.brand.ecommerce</field> | 
				
			||||
 | 
					        <field name="model">sale.report</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="website_sale.sale_report_view_search_website"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//filter[@name='groupby_product']" position="before"> | 
				
			||||
 | 
					                <filter string="Brand" name="groupby_brand" context="{'group_by':'brand_id'}"/> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||