| @ -0,0 +1,41 @@ | |||||
|  | Master Search | ||||
|  | ============= | ||||
|  | * Master Search module for Odoo 14 community editions | ||||
|  | 
 | ||||
|  | Installation | ||||
|  | ============ | ||||
|  | 	- www.odoo.com/documentation/14.0/setup/install.html | ||||
|  | 	- Install our custom addon | ||||
|  | 
 | ||||
|  | License | ||||
|  | ------- | ||||
|  | General Public License, Version 3 (LGPL v3). | ||||
|  | (https://www.odoo.com/documentation/user/14.0/legal/licenses/licenses.html) | ||||
|  | 
 | ||||
|  | Company | ||||
|  | ------- | ||||
|  | * 'Cybrosys Techno Solutions <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Credits | ||||
|  | ------- | ||||
|  | * Developer: | ||||
|  | (v14) 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,45 @@ | |||||
|  | # -*- 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': 'Odoo14 Master Search', | ||||
|  |     'version': '14.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 14.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: 21 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> | ||||