@ -0,0 +1,41 @@ | 
				
			|||||
 | 
					Odoo13 Master Search | 
				
			||||
 | 
					==================== | 
				
			||||
 | 
					* Master Search module for Odoo 13 community editions | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Installation | 
				
			||||
 | 
					============ | 
				
			||||
 | 
						- www.odoo.com/documentation/13.0/setup/install.html | 
				
			||||
 | 
						- Install our custom addon | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					License | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					General Public License, Version 3 (LGPL v3). | 
				
			||||
 | 
					(https://www.odoo.com/documentation/user/13.0/legal/licenses/licenses.html) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Company | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Credits | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* Developer: | 
				
			||||
 | 
					(v13) Shahil @ Cybrosys | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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 | 
				
			||||
 | 
					========== | 
				
			||||
 | 
					This module is maintained by Cybrosys Technologies. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Cybrosys Techno Solutions (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 | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					from . import models | 
				
			||||
@ -0,0 +1,44 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Cybrosys Techno Solutions (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 | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					    'name': 'Odoo13 Master Search', | 
				
			||||
 | 
					    'version': '13.0.1.0.0', | 
				
			||||
 | 
					    'summary': """Easy Search in Customers, Products, Sale, Purchase, Inventory and Accounting modules""", | 
				
			||||
 | 
					    'description': """Easy Search in Customers, Products, Sale, Purchase, Inventory and Accounting modules,  | 
				
			||||
 | 
					                      Search, Advance search, master search, odoo14, """, | 
				
			||||
 | 
					    'category': 'Settings', | 
				
			||||
 | 
					    'author': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'company': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'maintainer': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'website': 'https://www.cybrosys.com', | 
				
			||||
 | 
					    'license': 'AGPL-3', | 
				
			||||
 | 
					    'images': ['static/description/banner.jpg'], | 
				
			||||
 | 
					    'depends': ['base', 'stock', 'sale', 'purchase'], | 
				
			||||
 | 
					    'data': [ | 
				
			||||
 | 
					        'security/ir.model.access.csv', | 
				
			||||
 | 
					        'security/security.xml', | 
				
			||||
 | 
					        'views/master_search_view.xml', | 
				
			||||
 | 
					        'views/template.xml', | 
				
			||||
 | 
					    ], | 
				
			||||
 | 
					    'installable': True, | 
				
			||||
 | 
					    'auto_install': False, | 
				
			||||
 | 
					    'application': False, | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,6 @@ | 
				
			|||||
 | 
					## Module <master_search> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#### 25.05.2021 | 
				
			||||
 | 
					#### Version 13.0.1.0.0 | 
				
			||||
 | 
					#### ADD | 
				
			||||
 | 
					Initial Commit | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Cybrosys Techno Solutions (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 | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					from . import master_search | 
				
			||||
@ -0,0 +1,366 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Cybrosys Techno Solutions (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 | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################## | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					from odoo import fields, models, api, _ | 
				
			||||
 | 
					from odoo.exceptions import UserError | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class MasterSearch(models.Model): | 
				
			||||
 | 
					    _name = 'master.search' | 
				
			||||
 | 
					    _description = "Model for master search" | 
				
			||||
 | 
					    _rec_name = 'name' | 
				
			||||
 | 
					    _order = "create_date desc" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    name = fields.Char(string="Name", default=lambda self: _('Search')) | 
				
			||||
 | 
					    res_customers_id = fields.Many2many('res.partner', 'res_customers_search_rel', 'res_customers_id', 'search_id', | 
				
			||||
 | 
					                                        string="Locations") | 
				
			||||
 | 
					    search_string = fields.Char(string="Search") | 
				
			||||
 | 
					    search_mode = fields.Selection([('all', 'All'), ('active', 'Active'), ('inactive', 'Inactive')], | 
				
			||||
 | 
					                                   string="Search Mode", default="active") | 
				
			||||
 | 
					    search_by = fields.Selection( | 
				
			||||
 | 
					        [('any', 'Any'), ('customer', 'Customer'), ('product', 'Product'), ('sale details', 'Sale'), | 
				
			||||
 | 
					         ('purchase details', 'Purchase'), ('transaction details', 'Inventory'), ('account details', 'Accounting')], | 
				
			||||
 | 
					        string="Search By", default='any') | 
				
			||||
 | 
					    master_search_ids = fields.Many2many('master.search', 'master_search_self_rel', 'search_id', | 
				
			||||
 | 
					                                         'search_id1', compute="_get_recent_searches", limit=1) | 
				
			||||
 | 
					    history_count = fields.Integer(string="History Count", compute="_get_history_count") | 
				
			||||
 | 
					    customer_ids = fields.Many2many('res.partner', 'master_search_company_rel', 'search_id', 'company_id') | 
				
			||||
 | 
					    product_ids = fields.Many2many('product.template', 'master_search_product_rel', 'search_id', 'company_id') | 
				
			||||
 | 
					    transaction_details = fields.Many2many('stock.picking', 'master_search_transaction_details_rel', 'search_id', | 
				
			||||
 | 
					                                           'company_id', string="Inventory") | 
				
			||||
 | 
					    customer_count = fields.Integer(string="Company Count", compute="_get_operator_count") | 
				
			||||
 | 
					    product_count = fields.Integer(string="Product Count", compute="_get_product_count") | 
				
			||||
 | 
					    transaction_count = fields.Integer(string="Transaction Count", compute="_get_transaction_count") | 
				
			||||
 | 
					    sale_count = fields.Integer(string="Sale Count", compute="_get_sale_count") | 
				
			||||
 | 
					    purchase_count = fields.Integer(string="Sale Count", compute="_get_purchase_count") | 
				
			||||
 | 
					    account_count = fields.Integer(string="Account Count", compute="_get_account_count") | 
				
			||||
 | 
					    user_id = fields.Many2one('res.users', string="User", default=lambda self: self.env.user) | 
				
			||||
 | 
					    match_entire = fields.Boolean(string="Match entire sentence") | 
				
			||||
 | 
					    sale_details = fields.Many2many('sale.order', 'master_search_sale_details_rel', 'search_id', | 
				
			||||
 | 
					                                    'company_id', string="Sale") | 
				
			||||
 | 
					    purchase_details = fields.Many2many('purchase.order', 'master_search_purchase_details_rel', 'search_id', | 
				
			||||
 | 
					                                        'company_id', string="Sale") | 
				
			||||
 | 
					    account_details = fields.Many2many('account.move', 'master_search_account_details_rel', 'search_id', | 
				
			||||
 | 
					                                       'company_id', string="Account") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('search_string') | 
				
			||||
 | 
					    def _get_recent_searches(self): | 
				
			||||
 | 
					        """ Get recent searches """ | 
				
			||||
 | 
					        # unlink search result with empty string | 
				
			||||
 | 
					        try: | 
				
			||||
 | 
					            current_id = self.id if isinstance(self.id, int) \ | 
				
			||||
 | 
					                else self._origin.id | 
				
			||||
 | 
					        except: | 
				
			||||
 | 
					            current_id = False | 
				
			||||
 | 
					            pass | 
				
			||||
 | 
					        empty_search = self.env['master.search'].search( | 
				
			||||
 | 
					            [('search_string', 'in', ['', False]), | 
				
			||||
 | 
					             ('id', 'not in', [current_id, False] | 
				
			||||
 | 
					             if current_id else [False])]) | 
				
			||||
 | 
					        if empty_search: | 
				
			||||
 | 
					            empty_search.unlink() | 
				
			||||
 | 
					        # get search histories avoid null strings | 
				
			||||
 | 
					        recent_searches = self.env['master.search'].search([ | 
				
			||||
 | 
					            ('search_string', 'not in', ['', False])]) | 
				
			||||
 | 
					        # commended for viewing last search | 
				
			||||
 | 
					        # self.master_search_ids = recent_searches.filtered( | 
				
			||||
 | 
					        #     lambda x: x.id != self.id) if self.id else recent_searches | 
				
			||||
 | 
					        self.master_search_ids = recent_searches | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_unlink_search(self): | 
				
			||||
 | 
					        """ Unlink search """ | 
				
			||||
 | 
					        self.unlink() | 
				
			||||
 | 
					        action = self.env.ref('master_search.master_search_action').read()[0] | 
				
			||||
 | 
					        return action | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('master_search_ids') | 
				
			||||
 | 
					    def _get_history_count(self): | 
				
			||||
 | 
					        """ Get history count """ | 
				
			||||
 | 
					        self.history_count = len(self.master_search_ids) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('product_ids') | 
				
			||||
 | 
					    def _get_product_count(self): | 
				
			||||
 | 
					        """ Get product count """ | 
				
			||||
 | 
					        self.product_count = len(self.product_ids) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('customer_ids') | 
				
			||||
 | 
					    def _get_operator_count(self): | 
				
			||||
 | 
					        """ Get customer count """ | 
				
			||||
 | 
					        self.customer_count = len(self.customer_ids) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('transaction_count') | 
				
			||||
 | 
					    def _get_transaction_count(self): | 
				
			||||
 | 
					        """ Get transaction details count """ | 
				
			||||
 | 
					        self.transaction_count = len(self.transaction_details) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('sale_count') | 
				
			||||
 | 
					    def _get_sale_count(self): | 
				
			||||
 | 
					        """ Get sale details count """ | 
				
			||||
 | 
					        self.sale_count = len(self.sale_details) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('purchase_count') | 
				
			||||
 | 
					    def _get_purchase_count(self): | 
				
			||||
 | 
					        """ Get purchase details count """ | 
				
			||||
 | 
					        self.purchase_count = len(self.purchase_details) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('account_count') | 
				
			||||
 | 
					    def _get_account_count(self): | 
				
			||||
 | 
					        """ Get account details count """ | 
				
			||||
 | 
					        self.account_count = len(self.account_details) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_clear_search(self): | 
				
			||||
 | 
					        """ clear search input """ | 
				
			||||
 | 
					        self.search_string = "" | 
				
			||||
 | 
					        self.name = "Search" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.model_create_multi | 
				
			||||
 | 
					    def create(self, vals_list): | 
				
			||||
 | 
					        """ Function for unlink first result and raise error if no string """ | 
				
			||||
 | 
					        res = super(MasterSearch, self).create(vals_list) | 
				
			||||
 | 
					        search_index = self.env['master.search'].search_count([('user_id', '=', self.env.user.id)]) | 
				
			||||
 | 
					        # unlink old search result if count greater than 10 | 
				
			||||
 | 
					        if search_index > 10: | 
				
			||||
 | 
					            last_search = self.env['master.search'].search([('id', '!=', res.id), ('user_id', '=', self.env.user.id)], | 
				
			||||
 | 
					                                                           order="create_date asc", limit=1) | 
				
			||||
 | 
					            last_search.unlink() if last_search else False | 
				
			||||
 | 
					        return res | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_search(self): | 
				
			||||
 | 
					        """ search for the string and store search data """ | 
				
			||||
 | 
					        if self.search_string and "*" in self.search_string: | 
				
			||||
 | 
					            return | 
				
			||||
 | 
					        if not self.search_string: | 
				
			||||
 | 
					            raise UserError(_("Please provide a search string!")) | 
				
			||||
 | 
					        search_keys = self.search_string.split(" ") | 
				
			||||
 | 
					        # delete all the lines | 
				
			||||
 | 
					        self.customer_ids = self.product_ids = self.transaction_details = False | 
				
			||||
 | 
					        # search for entire sentence | 
				
			||||
 | 
					        if self.match_entire: | 
				
			||||
 | 
					            return self._search_query(self.search_string) | 
				
			||||
 | 
					        # search for all the words | 
				
			||||
 | 
					        for key in search_keys: | 
				
			||||
 | 
					            self._search_query(key) | 
				
			||||
 | 
					        self.name = self.search_string | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_query(self, key): | 
				
			||||
 | 
					        """ search for the model with given key and update result """ | 
				
			||||
 | 
					        company_id = self.env.user.company_id.id | 
				
			||||
 | 
					        if self.search_mode == 'all': | 
				
			||||
 | 
					            active_qry = """  | 
				
			||||
 | 
					            and obj.active in ({},{}) | 
				
			||||
 | 
					            """.format("'FALSE'", "'TRUE'") | 
				
			||||
 | 
					        elif self.search_mode == 'active': | 
				
			||||
 | 
					            active_qry = """ and obj.active in ({})""".format("'TRUE'") | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            active_qry = """ and obj.active in ({})""".format("'FALSE'") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        #  search for customers | 
				
			||||
 | 
					        self._search_customer(key, active_qry) \ | 
				
			||||
 | 
					            if self.search_by in ['any', 'customer'] else False | 
				
			||||
 | 
					        # search for products | 
				
			||||
 | 
					        self._search_products(key, active_qry, company_id) \ | 
				
			||||
 | 
					            if self.search_by in ['any', 'product'] else False | 
				
			||||
 | 
					        # search for inventory transactions | 
				
			||||
 | 
					        self._search_inventory_transactions(key, active_qry, company_id) \ | 
				
			||||
 | 
					            if self.search_by in ['any', 'transaction details'] else False | 
				
			||||
 | 
					        # search for inventory transactions | 
				
			||||
 | 
					        self._search_sale_transactions(key, active_qry, company_id) \ | 
				
			||||
 | 
					            if self.search_by in ['any', 'sale details'] else False | 
				
			||||
 | 
					        # search for purchase transactions | 
				
			||||
 | 
					        self._search_purchase_transactions(key, active_qry, company_id) \ | 
				
			||||
 | 
					            if self.search_by in ['any', 'purchase details'] else False | 
				
			||||
 | 
					        # search for account transactions | 
				
			||||
 | 
					        self._search_account_transactions(key, active_qry, company_id) \ | 
				
			||||
 | 
					            if self.search_by in ['any', 'account details'] else False | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_account_transactions(self, key, active_qry, company_id): | 
				
			||||
 | 
					        """ Search for all account transactions """ | 
				
			||||
 | 
					        sp_query = """ | 
				
			||||
 | 
					        SELECT  | 
				
			||||
 | 
					            am.id from account_move am | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            res_partner p on p.id = am.partner_id | 
				
			||||
 | 
					        WHERE  | 
				
			||||
 | 
					            am.company_id = {op_id} | 
				
			||||
 | 
					                AND  | 
				
			||||
 | 
					                 (am.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 p.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 am.state ILIKE '%{key}%') | 
				
			||||
 | 
					        GROUP BY  | 
				
			||||
 | 
					            am.id,p.name | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | 
				
			||||
 | 
					        moves = self._cr.dictfetchall() | 
				
			||||
 | 
					        move_ids = self.env['account.move'].browse([i['id'] for i in moves]) | 
				
			||||
 | 
					        self.account_details += move_ids | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_purchase_transactions(self, key, active_qry, company_id): | 
				
			||||
 | 
					        """ Search for all purchase transactions """ | 
				
			||||
 | 
					        sp_query = """ | 
				
			||||
 | 
					        SELECT  | 
				
			||||
 | 
					            po.id from purchase_order po | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            res_partner p on p.id = po.partner_id | 
				
			||||
 | 
					        WHERE  | 
				
			||||
 | 
					            po.company_id = {op_id} | 
				
			||||
 | 
					                AND  | 
				
			||||
 | 
					                 (po.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 p.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 po.state ILIKE '%{key}%') | 
				
			||||
 | 
					        GROUP BY  | 
				
			||||
 | 
					            po.id,p.name | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | 
				
			||||
 | 
					        purchases = self._cr.dictfetchall() | 
				
			||||
 | 
					        purchase_ids = self.env['purchase.order'].browse([i['id'] for i in purchases]) | 
				
			||||
 | 
					        self.purchase_details += purchase_ids | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_sale_transactions(self, key, active_qry, company_id): | 
				
			||||
 | 
					        """ Search for all sale transactions """ | 
				
			||||
 | 
					        sp_query = """ | 
				
			||||
 | 
					        SELECT  | 
				
			||||
 | 
					            sl.id from sale_order sl | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            res_partner p on p.id = sl.partner_id | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            product_pricelist pl | 
				
			||||
 | 
					                ON  | 
				
			||||
 | 
					                 pl.id = sl.pricelist_id | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            account_payment_term pt | 
				
			||||
 | 
					                ON  | 
				
			||||
 | 
					                 pt.id = sl.payment_term_id | 
				
			||||
 | 
					        WHERE  | 
				
			||||
 | 
					            sl.company_id = {op_id} | 
				
			||||
 | 
					                AND  | 
				
			||||
 | 
					                 (sl.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 p.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 sl.state ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 pl.name ILIKE '%{key}%') | 
				
			||||
 | 
					        GROUP BY  | 
				
			||||
 | 
					            sl.id,p.name,pl.name,pt.name | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | 
				
			||||
 | 
					        sales = self._cr.dictfetchall() | 
				
			||||
 | 
					        sale_ids = self.env['sale.order'].browse([i['id'] for i in sales]) | 
				
			||||
 | 
					        self.sale_details += sale_ids | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_inventory_transactions(self, key, active_qry, company_id): | 
				
			||||
 | 
					        """ Search for all inventory transactions """ | 
				
			||||
 | 
					        sp_query = """ | 
				
			||||
 | 
					        SELECT  | 
				
			||||
 | 
					            sp.id from stock_picking sp | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            res_partner p on p.id = sp.partner_id | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            stock_picking_type t  | 
				
			||||
 | 
					                ON  | 
				
			||||
 | 
					                 t.id = sp.picking_type_id | 
				
			||||
 | 
					        WHERE  | 
				
			||||
 | 
					            sp.company_id = {op_id} | 
				
			||||
 | 
					                AND  | 
				
			||||
 | 
					                 (sp.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 p.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 sp.state ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 t.name ILIKE '%{key}%') | 
				
			||||
 | 
					        GROUP BY  | 
				
			||||
 | 
					            sp.id,p.name,t.name | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        self._cr.execute(sp_query.format(op_id=company_id, key=key, active=active_qry)) | 
				
			||||
 | 
					        transactions = self._cr.dictfetchall() | 
				
			||||
 | 
					        transaction_ids = self.env['stock.picking'].browse([i['id'] for i in transactions]) | 
				
			||||
 | 
					        self.transaction_details += transaction_ids | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_products(self, key, active_qry, company_id): | 
				
			||||
 | 
					        """ search for products """ | 
				
			||||
 | 
					        pt_query = """ | 
				
			||||
 | 
					        SELECT  | 
				
			||||
 | 
					            pt.id  | 
				
			||||
 | 
					        FROM  | 
				
			||||
 | 
					            product_template pt | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            product_category pc  | 
				
			||||
 | 
					                ON  | 
				
			||||
 | 
					                 pc.id = pt.categ_id | 
				
			||||
 | 
					        WHERE  | 
				
			||||
 | 
					            (pt.name ILIKE '%{key}%' | 
				
			||||
 | 
					            OR  | 
				
			||||
 | 
					             pt.default_code ILIKE '%{key}%' | 
				
			||||
 | 
					            OR  | 
				
			||||
 | 
					             pt.type ILIKE '%{key}%' | 
				
			||||
 | 
					            OR  | 
				
			||||
 | 
					             pt.description ILIKE '%{key}%' | 
				
			||||
 | 
					            OR  | 
				
			||||
 | 
					             pc.name ILIKE '%{key}%') | 
				
			||||
 | 
					    """ | 
				
			||||
 | 
					        self._cr.execute(pt_query.format(op_id=company_id, key=key, active=active_qry).replace('obj', 'pt')) | 
				
			||||
 | 
					        template_ids = self._cr.dictfetchall() | 
				
			||||
 | 
					        product_template_ids = self.env['product.template'].browse([i['id'] for i in template_ids]) | 
				
			||||
 | 
					        self.product_ids += product_template_ids | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _search_customer(self, key, active_qry): | 
				
			||||
 | 
					        """ search for customer """ | 
				
			||||
 | 
					        query = """  | 
				
			||||
 | 
					        SELECT  | 
				
			||||
 | 
					            r.id from res_partner r  | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            res_country_state rs  | 
				
			||||
 | 
					                ON  | 
				
			||||
 | 
					                 rs.id = r.state_id | 
				
			||||
 | 
					        LEFT JOIN  | 
				
			||||
 | 
					            res_country rc  | 
				
			||||
 | 
					                ON  | 
				
			||||
 | 
					                 rc.id = r.country_id | 
				
			||||
 | 
					        WHERE  | 
				
			||||
 | 
					            (r.parent_id is NULL )  | 
				
			||||
 | 
					                AND  | 
				
			||||
 | 
					                 r.type = 'contact' {active} | 
				
			||||
 | 
					                AND  | 
				
			||||
 | 
					                 (r.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 r.street ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 r.street2 ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 r.city ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 r.zip ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 rs.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 rc.name ILIKE '%{key}%' | 
				
			||||
 | 
					                OR  | 
				
			||||
 | 
					                 r.email ILIKE '%{key}%') | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        self._cr.execute(query.format(key=key, active=active_qry).replace('obj', 'r')) | 
				
			||||
 | 
					        customers = self._cr.dictfetchall() | 
				
			||||
 | 
					        customer_ids = self.env['res.partner'].browse([i['id'] for i in customers]) | 
				
			||||
 | 
					        self.customer_ids += customer_ids | 
				
			||||
		
		
			
  | 
@ -0,0 +1,20 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!--   Record rule for search history   --> | 
				
			||||
 | 
					    <record model="ir.rule" id="company_search_rule"> | 
				
			||||
 | 
					        <field name="name">Company Search Rule</field> | 
				
			||||
 | 
					        <field name="model_id" ref="model_master_search"/> | 
				
			||||
 | 
					        <field name="domain_force">[('user_id', '=', user.id)]</field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <!--    Record rules for restrict search access    --> | 
				
			||||
 | 
					    <record model="ir.module.category" id="module_master_search"> | 
				
			||||
 | 
					        <field name="name">Search Rights</field> | 
				
			||||
 | 
					        <field name="sequence">11</field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <record id="master_search_read" model="res.groups"> | 
				
			||||
 | 
					        <field name="name">Master Search</field> | 
				
			||||
 | 
					        <field name="comment">Master Search Group</field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
| 
		 After Width: | Height: | Size: 236 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: 404 B  | 
| 
		 After Width: | Height: | Size: 492 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 911 B  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 673 B  | 
| 
		 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: 85 KiB  | 
| 
		 After Width: | Height: | Size: 180 KiB  | 
| 
		 After Width: | Height: | Size: 184 KiB  | 
| 
		 After Width: | Height: | Size: 113 KiB  | 
| 
		 After Width: | Height: | Size: 87 KiB  | 
| 
		 After Width: | Height: | Size: 113 KiB  | 
| 
		 After Width: | Height: | Size: 69 KiB  | 
| 
		 After Width: | Height: | Size: 59 KiB  | 
| 
		 After Width: | Height: | Size: 43 KiB  | 
| 
		 After Width: | Height: | Size: 82 KiB  | 
| 
		 After Width: | Height: | Size: 75 KiB  | 
| 
		 After Width: | Height: | Size: 66 KiB  | 
| 
		 After Width: | Height: | Size: 45 KiB  | 
| 
		 After Width: | Height: | Size: 88 KiB  | 
| 
		 After Width: | Height: | Size: 72 KiB  | 
| 
		 After Width: | Height: | Size: 54 KiB  | 
| 
		 After Width: | Height: | Size: 65 KiB  | 
| 
		 After Width: | Height: | Size: 178 KiB  | 
| 
		 After Width: | Height: | Size: 20 KiB  | 
@ -0,0 +1,634 @@ | 
				
			|||||
 | 
					<!--- HERO CONTAINER  --> | 
				
			||||
 | 
					 <section class="container" style="padding: 6rem 1.5rem;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-6 d-flex flex-column justify-content-center"> | 
				
			||||
 | 
					      <h1 | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 3rem !important;"> | 
				
			||||
 | 
					        Master Search | 
				
			||||
 | 
					      </h1> | 
				
			||||
 | 
					      <h4 class="mt-3" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.5rem !important;"> | 
				
			||||
 | 
					        Easy Search in Customers, Products, Sale, Purchase, Inventory and Accounting modules</h4> | 
				
			||||
 | 
					      <h5 class="mt-4" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important;"> | 
				
			||||
 | 
					        Key Features</h5> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <span class="d-flex align-items-center" style="margin: -0.5rem 0rem 0rem -0.4rem !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/chevron.png" height="18" width="18" class="img-responsive mr-1"> | 
				
			||||
 | 
					        <p class="mt-3" style="font-family: Montserrat, 'sans-serif'; font-weight: 500;">Dynamic Search View Option</p> | 
				
			||||
 | 
					      </span> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <span class="d-flex align-items-center" style="margin: -1rem 0rem 0rem -0.4rem !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/chevron.png" height="18" width="18" class="img-responsive mr-1"> | 
				
			||||
 | 
					        <p class="mt-3" style="font-family: Montserrat, 'sans-serif'; font-weight: 500;">Easily Search Records in Customers, Products, Sale, Purchase, Inventory and Accounting Data </p> | 
				
			||||
 | 
					      </span> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <span class="d-flex align-items-center" style="margin: -1rem 0rem 0rem -0.4rem !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/chevron.png" height="18" width="18" class="img-responsive mr-1"> | 
				
			||||
 | 
					        <p class="mt-3" style="font-family: Montserrat, 'sans-serif'; font-weight: 500;">Possible to search with | 
				
			||||
 | 
					          different attributes like name, reference, number, etc. | 
				
			||||
 | 
					        </p> | 
				
			||||
 | 
					      </span> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-lg-6 d-flex flex-column justify-content-center"> | 
				
			||||
 | 
					      <img src="./assets/hero.png" class="img-responsive"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!--- END OF HERO CONTAINER  --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!--- OVERVIEW CONTAINER  --> | 
				
			||||
 | 
					<section class="container" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | 
				
			||||
 | 
					      <h2 class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | 
				
			||||
 | 
					        Overview</h2> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12 mt-3"> | 
				
			||||
 | 
					      <p class="mt-3 text-center" style="font-family: Montserrat, 'sans-serif'; font-weight: 500; font-size: 1rem;"> | 
				
			||||
 | 
					        Master Search module enables advance and simple search in different modules. It helps users to search the records | 
				
			||||
 | 
					        in Customers, Products, Sale, Purchase, Inventory and Accounting Modules for | 
				
			||||
 | 
					        'Master Search' group users. Possible to search using different attributes like name, reference, number, etc. | 
				
			||||
 | 
					      </p> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!--- END OF OVERVIEW CONTAINER  --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!--- FEATURES CONTAINER  --> | 
				
			||||
 | 
					 <section class="container" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-6"> | 
				
			||||
 | 
					      <div class="d-flex flex-column justify-column-center align-items-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | 
				
			||||
 | 
					        <h4 class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | 
				
			||||
 | 
					          Dynamic Search View Option</h4> | 
				
			||||
 | 
					        <p class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | 
				
			||||
 | 
					          Separate View for Search bar and also to show the search results</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-lg-6"> | 
				
			||||
 | 
					      <div class="d-flex flex-column justify-column-center align-items-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | 
				
			||||
 | 
					        <h4 class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | 
				
			||||
 | 
					          Easily Search Records in Different Modules</h4> | 
				
			||||
 | 
					        <p class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | 
				
			||||
 | 
					          Easily Search Records in Customers, Products, Sale, Purchase, Inventory and Accounting Module </p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  <div class="row" style="margin-top: 2rem !important"> | 
				
			||||
 | 
					    <div class="col-lg-6"> | 
				
			||||
 | 
					      <div class="d-flex flex-column justify-column-center align-items-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | 
				
			||||
 | 
					        <h4 class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | 
				
			||||
 | 
					          Option to Search with different attributes</h4> | 
				
			||||
 | 
					        <p class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | 
				
			||||
 | 
					          Possible to search with | 
				
			||||
 | 
					          different attributes like name, reference, customer name, number, etc. </p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-lg-6"> | 
				
			||||
 | 
					      <div class="d-flex flex-column justify-column-center align-items-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; padding: 2rem !important; border-radius: 10px !important; height: 100% !important;"> | 
				
			||||
 | 
					        <h4 class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 1.2rem !important; width: 80%;"> | 
				
			||||
 | 
					          Recent Search Results</h4> | 
				
			||||
 | 
					        <p class="text-center" | 
				
			||||
 | 
					          style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1rem !important; margin-bottom: 0 !important;"> | 
				
			||||
 | 
					          Possible to access the Recent Search History </p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!--- END OF FEATURES CONTAINER  --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- SCREENSHOTS SECTION --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<section class="container" style="padding: 4rem 1.5rem 0rem;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | 
				
			||||
 | 
					      <h2 class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | 
				
			||||
 | 
					        Screenshots</h2> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12 my-3" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex mb-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important; "> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.5rem; color: #fff !important;">1</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Master Search User Access</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/1-Master-Search-User-Access.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">2</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Master Search</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/2-Master-Search-main-screenshot.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">3</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search in Customer Data</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/A1-Search-in-Customer-data.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">4</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Customer Search Record View</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/A2-Customer-Search-record-view.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">5</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search in Inventory Data</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/B1-Search-in-Inventory-Data.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">6</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search in Inventory Data</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/B1-Search-in-Inventory-Data.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">7</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search Record View</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/B2-Inventory-Search-record-view.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">8</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Accounting Search Record View</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/C2-Accounting-Search-record-view.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">9</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search in Product Data</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/Search-in-Product-data.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #ffffff !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">10</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search in Purchase Data</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/Search-in-Purchase-data.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="background-color: #f6f6f6 !important; padding: 4rem 3rem;"> | 
				
			||||
 | 
					      <div class="d-flex my-3"> | 
				
			||||
 | 
					        <div class="d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					          style="background-color: #3498DB !important; border: 4px solid #d6eaf8 !important; box-shadow: 0px 0px 0px 4px #ebf5fb !important; color: #fff !important; height: 35px; width: 35px; border-radius: 50% !important; font-size: 1.1rem !important;"> | 
				
			||||
 | 
					          <h6 style="margin-top: 0.6rem; color: #fff !important;">11</h6> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <h6 class="mt-2 ml-2">Search in Sale Data</h6> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <img src="assets/screenshots/Search-in-Sale-data.png" width="100%" class="img-resposive" | 
				
			||||
 | 
					        style="border-radius: 10px !important;"> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!-- END OF SCREENSHOTS SECTION --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- SUGGESTED PRODUCTS--> | 
				
			||||
 | 
					<section class="container" style="margin-top: 6rem !important;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | 
				
			||||
 | 
					      <h2 class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | 
				
			||||
 | 
					        Suggested Products</h2> | 
				
			||||
 | 
					      <p class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | 
				
			||||
 | 
					        Check out our other products</p> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-lg-12 my-4"> | 
				
			||||
 | 
					      <div id="suggestedSlider" class="row carousel slide" data-ride="carousel"> | 
				
			||||
 | 
					        <!-- The slideshow --> | 
				
			||||
 | 
					        <div class="carousel-inner"> | 
				
			||||
 | 
					          <div class="carousel-item" style="min-height: 191px;"> | 
				
			||||
 | 
					            <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | 
				
			||||
 | 
					              <a href="https://apps.odoo.com/apps/modules/14.0/dynamic_accounts_report/" target="_blank"> | 
				
			||||
 | 
					                <div style="border-radius:10px"> | 
				
			||||
 | 
					                  <img class="img img-responsive center-block" | 
				
			||||
 | 
					                    style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                    src="./assets/modules/dynamic_financial_report.jpg"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					              </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | 
				
			||||
 | 
					              <a href="https://apps.odoo.com/apps/modules/14.0/dashboard_pos/" target="_blank"> | 
				
			||||
 | 
					                <div style="border-radius:10px"> | 
				
			||||
 | 
					                  <img class="img img-responsive center-block" | 
				
			||||
 | 
					                    style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                    src="./assets/modules/pos_dashboard.png"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					              </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | 
				
			||||
 | 
					              <a href="https://apps.odoo.com/apps/modules/14.0/sale_discount_total/" target="_blank"> | 
				
			||||
 | 
					                <div style="border-radius:10px"> | 
				
			||||
 | 
					                  <img class="img img-responsive center-block" | 
				
			||||
 | 
					                    style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                    src="./assets/modules/discount.png"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					              </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					          </div> | 
				
			||||
 | 
					          <div class="carousel-item active" style="min-height: 191px;"> | 
				
			||||
 | 
					            <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | 
				
			||||
 | 
					              <a href="https://apps.odoo.com/apps/modules/14.0/hr_payroll_account_community/" target="_blank"> | 
				
			||||
 | 
					                <div style="border-radius:10px"> | 
				
			||||
 | 
					                  <img class="img img-responsive center-block" | 
				
			||||
 | 
					                    style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                    src="./assets/modules/payroll_accounting.png"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					              </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | 
				
			||||
 | 
					              <a href="https://apps.odoo.com/apps/modules/14.0/invoice_format_editor/" target="_blank"> | 
				
			||||
 | 
					                <div style="border-radius:10px"> | 
				
			||||
 | 
					                  <img class="img img-responsive center-block" | 
				
			||||
 | 
					                    style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                    src="./assets/modules/invoice.jpg"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					              </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | 
				
			||||
 | 
					              <a href="https://apps.odoo.com/apps/modules/14.0/shopify_odoo_connector/" target="_blank"> | 
				
			||||
 | 
					                <div style="border-radius:10px"> | 
				
			||||
 | 
					                  <img class="img img-responsive center-block" | 
				
			||||
 | 
					                    style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                    src="./assets/modules/shopify.png"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					              </a> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					          </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <!-- Left and right controls --> | 
				
			||||
 | 
					        <a class="carousel-control-prev" href="#suggestedSlider" 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="#suggestedSlider" 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> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!-- END OF SUGGESTED PRODUCTS --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- OUR SERVICES --> | 
				
			||||
 | 
					<section class="container" style="margin-top: 6rem !important;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | 
				
			||||
 | 
					      <h2 class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | 
				
			||||
 | 
					        Our Services</h2> | 
				
			||||
 | 
					      <p class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | 
				
			||||
 | 
					        We provide following services</p> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Customization</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Implementation</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Support</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Hire | 
				
			||||
 | 
					        Odoo | 
				
			||||
 | 
					        Developer</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #54a0ff  !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Integration</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Migration</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Consultancy</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Implementation</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | 
				
			||||
 | 
					      <div class="d-flex justify-content-center align-items-center mx-3 my-3" | 
				
			||||
 | 
					        style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | 
				
			||||
 | 
					        <img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px"> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					      <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo | 
				
			||||
 | 
					        Licensing Consultancy</h6> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!-- END OF END OF OUR SERVICES --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- OUR INDUSTRIES --> | 
				
			||||
 | 
					<section class="container" style="margin-top: 6rem !important;"> | 
				
			||||
 | 
					  <div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | 
				
			||||
 | 
					      <h2 class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | 
				
			||||
 | 
					        Our Industries</h2> | 
				
			||||
 | 
					      <p class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | 
				
			||||
 | 
					        Our Industry Specifics And Process Segments To Solve Your Complex Business Barriers.</p> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          Trading | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">Easily procure | 
				
			||||
 | 
					          and | 
				
			||||
 | 
					          sell your products</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          POS | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">Easy | 
				
			||||
 | 
					          configuration | 
				
			||||
 | 
					          and convivial experience</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          Education | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">A platform for | 
				
			||||
 | 
					          educational management</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          Manufacturing | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">Plan, track and | 
				
			||||
 | 
					          schedule your operations</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          E-commerce & Website | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">Mobile | 
				
			||||
 | 
					          friendly, | 
				
			||||
 | 
					          awe-inspiring product pages</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          Service Management | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">Keep track of | 
				
			||||
 | 
					          services and invoice</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          Restaurant | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">Run your bar or | 
				
			||||
 | 
					          restaurant methodically</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-3"> | 
				
			||||
 | 
					      <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					        style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | 
				
			||||
 | 
					        <img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> | 
				
			||||
 | 
					        <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | 
				
			||||
 | 
					          Hotel Management | 
				
			||||
 | 
					        </h5> | 
				
			||||
 | 
					        <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">An | 
				
			||||
 | 
					          all-inclusive | 
				
			||||
 | 
					          hotel management application</p> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- END OF END OF OUR INDUSTRIES --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- FOOTER --> | 
				
			||||
 | 
					<!-- Footer Section --> | 
				
			||||
 | 
					<section class="container" style="margin: 5rem auto 2rem;"> | 
				
			||||
 | 
					  <div class="row" style="max-width:1540px;"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | 
				
			||||
 | 
					      <h2 class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;"> | 
				
			||||
 | 
					        Need Help?</h2> | 
				
			||||
 | 
					      <p class="text-center" | 
				
			||||
 | 
					        style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;"> | 
				
			||||
 | 
					        Do you have any queries regarding our products & services? Let us know.</p> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  <!-- Contact Cards --> | 
				
			||||
 | 
					  <div class="row d-flex justify-content-center align-items-center" | 
				
			||||
 | 
					    style="max-width:1540px; margin: 0 auto 2rem auto;"> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; "> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <div class="row mt-4"> | 
				
			||||
 | 
					        <div class="col-lg-4"> | 
				
			||||
 | 
					          <a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover" | 
				
			||||
 | 
					            style="text-decoration: none;  background-color: #4d4d4d; color: #FFF;  border-radius: 4px;"><i | 
				
			||||
 | 
					              class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-4"> | 
				
			||||
 | 
					          <a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank" | 
				
			||||
 | 
					            class="btn btn-block mb-2 deep_hover" | 
				
			||||
 | 
					            style="text-decoration: none;  background-color: #25D366; color: #FFF;  border-radius: 4px;"><i | 
				
			||||
 | 
					              class="fa fa-whatsapp mr-2"></i>WhatsApp</a> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-lg-4"> | 
				
			||||
 | 
					          <a href="mailto:info@cybrosys.com" target="_blank" class="btn btn-block deep_hover" | 
				
			||||
 | 
					            style="text-decoration: none; background-color: #4d4d4d; color: #FFF;  border-radius: 4px;"><i | 
				
			||||
 | 
					              class="fa fa-envelope mr-2"></i>info@cybrosys.com</a> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					  <!-- End of Contact Cards --> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!-- Footer --> | 
				
			||||
 | 
					<section class="oe_container" style="padding: 2rem 3rem 1rem;"> | 
				
			||||
 | 
					  <div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; "> | 
				
			||||
 | 
					    <!-- Logo --> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;"> | 
				
			||||
 | 
					      <img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" /> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <!-- End of Logo --> | 
				
			||||
 | 
					    <div class="col-lg-12"> | 
				
			||||
 | 
					      <hr | 
				
			||||
 | 
					        style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;"> | 
				
			||||
 | 
					      <!-- End of Footer Section --> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</section> | 
				
			||||
 | 
					<!-- END OF FOOTER --> | 
				
			||||
@ -0,0 +1,143 @@ | 
				
			|||||
 | 
					odoo.define('master_search.FormRenderer', function(require) { | 
				
			||||
 | 
					"use strict"; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    var FormRenderer = require('web.FormRenderer'); | 
				
			||||
 | 
					    var framework = require('web.framework'); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    FormRenderer.include({ | 
				
			||||
 | 
					        events: _.extend({}, FormRenderer.prototype.events, { | 
				
			||||
 | 
					            'click .oe_search_tab': '_onSearchTabClick', | 
				
			||||
 | 
					            'click .oe_search_btn': '_onSearchButtonClick', | 
				
			||||
 | 
					            'keyup .search_input': '_onKeypressSearch', | 
				
			||||
 | 
					            'click .re_search': '_onHistoryClick', | 
				
			||||
 | 
					        }), | 
				
			||||
 | 
					        // Research on history click
 | 
				
			||||
 | 
					        _onHistoryClick: function(ev){ | 
				
			||||
 | 
					            var history_key = ev.currentTarget.parentElement.firstChild.innerText; | 
				
			||||
 | 
					            var edit_flag = $(".search_input").hasClass('o_input') | 
				
			||||
 | 
					            // search if in edit mode
 | 
				
			||||
 | 
					            if (edit_flag){ | 
				
			||||
 | 
					                $(".search_input").val(history_key) | 
				
			||||
 | 
					                                    .trigger('change'); | 
				
			||||
 | 
					                $('.oe_search_btn').trigger('click'); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            else{ | 
				
			||||
 | 
					                // trigger edit mode if search screen
 | 
				
			||||
 | 
					                $('.o_form_button_edit').trigger('click'); | 
				
			||||
 | 
					                //var search_input = $(".search_input").length
 | 
				
			||||
 | 
					                //if (search_input <= 0 ){$('.o_form_button_edit').trigger('click');}
 | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        }, | 
				
			||||
 | 
					        // Trigger search while enter is pressed and process input
 | 
				
			||||
 | 
					        _onKeypressSearch: function(ev){ | 
				
			||||
 | 
					            var search_string = $(".search_input").val(); | 
				
			||||
 | 
					            if(search_string.includes("*") == true){ | 
				
			||||
 | 
					                $(".not-allowed").css("display", 'block'); | 
				
			||||
 | 
					                // remove * from the input
 | 
				
			||||
 | 
					                $(".search_input") | 
				
			||||
 | 
					                                .val(search_string.replace('*', '')) | 
				
			||||
 | 
					                                .trigger('change'); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            else{$(".not-allowed").css("display", 'none');} | 
				
			||||
 | 
					            if (ev.which == 13){$('.oe_search_btn').trigger('click');} | 
				
			||||
 | 
					        }, | 
				
			||||
 | 
					         // block UI while searching
 | 
				
			||||
 | 
					        _onSearchButtonClick: function(ev){ | 
				
			||||
 | 
					            if( $(".search_input").val() != ''){framework.blockUI();} | 
				
			||||
 | 
					        }, | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        // collapse and expand tabs
 | 
				
			||||
 | 
					        _onSearchTabClick: function(ev){ | 
				
			||||
 | 
					            var targetDiv = ev.currentTarget.parentElement.children[1] | 
				
			||||
 | 
					            var targetIcon = ev.currentTarget.getElementsByClassName('fa')[0] | 
				
			||||
 | 
					            if (targetDiv){ | 
				
			||||
 | 
					                if(targetDiv.style.display == "block") { | 
				
			||||
 | 
					                    console.log(targetDiv.style.display, "ddddddd") | 
				
			||||
 | 
					                    targetDiv.style.display = "none"; | 
				
			||||
 | 
					                    targetIcon.className = "fa fa-caret-down" | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                else { | 
				
			||||
 | 
					                    console.log(targetDiv.style.display, "sssssss") | 
				
			||||
 | 
					                    targetDiv.style.display = "block"; | 
				
			||||
 | 
					                    targetIcon.className = "fa fa-caret-up" | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        }, | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        // override existing form renderer function
 | 
				
			||||
 | 
					        _renderView: function () { | 
				
			||||
 | 
					            var self = this; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            // render the form and evaluate the modifiers
 | 
				
			||||
 | 
					            var defs = []; | 
				
			||||
 | 
					            var colour_list = [] | 
				
			||||
 | 
					            this.defs = defs; | 
				
			||||
 | 
					            this.inactiveNotebooks = []; | 
				
			||||
 | 
					            var $form = this._renderNode(this.arch).addClass(this.className); | 
				
			||||
 | 
					            delete this.defs; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            return Promise.all(defs).then(function () { | 
				
			||||
 | 
					                self._updateView($form.contents()); | 
				
			||||
 | 
					                if (self.state.res_id in self.alertFields) { | 
				
			||||
 | 
					                    self.displayTranslationAlert(); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                self.trigger_up('edit_mode'); | 
				
			||||
 | 
					            }).then(function(){ | 
				
			||||
 | 
					                if (self.lastActivatedFieldIndex >= 0) { | 
				
			||||
 | 
					                    self._activateNextFieldWidget(self.state, self.lastActivatedFieldIndex); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                if (self._isInDom) { | 
				
			||||
 | 
					                    _.forEach(self.allFieldWidgets, function (widgets){ | 
				
			||||
 | 
					                        _.invoke(widgets, 'on_attach_callback'); | 
				
			||||
 | 
					                    }); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                // function for getting random light colors
 | 
				
			||||
 | 
					                function getRandomColor() { | 
				
			||||
 | 
					                    var color = "hsl(" + Math.random() * 360 + ", 100%, 75%)"; | 
				
			||||
 | 
					                    // avoid colour repetition
 | 
				
			||||
 | 
					                    if(colour_list.indexOf(color) > -1){color = getRandomColor()} | 
				
			||||
 | 
					                    colour_list.push(color); | 
				
			||||
 | 
					                    return color; | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                // function for expanding tabs with result count
 | 
				
			||||
 | 
					                function onSearchButtonClick(ev){ | 
				
			||||
 | 
					                    $('.oe_search_tab').each(function(i, obj) { | 
				
			||||
 | 
					                        var result_count = parseInt(obj.getElementsByClassName('oe_tab_count')[0].innerHTML) | 
				
			||||
 | 
					                        if (result_count > 0){ | 
				
			||||
 | 
					                            obj.click() | 
				
			||||
 | 
					                        } | 
				
			||||
 | 
					                    }); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                // Highlight all the words in result with different color
 | 
				
			||||
 | 
					                var text = $(".search_input").val(); | 
				
			||||
 | 
					                if (text){ | 
				
			||||
 | 
					                    var keyword_list = [] | 
				
			||||
 | 
					                    var key_list = text.split(" ") | 
				
			||||
 | 
					                    for (var i = 0; i< key_list.length; i++) { | 
				
			||||
 | 
					                        keyword_list[i] = {'key': key_list[i], 'color':getRandomColor()} | 
				
			||||
 | 
					                    } | 
				
			||||
 | 
					                    for (var i = 0; i< keyword_list.length; i++) { | 
				
			||||
 | 
					                        var key = keyword_list[i].key; | 
				
			||||
 | 
					                        var color = keyword_list[i].color | 
				
			||||
 | 
					                        var regex = new RegExp("("+key+")", "ig"); | 
				
			||||
 | 
					                        $('.o_data_cell').each(function(i, obj) { | 
				
			||||
 | 
					                            var old_text = obj.innerHTML | 
				
			||||
 | 
					                            if (!obj.firstChild || obj.firstChild.type != 'button'){ | 
				
			||||
 | 
					                                obj.innerHTML = old_text.replace(regex, "<span style='background-color: "+ color +";'>$1</span>"); | 
				
			||||
 | 
					                            } | 
				
			||||
 | 
					                        }); | 
				
			||||
 | 
					                    } | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                // trigger search button click for expand tab with value
 | 
				
			||||
 | 
					                if((self.$el.find(".search_input")).length > 0){onSearchButtonClick()} | 
				
			||||
 | 
					                // unblock UI
 | 
				
			||||
 | 
					                framework.unblockUI(); | 
				
			||||
 | 
					                // change document title on search refresh
 | 
				
			||||
 | 
					                var search_input = $(".search_input").length | 
				
			||||
 | 
					                if (search_input <= 0 ){document.title = 'Search';} | 
				
			||||
 | 
					            }).guardedCatch(function () { | 
				
			||||
 | 
					                $form.remove(); | 
				
			||||
 | 
					            }); | 
				
			||||
 | 
					        }, | 
				
			||||
 | 
					    }); | 
				
			||||
 | 
					}); | 
				
			||||
@ -0,0 +1,31 @@ | 
				
			|||||
 | 
					.oe_search_tab{ | 
				
			||||
 | 
					    cursor: pointer; | 
				
			||||
 | 
					    transition: .2s; | 
				
			||||
 | 
					    &:hover { | 
				
			||||
 | 
					        background-color: #7c7bad !important; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.oe_details_tree{ | 
				
			||||
 | 
					    display: none; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.btn_master_search{ | 
				
			||||
 | 
					    display: inline-block; | 
				
			||||
 | 
					    background-color:#5f5e97; | 
				
			||||
 | 
					    color:#fff !important; | 
				
			||||
 | 
					    color: #fff;margin-left: 1px; | 
				
			||||
 | 
					    margin-top: -1px; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.btn_master_search:hover{ | 
				
			||||
 | 
					    background-color: rgb(255, 255, 255) !important; | 
				
			||||
 | 
					    color: rgb(61, 155, 187) !important; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					.not-allowed{ | 
				
			||||
 | 
					    color: #d94242; | 
				
			||||
 | 
					    border: 1px solid #ea9292; | 
				
			||||
 | 
					    border-radius: 5px; | 
				
			||||
 | 
					    background-color: #f9e7e7; | 
				
			||||
 | 
					    padding: 1px 55px; | 
				
			||||
 | 
					    width: 370px; | 
				
			||||
 | 
					    margin-bottom: 5px; | 
				
			||||
 | 
					    display: none; | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,253 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <data> | 
				
			||||
 | 
					        <!-- form view  --> | 
				
			||||
 | 
					        <record model="ir.ui.view" id="master_search_form"> | 
				
			||||
 | 
					            <field name="name">Search</field> | 
				
			||||
 | 
					            <field name="model">master.search</field> | 
				
			||||
 | 
					            <field name="arch" type="xml"> | 
				
			||||
 | 
					                <form string="Search"> | 
				
			||||
 | 
					                    <style> | 
				
			||||
 | 
					                        .o_control_panel{display: none;} | 
				
			||||
 | 
					                    </style> | 
				
			||||
 | 
					                    <script> | 
				
			||||
 | 
					                        $(document).ready(function(){ | 
				
			||||
 | 
					                        // Disable click events of tree view for history | 
				
			||||
 | 
					                        $(".disable_open").unbind("click"); | 
				
			||||
 | 
					                        if ($(".oe_search_bgnd").length > 0){document.title = 'Search';} | 
				
			||||
 | 
					                        }); | 
				
			||||
 | 
					                    </script> | 
				
			||||
 | 
					                    <sheet> | 
				
			||||
 | 
					                        <div class="row oe_search_bgnd" | 
				
			||||
 | 
					                             style="padding: 24px 32px;background-color:#e5e4f9;border-radius: 5px;"> | 
				
			||||
 | 
					                            <div class="col-12 col-md-8 col-xl-8"> | 
				
			||||
 | 
					                                <label for="search_string" string="Search  " style="display: inline-block;" | 
				
			||||
 | 
					                                       class="oe_read_only"/> | 
				
			||||
 | 
					                                <field name="search_string" default_focus="1" class="search_input" | 
				
			||||
 | 
					                                       style="width: 80%; display: inline-block;margin-right: 0px;block-size: 32px;" | 
				
			||||
 | 
					                                       placeholder="Type here to search.."/> | 
				
			||||
 | 
					                                <button name="action_clear_search" | 
				
			||||
 | 
					                                        type="object" class="fa fa-times oe_edit_only btn_master_search"/> | 
				
			||||
 | 
					                                <button name="action_search" | 
				
			||||
 | 
					                                        type="object" | 
				
			||||
 | 
					                                        class="fa fa-search oe_search_btn btn_master_search oe_edit_only"/> | 
				
			||||
 | 
					                                <div class="not-allowed">Regular expressions are not allowed in search!</div> | 
				
			||||
 | 
					                                <div> | 
				
			||||
 | 
					                                    <label for="match_entire" string="Match Phrase :" style="display: inline-block;"/> | 
				
			||||
 | 
					                                    <field name="match_entire" style="display: inline-block; margin-left: 10px;"/> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <div style="display: block;"> | 
				
			||||
 | 
					                                    <label for="search_by" string="Search For :" class="oe_read_only"/> | 
				
			||||
 | 
					                                    <field name="search_by" widget="radio" options="{'horizontal': true}"/> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div class="col-12 col-md-4 col-xl-4"> | 
				
			||||
 | 
					                                <div style="display: block;"> | 
				
			||||
 | 
					                                    <label for="search_mode" string="Mode :" class="oe_read_only"/> | 
				
			||||
 | 
					                                    <field name="search_mode" widget="radio" nolabel="1" | 
				
			||||
 | 
					                                           options="{'horizontal': false}"/> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                        <div class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Recent Searches | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="history_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | 
				
			||||
 | 
					                                <field name="master_search_ids"> | 
				
			||||
 | 
					                                    <tree create="0" class="disable_open"> | 
				
			||||
 | 
					                                        <field name="search_string" class="re_search oe_key"/> | 
				
			||||
 | 
					                                        <field name="search_mode" string="Mode" class="re_search"/> | 
				
			||||
 | 
					                                        <field name="search_by" string="Type" class="re_search"/> | 
				
			||||
 | 
					                                        <!--<field name="create_date" string="Date" optional="hide" class="re_search"/>--> | 
				
			||||
 | 
					                                        <button style="display: inline-block;" name="action_unlink_search" | 
				
			||||
 | 
					                                                type="object" class="fa fa-trash"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                        <div attrs="{'invisible':[('search_by', 'not in', ('any', 'customer'))]}" class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Customer Search Results | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="customer_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | 
				
			||||
 | 
					                                <field name="customer_ids"> | 
				
			||||
 | 
					                                    <tree create="0" delete="0"> | 
				
			||||
 | 
					                                        <field name="name"/> | 
				
			||||
 | 
					                                        <field name="email"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div attrs="{'invisible':[('search_by', 'not in', ('any', 'product'))]}" class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Product Search Results | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="product_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree" | 
				
			||||
 | 
					                                 name="products"> | 
				
			||||
 | 
					                                <field name="product_ids"> | 
				
			||||
 | 
					                                    <tree create="0" delete="0"> | 
				
			||||
 | 
					                                        <field name="name" string="Name"/> | 
				
			||||
 | 
					                                        <field name="default_code" string="Code"/> | 
				
			||||
 | 
					                                        <field name="description" string="Description"/> | 
				
			||||
 | 
					                                        <field name="type" string="Product Type"/> | 
				
			||||
 | 
					                                        <field name="categ_id" string="Category"/> | 
				
			||||
 | 
					                                        <field name="uom_id" string="Base UoM" optional="hide"/> | 
				
			||||
 | 
					                                        <field name="qty_available" string="Stock"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div attrs="{'invisible':[('search_by', 'not in', ('any', 'transaction details'))]}" | 
				
			||||
 | 
					                             class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Inventory Search Results | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="transaction_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | 
				
			||||
 | 
					                                <field name="transaction_details"> | 
				
			||||
 | 
					                                    <tree create="0" delete="0"> | 
				
			||||
 | 
					                                        <field name="name" string="Trans. # "/> | 
				
			||||
 | 
					                                        <field name="date_done" string="Transaction Date"/> | 
				
			||||
 | 
					                                        <field name="picking_type_id" string="Transaction Type"/> | 
				
			||||
 | 
					                                        <field name="partner_id" string="Reference Name"/> | 
				
			||||
 | 
					                                        <field name="state" string="Transaction Status"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div attrs="{'invisible':[('search_by', 'not in', ('any', 'sale details'))]}" | 
				
			||||
 | 
					                             class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Sale Search Results | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="sale_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | 
				
			||||
 | 
					                                <field name="sale_details"> | 
				
			||||
 | 
					                                    <tree create="0" delete="0"> | 
				
			||||
 | 
					                                        <field name="name" string="Trans. # "/> | 
				
			||||
 | 
					                                        <field name="partner_id" string="Customer"/> | 
				
			||||
 | 
					                                        <field name="pricelist_id" string="Pricelist"/> | 
				
			||||
 | 
					                                        <field name="payment_term_id" string="Payment Term"/> | 
				
			||||
 | 
					                                        <field name="state" string="Status"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div attrs="{'invisible':[('search_by', 'not in', ('any', 'purchase details'))]}" | 
				
			||||
 | 
					                             class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Purchase Search Results | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="purchase_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | 
				
			||||
 | 
					                                <field name="purchase_details"> | 
				
			||||
 | 
					                                    <tree create="0" delete="0"> | 
				
			||||
 | 
					                                        <field name="name" string="Trans. # "/> | 
				
			||||
 | 
					                                        <field name="partner_id" string="Customer"/> | 
				
			||||
 | 
					                                        <field name="state" string="Status"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div attrs="{'invisible':[('search_by', 'not in', ('any', 'account details'))]}" | 
				
			||||
 | 
					                             class="oe_result_div"> | 
				
			||||
 | 
					                            <div style="background-color: #5f5e97; color: #fff; width: 100%; padding: 5px 10px; | 
				
			||||
 | 
					                            margin-top: 10px; border-top-right-radius: 5px;border-top-left-radius: 5px;" | 
				
			||||
 | 
					                                 class="oe_search_tab"> | 
				
			||||
 | 
					                                Accounting Search Results | 
				
			||||
 | 
					                                <div style="float: right;"> | 
				
			||||
 | 
					                                    <field name="account_count" class="oe_tab_count" readonly="1"/> | 
				
			||||
 | 
					                                    Records Found | 
				
			||||
 | 
					                                    <span class="oe_drop_down"> | 
				
			||||
 | 
					                                        <i style="color: #fff !important; font-size: 16px;" class="fa fa-caret-down"/> | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            <div style="height: 200px; overflow-y: scroll;width: 100%;" class="oe_details_tree"> | 
				
			||||
 | 
					                                <field name="account_details"> | 
				
			||||
 | 
					                                    <tree create="false" delete="false" edit="false"> | 
				
			||||
 | 
					                                        <field name="name" string="Trans. # "/> | 
				
			||||
 | 
					                                        <field name="partner_id" string="Customer"/> | 
				
			||||
 | 
					                                        <field name="state" string="Status"/> | 
				
			||||
 | 
					                                    </tree> | 
				
			||||
 | 
					                                </field> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </sheet> | 
				
			||||
 | 
					                </form> | 
				
			||||
 | 
					            </field> | 
				
			||||
 | 
					        </record> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <!-- actions opening views on models --> | 
				
			||||
 | 
					        <record model="ir.actions.act_window" id="master_search_action"> | 
				
			||||
 | 
					            <field name="name">Search</field> | 
				
			||||
 | 
					            <field name="res_model">master.search</field> | 
				
			||||
 | 
					            <field name="view_mode">form</field> | 
				
			||||
 | 
					            <field name="context">{'active_test': False, 'search_default_filter_active': 1}</field> | 
				
			||||
 | 
					        </record> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <!-- Search root menu --> | 
				
			||||
 | 
					        <menuitem id="master_search_root" name="Search" action="master_search_action" | 
				
			||||
 | 
					                  web_icon="master_search,static/description/icon.png" | 
				
			||||
 | 
					                  sequence="2" groups="master_search.master_search_read"/> | 
				
			||||
 | 
					    </data> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,9 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="UTF-8" ?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <template id="assets_backend" inherit_id="web.assets_backend"> | 
				
			||||
 | 
					        <xpath expr="." position="inside"> | 
				
			||||
 | 
					            <script type="text/javascript" src="/master_search/static/src/js/form_renderer.js"/> | 
				
			||||
 | 
					            <link rel="stylesheet" href="/master_search/static/src/scss/master_search.scss"/> | 
				
			||||
 | 
					        </xpath> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					</odoo> | 
				
			||||