@ -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> | 
				
			|||