| @ -0,0 +1,52 @@ | |||||
|  | .. image:: https://img.shields.io/badge/license-LGPL--3-green.svg | ||||
|  |     :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html | ||||
|  |     :alt: License: LGPL-3 | ||||
|  | 
 | ||||
|  | Import Product variant | ||||
|  | ======================== | ||||
|  | This module is used to import the product and their attributes using xlsx file and csv file. | ||||
|  | And also through this files with product | ||||
|  | importing we can also import some basic fields such as char ,many2one and many2many | ||||
|  | fields.Using this module we can update a product using the product's internal reference or barcode we can change the date through the importing and also these can be implemented using the two files. | ||||
|  | 
 | ||||
|  | Configuration | ||||
|  | ============= | ||||
|  | * No additional configurations needed | ||||
|  | 
 | ||||
|  | Company | ||||
|  | ------- | ||||
|  | * `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | License | ||||
|  | ------- | ||||
|  | General Public License, Version 3 (LGPL v3). | ||||
|  | (https://www.gnu.org/licenses/lgpl-3.0-standalone.html) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | Credits | ||||
|  | ------- | ||||
|  | * Developer: (V16) Gayathri V, | ||||
|  |             (V15) Busthana, | ||||
|  | Contact: odoo@cybrosys.com | ||||
|  | 
 | ||||
|  | Contacts | ||||
|  | -------- | ||||
|  | * Mail Contact : odoo@cybrosys.com | ||||
|  | * Website : https://cybrosys.com | ||||
|  | 
 | ||||
|  | Bug Tracker | ||||
|  | ----------- | ||||
|  | Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | ||||
|  | 
 | ||||
|  | Maintainer | ||||
|  | ========== | ||||
|  | .. image:: https://cybrosys.com/images/logo.png | ||||
|  |    :target: https://cybrosys.com | ||||
|  | 
 | ||||
|  | This module is maintained by Cybrosys Technologies. | ||||
|  | 
 | ||||
|  | For support and more information, please visit `Our Website <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Further information | ||||
|  | =================== | ||||
|  | HTML Description: `<static/description/index.html>`__ | ||||
| @ -0,0 +1,23 @@ | |||||
|  | """Import product variant""" | ||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################# | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU LESSER | ||||
|  | #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | ||||
|  | #    (LGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ############################################################################# | ||||
|  | from . import wizards | ||||
| @ -0,0 +1,50 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################# | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU LESSER | ||||
|  | #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | ||||
|  | #    (LGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ############################################################################# | ||||
|  | { | ||||
|  |     'name': 'Import Product variant', | ||||
|  |     'version': '15.0.1.0.0', | ||||
|  |     'category': 'Sales', | ||||
|  |     'summary': """This module is used to import the product and product  | ||||
|  |      variants.""", | ||||
|  |     'description': """This module is used to import the product and their  | ||||
|  |      attributes using xlsx file and csv file. And also through this files with  | ||||
|  |      product importing we can also import some basic fields such as char,many2one | ||||
|  |      and many2many fields.Using this module we can update a product using the  | ||||
|  |      product's internal reference or barcode we can change the date through the  | ||||
|  |      importing and also these can be implemented using the two files.""", | ||||
|  |     'author': 'Cybrosys Techno Solutions', | ||||
|  |     'company': 'Cybrosys Techno Solutions', | ||||
|  |     'maintainer': 'Cybrosys Techno Solutions', | ||||
|  |     'website': 'https://www.cybrosys.com', | ||||
|  |     'depends': ['sale_management', 'stock'], | ||||
|  |     'data': [ | ||||
|  |         'security/ir.model.access.csv', | ||||
|  |         'security/product_variant_import_groups.xml', | ||||
|  |         'wizards/import_product_variant_views.xml', | ||||
|  |     ], | ||||
|  |     'images': ['static/description/banner.png'], | ||||
|  |     'license': 'LGPL-3', | ||||
|  |     'installable': True, | ||||
|  |     'auto_install': False, | ||||
|  |     'application': False, | ||||
|  | } | ||||
|  | 
 | ||||
| @ -0,0 +1,6 @@ | |||||
|  | ## Module <product_variant_import> | ||||
|  | 
 | ||||
|  | #### 27.08.2024 | ||||
|  | #### Version 15.0.1.0.0 | ||||
|  | ##### ADD | ||||
|  | - Initial commit for Import Product variant | ||||
| 
 | 
| @ -0,0 +1,13 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Product variant Import/Export user group--> | ||||
|  |     <record model="ir.module.category" id="product_variant_import_module_management"> | ||||
|  |         <field name="name">Import</field> | ||||
|  |         <field name="description">Import Product Variant</field> | ||||
|  |         <field name="sequence">10</field> | ||||
|  |     </record> | ||||
|  |     <record id="product_variant_access" model="res.groups"> | ||||
|  |         <field name="name">Variant Manager</field> | ||||
|  |         <field name="category_id" ref="product_variant_import_module_management"/> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| After Width: | Height: | Size: 3.6 KiB | 
| After Width: | Height: | Size: 310 B | 
| After Width: | Height: | Size: 1.3 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 733 B | 
| After Width: | Height: | Size: 911 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 3.4 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: 1.5 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 4.4 KiB | 
| After Width: | Height: | Size: 589 B | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 2.3 KiB | 
| After Width: | Height: | Size: 967 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 3.8 KiB | 
| After Width: | Height: | Size: 5.0 KiB | 
| After Width: | Height: | Size: 59 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 56 KiB | 
| After Width: | Height: | Size: 58 KiB | 
| After Width: | Height: | Size: 119 KiB | 
| After Width: | Height: | Size: 111 KiB | 
| After Width: | Height: | Size: 15 KiB | 
| After Width: | Height: | Size: 22 KiB | 
| After Width: | Height: | Size: 43 KiB | 
| After Width: | Height: | Size: 44 KiB | 
| After Width: | Height: | Size: 41 KiB | 
| After Width: | Height: | Size: 64 KiB | 
| After Width: | Height: | Size: 96 KiB | 
| After Width: | Height: | Size: 22 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 18 KiB | 
| After Width: | Height: | Size: 47 KiB | 
| After Width: | Height: | Size: 9.6 KiB | 
| @ -0,0 +1,639 @@ | |||||
|  | <div class="container" style="padding: 1rem !important; margin-bottom: 1rem !important;"> | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between" | ||||
|  |             style="border-bottom: 1px solid #d5d5d5;"> | ||||
|  |             <div class="my-3"> | ||||
|  |                 <img src="./assets/icons/logo.png" style="width: auto !important; height: 40px !important;"> | ||||
|  |             </div> | ||||
|  |             <div class="my-3 d-flex align-items-center"> | ||||
|  |                 <div | ||||
|  |                     style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;"> | ||||
|  |                     <i class="fa fa-check mr-1"></i>Community | ||||
|  |                 </div> | ||||
|  |                 <div | ||||
|  |                     style="background-color: #875A7B !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;"> | ||||
|  |                     <i class="fa fa-check mr-1"></i>Enterprise | ||||
|  |                 </div> | ||||
|  | 
 | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | <div class="container" style="padding: 0rem 1.5rem 4rem !important"> | ||||
|  |     <div class="row" style="height: 900px !important;"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12" | ||||
|  |             style="padding: 4rem 1rem !important; background-color: #714B67 !important; height: 600px !important; border-radius: 20px !important;"> | ||||
|  |             <h1 | ||||
|  |                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #FFFFFF !important;  font-size: 3.3rem !important; text-align: center !important;"> | ||||
|  |                 Import Product Variant</h1> | ||||
|  |             <p | ||||
|  |                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 300 !important; color: #FFFFFF !important;  font-size: 1.4rem !important; text-align: center !important;"> | ||||
|  |                 This Module Is Helps To Import Product And Product Variants. | ||||
|  |             </p> | ||||
|  |             <img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto" /> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin-bottom: 2rem !important"> | ||||
|  |             <h2 | ||||
|  |                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> | ||||
|  |                 <i class="fa fa-compass mr-2"></i>Explore this module | ||||
|  |             </h2> | ||||
|  |         </div> | ||||
|  |         <div class="col-md-6"> | ||||
|  |             <a href="#overview" style="text-decoration: none !important;"> | ||||
|  |                 <div class="row" | ||||
|  |                     style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> | ||||
|  |                     <div class="col-8"> | ||||
|  |                         <h3 | ||||
|  |                             style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> | ||||
|  |                             Overview</h3> | ||||
|  |                         <p | ||||
|  |                             style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> | ||||
|  |                             Learn more about this module</p> | ||||
|  |                     </div> | ||||
|  |                     <div class="col-4 text-right d-flex justify-content-end align-items-center"> | ||||
|  |                         <i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             </a> | ||||
|  |         </div> | ||||
|  |         <div class="col-md-6"> | ||||
|  |             <a href="#features" style="text-decoration: none !important;"> | ||||
|  |                 <div class="row" | ||||
|  |                     style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> | ||||
|  |                     <div class="col-8"> | ||||
|  |                         <h3 | ||||
|  |                             style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> | ||||
|  |                             Features</h3> | ||||
|  |                         <p | ||||
|  |                             style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> | ||||
|  |                             View features of this module</p> | ||||
|  |                     </div> | ||||
|  |                     <div class="col-4 text-right d-flex justify-content-end align-items-center"> | ||||
|  |                         <i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             </a> | ||||
|  |         </div> | ||||
|  |         <div class="col-md-6"> | ||||
|  |             <a href="#screenshots" style="text-decoration: none !important;"> | ||||
|  |                 <div class="row" | ||||
|  |                     style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> | ||||
|  |                     <div class="col-8"> | ||||
|  |                         <h3 | ||||
|  |                             style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> | ||||
|  |                             Screenshots</h3> | ||||
|  |                         <p | ||||
|  |                             style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> | ||||
|  |                             See key screenshots of this module</p> | ||||
|  |                     </div> | ||||
|  |                     <div class="col-4 text-right d-flex justify-content-end align-items-center"> | ||||
|  |                         <i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             </a> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |     <div class="row" id="overview"> | ||||
|  |         <div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important"> | ||||
|  |             <h2 | ||||
|  |                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> | ||||
|  |                 <i class="fa fa-pie-chart mr-2"></i>Overview | ||||
|  |             </h2> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-mg-12 pl-3"> | ||||
|  |             <p | ||||
|  |                 style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important; line-height: 30px !important;"> | ||||
|  |                 This module is used to import the product and their attributes using | ||||
|  |                 xlsx file and csv file. And also through these files with product | ||||
|  |                 importing we can also import some | ||||
|  |                 basic fields such as char, many2one and many2many fields.Using this | ||||
|  |                 module we can update a product using the product's internal | ||||
|  |                 reference or barcode we can change the date through the importing | ||||
|  |                 and also these can be implemented using the two files. | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  | <!-- FEATURES SECTION --> | ||||
|  | 
 | ||||
|  |     <div class="d-flex align-items-center" | ||||
|  |      style="border-bottom: 2px solid #714B67; padding: 15px 0px;" | ||||
|  |      id="features"> | ||||
|  |     <div class="d-flex justify-content-center align-items-center mr-2" | ||||
|  |          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | ||||
|  |         <img src="./assets/misc/features.png"/> | ||||
|  |     </div> | ||||
|  |     <h2 class="mt-2" | ||||
|  |         style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | ||||
|  |         Features | ||||
|  |     </h2> | ||||
|  | </div> | ||||
|  |     <div class="row" | ||||
|  |      style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> | ||||
|  |     <div class="col-sm-12 col-md-6"> | ||||
|  | 
 | ||||
|  |         <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |              style="margin-top: 40px; margin-bottom: 40px"> | ||||
|  |             <img src="./assets/misc/check-box.png" class="mr-2"/> | ||||
|  |             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                     You can or update product variants by barcode & internal reference. </span> | ||||
|  |         </div> | ||||
|  |         <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |              style="margin-top: 30px; margin-bottom: 30px"> | ||||
|  |             <img src="./assets/misc/check-box.png" class="mr-2"/> | ||||
|  |             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can import product images by image URL or local image path</span> | ||||
|  |         </div> | ||||
|  |         <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |              style="margin-top: 30px; margin-bottom: 30px"> | ||||
|  |             <img src="./assets/misc/check-box.png" class="mr-2"/> | ||||
|  |             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Easy to create and update product variants.</span> | ||||
|  |         </div> | ||||
|  |         <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |              style="margin-top: 30px; margin-bottom: 30px"> | ||||
|  |             <img src="./assets/misc/check-box.png" class="mr-2"/> | ||||
|  |             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Easy to import custom fields with product variants.</span> | ||||
|  |         </div> | ||||
|  |         <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |              style="margin-top: 30px; margin-bottom: 30px"> | ||||
|  |             <img src="./assets/misc/check-box.png" class="mr-2"/> | ||||
|  |             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Easy to import Product Variant (image, price, invoicing type, product type etc.) from CSV or Excel.</span> | ||||
|  |         </div> | ||||
|  |         <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |              style="margin-top: 30px; margin-bottom: 30px"> | ||||
|  |             <img src="./assets/misc/check-box.png" class="mr-2"/> | ||||
|  |             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Useful for mass records.</span> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </div> | ||||
|  | <!-- END OF FEATURES SECTION --> | ||||
|  | 
 | ||||
|  | <div class="d-flex flex-column justify-content-center align-items-start" | ||||
|  |          style="margin-top: 40px; margin-bottom: 40px"> | ||||
|  |         <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                    An example template for a xlsx file is at this path.: | ||||
|  |                 product_variant_import/static/test_files/product_test.xlsx</span> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  | <!-- SCREENSHOTS SECTION --> | ||||
|  | <div class="d-flex align-items-center" | ||||
|  |      style="border-bottom: 2px solid #714B67; padding: 15px 0px;" | ||||
|  |      id="screenshots"> | ||||
|  |     <div class="d-flex justify-content-center align-items-center mr-2" | ||||
|  |          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | ||||
|  |         <img src="./assets/misc/pictures.png"/> | ||||
|  |     </div> | ||||
|  |     <h2 class="mt-2" | ||||
|  |         style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | ||||
|  |         Screenshots | ||||
|  |     </h2> | ||||
|  | </div> | ||||
|  | <div class="row"> | ||||
|  |     <div class="col-sm-12"> | ||||
|  | 
 | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Set the user access.</h3> | ||||
|  |             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"></p> | ||||
|  |             <img src="./assets/screenshots/image1.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Import menu in the sales module under the product tab.</h3> | ||||
|  |             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"></p> | ||||
|  |             <img src="./assets/screenshots/image2.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Sample example of csv file.</h3> | ||||
|  |             <img src="./assets/screenshots/image7.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |             <img src="./assets/screenshots/image8.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Upload csv/xlsx file to create the product with | ||||
|  |                 variants.</h3> | ||||
|  |             <img src="./assets/screenshots/image3.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Sample example of xlsx file.</h3> | ||||
|  |             <img src="./assets/screenshots/image9.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |             <img src="./assets/screenshots/image10.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |             <img src="./assets/screenshots/image12.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Upload you csv/xlsx file to create/update the product with | ||||
|  |                 variants.</h3> | ||||
|  |             <img src="./assets/screenshots/image4.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div style="display: block; margin: 30px auto;"> | ||||
|  |             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | ||||
|  |                 Imported product with image.</h3> | ||||
|  |             <img src="./assets/screenshots/image5.png" | ||||
|  |                  class="img-thumbnail"> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </div> | ||||
|  | <!-- END OF SCREENSHOTS SECTION --> | ||||
|  | 
 | ||||
|  |     <!-- SUGGESTED PRODUCTS --> | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-lg-12 d-flex flex-column justify-content-center" | ||||
|  |             style="text-align: center; padding: 2.5rem 1rem !important;"> | ||||
|  |             <h2 style="color: #212529 !important;">Suggested Products</h2> | ||||
|  |             <hr | ||||
|  |                 style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | ||||
|  | 
 | ||||
|  |             <div id="demo1" class="row carousel slide" data-ride="carousel"> | ||||
|  |                 <!-- The slideshow --> | ||||
|  |                 <div class="carousel-inner"> | ||||
|  |                     <div class="carousel-item active" style="min-height:0px"> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/export_stockinfo_xls/" 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/export_image.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/15.0/custom_gantt_view/" 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/gantt_image.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/15.0/sales_credit_limit/" 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/credit_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                     </div> | ||||
|  |                     <div class="carousel-item" style="min-height:0px"> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/base_account_budget/" 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/budget_image.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/15.0/product_to_quotation/" 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/quotation_image.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/15.0/employee_documents_expiry/" | ||||
|  |                                 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/employee_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |                 <!-- Left and right controls --> | ||||
|  |                 <a class="carousel-control-prev" href="#demo1" data-slide="prev" | ||||
|  |                     style="left:-25px;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="#demo1" data-slide="next" | ||||
|  |                     style="right:-25px;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> | ||||
|  |     <!-- 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 style="color: #212529 !important;">Our Services</h2> | ||||
|  |                 <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | ||||
|  |             </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 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 style="color: #212529 !important;">Our Industries</h2> | ||||
|  |                 <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | ||||
|  |             </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 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 style="color: #212529 !important;">Need Help?</h2> | ||||
|  |                 <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | ||||
|  |             </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-6"> | ||||
|  |                         <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-6"> | ||||
|  |                         <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>+91 86068 27707</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 --> | ||||
|  | 
 | ||||
|  | </div> | ||||
| @ -0,0 +1,23 @@ | |||||
|  | """Import product variant""" | ||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################# | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU LESSER | ||||
|  | #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | ||||
|  | #    (LGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ############################################################################# | ||||
|  | from . import import_product_variant | ||||
| @ -0,0 +1,632 @@ | |||||
|  | """"Import product variant""" | ||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################# | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU LESSER | ||||
|  | #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | ||||
|  | #    (LGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ############################################################################# | ||||
|  | import os | ||||
|  | import base64, binascii, csv, io, tempfile, requests, xlrd | ||||
|  | from odoo import fields, models, _ | ||||
|  | from odoo.exceptions import UserError | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class ImportVariant(models.TransientModel): | ||||
|  |     """Wizard for selecting the imported Files""" | ||||
|  |     _name = 'import.product.variant' | ||||
|  |     _description = "Import Product Variants" | ||||
|  | 
 | ||||
|  |     import_file = fields.Selection( | ||||
|  |         [('csv', 'CSV File'), ('excel', 'Excel File')], required=True, | ||||
|  |         string="Import FIle", help="Import the files") | ||||
|  |     method = fields.Selection([('create', 'Create Product'), | ||||
|  |                                ('update', 'Update Product'), ( | ||||
|  |                                    'update_product', | ||||
|  |                                    'Update Product Variant'), ], | ||||
|  |                               string="Method", required=True, | ||||
|  |                               help="Method for importing/Exporting") | ||||
|  |     file = fields.Binary(string="File", required=True, | ||||
|  |                          help="The file to upload") | ||||
|  | 
 | ||||
|  |     def action_import_product_variant(self): | ||||
|  |         """This is used to import/export the product """ | ||||
|  |         try: | ||||
|  |             global list, detailed, invoicing_type | ||||
|  |             link = False | ||||
|  |             if self.import_file == 'excel': | ||||
|  |                 try: | ||||
|  |                     file_pointer = tempfile.NamedTemporaryFile(delete=False, | ||||
|  |                                                                suffix=".xlsx") | ||||
|  |                     file_pointer.write(binascii.a2b_base64(self.file)) | ||||
|  |                     file_pointer.seek(0) | ||||
|  |                     workbook = xlrd.open_workbook(file_pointer.name) | ||||
|  |                     sheet = workbook.sheet_by_index(0) | ||||
|  |                 except: | ||||
|  |                     raise UserError(_("File not Valid")) | ||||
|  |                 for rec in range(sheet.nrows): | ||||
|  |                     if rec >= 1: | ||||
|  |                         row_vals = sheet.row_values(rec) | ||||
|  |                         if len(row_vals) < int(24): | ||||
|  |                             raise UserError( | ||||
|  |                                 _("Please ensure that you selected " | ||||
|  |                                   "the correct file")) | ||||
|  |                         product_category = self.env['product.category'].search( | ||||
|  |                             [('complete_name', '=', row_vals[6])]).id | ||||
|  |                         if product_category: | ||||
|  |                             category = product_category | ||||
|  |                         else: | ||||
|  |                             category = self.env['product.category'].create({ | ||||
|  |                                 'name': row_vals[6].split('/')[0], | ||||
|  |                                 'complete_name': row_vals[6] | ||||
|  |                             }) | ||||
|  |                             category = category.id | ||||
|  |                         product_uom = self.env['uom.uom'].search( | ||||
|  |                             [('name', '=', row_vals[7])]).id | ||||
|  |                         if product_uom: | ||||
|  |                             uom = product_uom | ||||
|  |                         else: | ||||
|  |                             raise UserError(_("Invalid uom")) | ||||
|  |                         pro_uom = self.env['uom.uom'].search( | ||||
|  |                             [('name', '=', row_vals[8])]).id | ||||
|  |                         if pro_uom: | ||||
|  |                             po_uom = pro_uom | ||||
|  |                         else: | ||||
|  |                             raise UserError(_("Invalid Purchase uom")) | ||||
|  |                         account_tax = self.env['account.tax'].search( | ||||
|  |                             [('name', '=', row_vals[9])]).id | ||||
|  |                         supp_tax = self.env['account.tax'].search( | ||||
|  |                             [('name', '=', row_vals[10])]).id | ||||
|  |                         if account_tax: | ||||
|  |                             tax = account_tax | ||||
|  |                         else: | ||||
|  |                             account = self.env['account.tax'].create({ | ||||
|  |                                 'name': row_vals[9].split(' ')[0], | ||||
|  |                                 'amount': row_vals[9].split(' ')[1], | ||||
|  |                             }) | ||||
|  |                             tax = account.id | ||||
|  |                         if supp_tax: | ||||
|  |                             supplier_tax = supp_tax | ||||
|  |                         else: | ||||
|  |                             supplier_account_tax = self.env[ | ||||
|  |                                 'account.tax'].create({ | ||||
|  |                                 'name': row_vals[10].split(' ')[0], | ||||
|  |                                 'amount': row_vals[10].split(' ')[1], | ||||
|  |                             }) | ||||
|  |                             supplier_tax = supplier_account_tax.id | ||||
|  |                         kay_val_dict = dict( | ||||
|  |                             self.env['product.template']._fields[ | ||||
|  |                                 'detailed_type'].selection) | ||||
|  |                         # here 'type' is field name | ||||
|  |                         for key, val in kay_val_dict.items(): | ||||
|  |                             if val == row_vals[5]: | ||||
|  |                                 detailed = key | ||||
|  |                         kay_val_dict = dict( | ||||
|  |                             self.env['product.template']._fields[ | ||||
|  |                                 'invoice_policy'].selection) | ||||
|  |                         # here 'type' is field name | ||||
|  |                         for key, val in kay_val_dict.items(): | ||||
|  |                             if val == row_vals[12]: | ||||
|  |                                 invoicing_type = key | ||||
|  |                         if "http://" in row_vals[23] or "https://" in row_vals[ | ||||
|  |                             23]: | ||||
|  |                             link = base64.b64encode( | ||||
|  |                                 requests.get( | ||||
|  |                                     row_vals[23].strip()).content).replace( | ||||
|  |                                 b"\n", b"") | ||||
|  |                         elif "/home" in row_vals[23]: | ||||
|  |                             if os.path.exists(row_vals[23]): | ||||
|  |                                 with open(row_vals[23], 'rb') as image_file: | ||||
|  |                                     link = base64.b64encode(image_file.read()) | ||||
|  |                         if not row_vals[2] or not row_vals[18]: | ||||
|  |                             raise UserError(_("File Must  Contain Internal " | ||||
|  |                                               "Reference or Barcode of the " | ||||
|  |                                               "Product")) | ||||
|  |                         if self.method == 'update': | ||||
|  |                             vals = { | ||||
|  |                                 'default_code': row_vals[2], | ||||
|  |                                 'name': row_vals[1], | ||||
|  |                                 'image_1920': link, | ||||
|  |                                 'sale_ok': row_vals[3], | ||||
|  |                                 'purchase_ok': row_vals[4], | ||||
|  |                                 'detailed_type': detailed, | ||||
|  |                                 'categ_id': category, | ||||
|  |                                 'uom_id': uom, | ||||
|  |                                 'uom_po_id': po_uom, | ||||
|  |                                 'taxes_id': [tax], | ||||
|  |                                 'supplier_taxes_id': [supplier_tax], | ||||
|  |                                 'description_sale': row_vals[11], | ||||
|  |                                 'invoice_policy': invoicing_type, | ||||
|  |                                 'list_price': row_vals[13], | ||||
|  |                                 'standard_price': row_vals[14], | ||||
|  |                                 'weight': row_vals[19], | ||||
|  |                                 'volume': row_vals[20], | ||||
|  |                             } | ||||
|  |                             if link: | ||||
|  |                                 vals.update({'image_1920': link}) | ||||
|  |                             product = self.env['product.template'].search( | ||||
|  |                                 [('barcode', '=', row_vals[18])]) | ||||
|  |                             if product: | ||||
|  |                                 product.write(vals) | ||||
|  |                             else: | ||||
|  |                                 product = self.env['product.template'].search( | ||||
|  |                                     [('default_code', '=', row_vals[2])]) | ||||
|  |                                 if product: | ||||
|  |                                     product.write(vals) | ||||
|  |                                 else: | ||||
|  |                                     raise UserError( | ||||
|  |                                         _("Please ensure that product " | ||||
|  |                                               "having the" | ||||
|  |                                               "contains Internal reference or " | ||||
|  |                                               "Barcode to with your file")) | ||||
|  |                         else: | ||||
|  |                             if self.method == 'update_product': | ||||
|  |                                 vals = { | ||||
|  |                                     'default_code': row_vals[2], | ||||
|  |                                     'name': row_vals[1], | ||||
|  |                                     'image_1920': link, | ||||
|  |                                     'sale_ok': row_vals[3], | ||||
|  |                                     'purchase_ok': row_vals[4], | ||||
|  |                                     'detailed_type': detailed, | ||||
|  |                                     'categ_id': category, | ||||
|  |                                     'uom_id': uom, | ||||
|  |                                     'uom_po_id': po_uom, | ||||
|  |                                     'taxes_id': [tax], | ||||
|  |                                     'supplier_taxes_id': [supplier_tax], | ||||
|  |                                     'description_sale': row_vals[11], | ||||
|  |                                     'invoice_policy': invoicing_type, | ||||
|  |                                     'lst_price': row_vals[13], | ||||
|  |                                     'standard_price': row_vals[14], | ||||
|  |                                     'weight': row_vals[19], | ||||
|  |                                     'volume': row_vals[20], | ||||
|  |                                 } | ||||
|  |                                 if link: | ||||
|  |                                     vals.update({'image_1920': link}) | ||||
|  |                                 product = self.env['product.product'].search( | ||||
|  |                                     [('barcode', '=', row_vals[18])]) | ||||
|  |                                 if product: | ||||
|  |                                     product.write(vals) | ||||
|  |                                 else: | ||||
|  |                                     product = self.env[ | ||||
|  |                                         'product.product'].search( | ||||
|  |                                         [('default_code', '=', row_vals[2])]) | ||||
|  |                                     if product: | ||||
|  |                                         product.write(vals) | ||||
|  |                                     else: | ||||
|  |                                         raise UserError( | ||||
|  |                                             _("Please ensure that product " | ||||
|  |                                               "having the" | ||||
|  |                                               "contains Internal reference or " | ||||
|  |                                               "Barcode to with your file.")) | ||||
|  |                             else: | ||||
|  |                                 vals = { | ||||
|  |                                     'default_code': row_vals[2], | ||||
|  |                                     'name': row_vals[1], | ||||
|  |                                     'image_1920': link, | ||||
|  |                                     'sale_ok': row_vals[3], | ||||
|  |                                     'purchase_ok': row_vals[4], | ||||
|  |                                     'detailed_type': detailed, | ||||
|  |                                     'categ_id': category, | ||||
|  |                                     'uom_id': uom, | ||||
|  |                                     'uom_po_id': po_uom, | ||||
|  |                                     'taxes_id': [tax], | ||||
|  |                                     'supplier_taxes_id': [supplier_tax], | ||||
|  |                                     'description_sale': row_vals[11], | ||||
|  |                                     'invoice_policy': invoicing_type, | ||||
|  |                                     'list_price': row_vals[13], | ||||
|  |                                     'standard_price': row_vals[14], | ||||
|  |                                     'weight': row_vals[19], | ||||
|  |                                     'volume': row_vals[20], | ||||
|  | 
 | ||||
|  |                                 } | ||||
|  |                                 product = self.env['product.template'].create( | ||||
|  |                                     vals) | ||||
|  |                         values = [] | ||||
|  |                         for row_val in row_vals[15].split(','): | ||||
|  |                             pr_attribute = self.env['product.attribute'].search( | ||||
|  |                                 [('name', '=', row_val)]).id | ||||
|  |                             if pr_attribute: | ||||
|  |                                 attribute = pr_attribute | ||||
|  |                             else: | ||||
|  |                                 raise UserError( | ||||
|  |                                     _("Please update a valid attribute and " | ||||
|  |                                       "values")) | ||||
|  |                             values.append({'attribute': attribute}) | ||||
|  |                             for row in row_vals[16].split(','): | ||||
|  |                                 attri_values = self.env[ | ||||
|  |                                     'product.attribute.value'].search( | ||||
|  |                                     [('attribute_id', '=', attribute), | ||||
|  |                                      ('name', '=', row)]).ids | ||||
|  |                                 if len(attri_values) != 0: | ||||
|  |                                     values.extend({attri_values[0]}) | ||||
|  |                         variant = {} | ||||
|  |                         mylist = [] | ||||
|  |                         for val in values: | ||||
|  |                             if isinstance(val, dict): | ||||
|  |                                 variant = val | ||||
|  |                                 variant['attribut_value'] = [] | ||||
|  |                             else: | ||||
|  |                                 variant['attribut_value'].extend([val]) | ||||
|  |                             if variant in mylist: | ||||
|  |                                 pass | ||||
|  |                             else: | ||||
|  |                                 mylist.append(variant) | ||||
|  |                         for lst in mylist: | ||||
|  |                             val = { | ||||
|  |                                 'product_tmpl_id': product.id, | ||||
|  |                                 'attribute_id': lst['attribute'], | ||||
|  |                                 'value_ids': lst['attribut_value'], | ||||
|  |                             } | ||||
|  |                             self.env['product.template.attribute.line'].create( | ||||
|  |                                 val) | ||||
|  |             elif self.import_file == 'csv': | ||||
|  |                 keys = ['Unique Identifier', 'Name', 'Internal Reference', | ||||
|  |                         'Can be sold', 'Can be Purchased', 'Product Type', | ||||
|  |                         'Category', 'Unit of Measure', | ||||
|  |                         'Purchase Unit of Measure', | ||||
|  |                         'Customer Taxes', 'Vendor Taxes', | ||||
|  |                         'Description for customers', 'Invoicing Policy', | ||||
|  |                         'Sales Price', 'Cost', 'Variant Attributes', | ||||
|  |                         'Attribute Values', 'Internal Reference', 'Barcode', | ||||
|  |                         'Weight', 'Volume', 'Qty On hand', | ||||
|  |                         'Responsible', 'image', 'Char', 'Many2many', 'Many2one', | ||||
|  |                         'Integer'] | ||||
|  |                 try: | ||||
|  |                     files = base64.b64decode(self.file) | ||||
|  |                     data = io.StringIO(files.decode("utf-8")) | ||||
|  |                     data.seek(0) | ||||
|  |                     file_reader = [] | ||||
|  |                     csv_reader = csv.reader(data, delimiter=',') | ||||
|  |                     file_reader.extend(csv_reader) | ||||
|  |                 except: | ||||
|  |                     raise UserError(_("File not Valid")) | ||||
|  |                 for file in range(len(file_reader)): | ||||
|  |                     field = list(map(str, file_reader[file])) | ||||
|  |                     values = dict(zip(keys, field)) | ||||
|  |                     if file >= 1: | ||||
|  |                         pro_categ = self.env['product.category'].search( | ||||
|  |                             [('complete_name', '=', values['Category'])]).id | ||||
|  |                         if pro_categ: | ||||
|  |                             pro_category = pro_categ | ||||
|  |                         else: | ||||
|  |                             category = self.env['product.category'].create({ | ||||
|  |                                 'name': values['Category'] | ||||
|  |                             }) | ||||
|  |                             pro_category = category.id | ||||
|  |                         unit_uom = self.env['uom.uom'].search( | ||||
|  |                             [('name', '=', values['Unit of Measure'])]).id | ||||
|  |                         if unit_uom: | ||||
|  |                             uom = unit_uom | ||||
|  |                         else: | ||||
|  |                             raise UserError(_("Invalid uom")) | ||||
|  |                         po_uoms = self.env['uom.uom'].search( | ||||
|  |                             [('name', '=', | ||||
|  |                               values['Purchase Unit of Measure'])]).id | ||||
|  |                         if po_uoms: | ||||
|  |                             po_uom = po_uoms | ||||
|  |                         else: | ||||
|  |                             raise UserError(_("Invalid Product Uom")) | ||||
|  |                         account_taxs = self.env['account.tax'].search( | ||||
|  |                             [('name', '=', values['Customer Taxes'])]).id | ||||
|  |                         supp_tax = self.env['account.tax'].search( | ||||
|  |                             [('name', '=', values['Vendor Taxes'])]).id | ||||
|  |                         if account_taxs: | ||||
|  |                             tax = account_taxs | ||||
|  |                         else: | ||||
|  |                             account_tax = self.env['account.tax'].create({ | ||||
|  |                                 'name': values['Customer Taxes'].split(' ')[0], | ||||
|  |                                 'amount': values['Customer Taxes'].split(' ')[ | ||||
|  |                                     1], | ||||
|  |                             }) | ||||
|  |                             tax = account_tax.id | ||||
|  |                         if supp_tax: | ||||
|  |                             supplier_tax = supp_tax | ||||
|  |                         else: | ||||
|  |                             supplier_account_tax = self.env[ | ||||
|  |                                 'account.tax'].create({ | ||||
|  |                                 'name': values['Vendor Taxes'].split(' ')[0], | ||||
|  |                                 'amount': values['Vendor Taxes'].split(' ')[1], | ||||
|  |                             }) | ||||
|  |                             supplier_tax = supplier_account_tax.id | ||||
|  |                         kay_val_dict = dict( | ||||
|  |                             self.env['product.template']._fields[ | ||||
|  |                                 'detailed_type'].selection)  # here 'type' is field name | ||||
|  |                         for key, val in kay_val_dict.items(): | ||||
|  |                             if val == values['Product Type']: | ||||
|  |                                 detailed = key | ||||
|  |                         kay_val_dict = dict( | ||||
|  |                             self.env['product.template']._fields[ | ||||
|  |                                 'invoice_policy'].selection)  # here 'type' is field name | ||||
|  |                         for key, val in kay_val_dict.items(): | ||||
|  |                             if val == values['Invoicing Policy']: | ||||
|  |                                 invoicing_type = key | ||||
|  |                         if "http://" in values['image'] or "https://" in values[ | ||||
|  |                             'image']: | ||||
|  |                             link = base64.b64encode(requests.get( | ||||
|  |                                 values['image'].strip()).content).replace(b"\n", | ||||
|  |                                                                           b"") | ||||
|  |                         elif "/home" in values['image']: | ||||
|  |                             if os.path.exists(values['image']): | ||||
|  |                                 with open(values['image'], 'rb') as file_image: | ||||
|  |                                     link = base64.b64encode(file_image.read()) | ||||
|  |                         if file_reader[0][24] or file_reader[0][25] or \ | ||||
|  |                                 file_reader[0][26]: | ||||
|  |                             model = self.env['ir.model']._get_id( | ||||
|  |                                 'product.template') | ||||
|  |                             self.env['ir.model.fields'].create({ | ||||
|  |                                 'model_id': model, | ||||
|  |                                 'name': file_reader[0][24], | ||||
|  |                                 'field_description': | ||||
|  |                                     file_reader[0][24].split('_')[ | ||||
|  |                                         2].upper(), | ||||
|  |                                 'ttype': file_reader[0][24].split('_')[1], | ||||
|  |                             }) | ||||
|  |                             inherit_id = self.env.ref( | ||||
|  |                                 'product.product_template_only_form_view') | ||||
|  |                             arch_base = _('<?xml version="1.0"?>' | ||||
|  |                                           '<data>' | ||||
|  |                                           '<field name="%s" position="%s">' | ||||
|  |                                           '<field name="%s"/>' | ||||
|  |                                           '</field>' | ||||
|  |                                           '</data>') % ( | ||||
|  |                                             'detailed_type', 'after', | ||||
|  |                                             file_reader[0][24]) | ||||
|  |                             self.env['ir.ui.view'].sudo().create( | ||||
|  |                                 {'name': 'product.dynamic.fields', | ||||
|  |                                  'type': 'form', | ||||
|  |                                  'model': 'product.template', | ||||
|  |                                  'mode': 'extension', | ||||
|  |                                  'inherit_id': inherit_id.id, | ||||
|  |                                  'arch_base': arch_base, | ||||
|  |                                  'active': True}) | ||||
|  |                             self.env['ir.model.fields'].create({ | ||||
|  |                                 'model_id': model, | ||||
|  |                                 'name': file_reader[0][25], | ||||
|  |                                 'field_description': | ||||
|  |                                     file_reader[0][25].split('_')[ | ||||
|  |                                         2].upper(), | ||||
|  |                                 'relation': values['Many2many'].split(':')[0], | ||||
|  |                                 'ttype': file_reader[0][25].split('_')[1], | ||||
|  |                             }) | ||||
|  |                             inherit_id = self.env.ref( | ||||
|  |                                 'product.product_template_only_form_view') | ||||
|  |                             arch_base = _('<?xml version="1.0"?>' | ||||
|  |                                           '<data>' | ||||
|  |                                           '<field name="%s" position="%s">' | ||||
|  |                                           '<field name="%s" widget="%s"/>' | ||||
|  |                                           '</field>' | ||||
|  |                                           '</data>') % ( | ||||
|  |                                             'list_price', 'after', | ||||
|  |                                             file_reader[0][25], | ||||
|  |                                             'many2many_tags') | ||||
|  |                             self.env['ir.ui.view'].sudo().create( | ||||
|  |                                 {'name': 'product.many2many.fields', | ||||
|  |                                  'type': 'form', | ||||
|  |                                  'model': 'product.template', | ||||
|  |                                  'mode': 'extension', | ||||
|  |                                  'inherit_id': inherit_id.id, | ||||
|  |                                  'arch_base': arch_base, | ||||
|  |                                  'active': True}) | ||||
|  |                             val = values['Many2many'].split(':')[0] | ||||
|  |                             partner = [ | ||||
|  |                                 values['Many2many'].split(':')[1].split(',')] | ||||
|  |                             vals_many = [] | ||||
|  |                             for part in partner[0]: | ||||
|  |                                 many2many = self.env[val].search( | ||||
|  |                                     [('name', '=', part)]).id | ||||
|  |                                 if many2many: | ||||
|  |                                     vals_many.append(many2many) | ||||
|  |                                 else: | ||||
|  |                                     partner = self.env[val].create({ | ||||
|  |                                         'name': part, | ||||
|  |                                     }) | ||||
|  |                                     vals_many.append(partner) | ||||
|  |                             self.env['ir.model.fields'].create({ | ||||
|  |                                 'model_id': model, | ||||
|  |                                 'name': file_reader[0][26], | ||||
|  |                                 'field_description': | ||||
|  |                                     file_reader[0][26].split('_')[ | ||||
|  |                                         2].upper(), | ||||
|  |                                 'relation': values['Many2one'].split(':')[0], | ||||
|  |                                 'ttype': file_reader[0][26].split('_')[1], | ||||
|  |                             }) | ||||
|  |                             inherit_id = self.env.ref( | ||||
|  |                                 'product.product_template_only_form_view') | ||||
|  |                             arch_base = _('<?xml version="1.0"?>' | ||||
|  |                                           '<data>' | ||||
|  |                                           '<field name="%s" position="%s">' | ||||
|  |                                           '<field name="%s" widget="%s"/>' | ||||
|  |                                           '</field>' | ||||
|  |                                           '</data>') % ( | ||||
|  |                                             'standard_price', 'after', | ||||
|  |                                             file_reader[0][26], | ||||
|  |                                             'many2one_tags') | ||||
|  |                             self.env['ir.ui.view'].sudo().create( | ||||
|  |                                 {'name': 'product.many2one.fields', | ||||
|  |                                  'type': 'form', | ||||
|  |                                  'model': 'product.template', | ||||
|  |                                  'mode': 'extension', | ||||
|  |                                  'inherit_id': inherit_id.id, | ||||
|  |                                  'arch_base': arch_base, | ||||
|  |                                  'active': True}) | ||||
|  |                             many2one = values['Many2one'].split(':')[0] | ||||
|  |                             value = [values['Many2one'].split(':')[1]] | ||||
|  |                             vals_one = [] | ||||
|  |                             for vals in value: | ||||
|  |                                 many2one_value = self.env[many2one].search( | ||||
|  |                                     [('name', '=', vals)]).id | ||||
|  |                                 if many2one_value: | ||||
|  |                                     vals_one.append(many2one_value) | ||||
|  |                                 else: | ||||
|  |                                     value = self.env[many2one].create({ | ||||
|  |                                         'name': vals, | ||||
|  |                                     }) | ||||
|  |                                     vals_one.append(value) | ||||
|  |                             if not values['Internal Reference'] or not values[ | ||||
|  |                                 'Barcode']: | ||||
|  |                                 raise UserError( | ||||
|  |                                     _("File Must  Contain Internal Reference " | ||||
|  |                                       "or Barcode of the Product")) | ||||
|  |                             if self.method == 'update': | ||||
|  |                                 vals = { | ||||
|  |                                     'default_code': values[ | ||||
|  |                                         'Internal Reference'] if | ||||
|  |                                     values['Internal Reference'] else False, | ||||
|  |                                     'name': values['Name'], | ||||
|  |                                     'image_1920': link, | ||||
|  |                                     'sale_ok': values['Can be sold'], | ||||
|  |                                     'purchase_ok': values['Can be Purchased'], | ||||
|  |                                     'detailed_type': detailed, | ||||
|  |                                     'categ_id': pro_category, | ||||
|  |                                     'uom_id': uom, | ||||
|  |                                     'uom_po_id': po_uom, | ||||
|  |                                     'barcode': values['Barcode'] if values[ | ||||
|  |                                         'Barcode'] else False, | ||||
|  |                                     'taxes_id': [tax], | ||||
|  |                                     'supplier_taxes_id': [supplier_tax], | ||||
|  |                                     'description_sale': values[ | ||||
|  |                                         'Description for customers'], | ||||
|  |                                     'invoice_policy': invoicing_type, | ||||
|  |                                     'list_price': values['Sales Price'], | ||||
|  |                                     'standard_price': values['Cost'], | ||||
|  |                                     'weight': values['Weight'], | ||||
|  |                                     'volume': values['Volume'], | ||||
|  |                                 } | ||||
|  |                                 if link: | ||||
|  |                                     vals.update({'image_1920': link}) | ||||
|  |                                 product = self.env[ | ||||
|  |                                     'product.template'].search( | ||||
|  |                                     [('barcode', '=', values['Barcode'])]) | ||||
|  |                                 if len(product): | ||||
|  |                                     product.write(vals) | ||||
|  |                                 else: | ||||
|  |                                     product = self.env[ | ||||
|  |                                         'product.template'].search( | ||||
|  |                                         [('default_code', '=', | ||||
|  |                                           values['Internal Reference'])]) | ||||
|  |                                     if product: | ||||
|  |                                         product.write(vals) | ||||
|  |                                     else: | ||||
|  |                                         raise UserError( | ||||
|  |                                             _("Please ensure that product " | ||||
|  |                                               "having the" | ||||
|  |                                               "contains Internal reference or " | ||||
|  |                                               "Barcode to with your file.")) | ||||
|  |                             elif self.method == 'update_product': | ||||
|  |                                 vals = { | ||||
|  |                                     'default_code': values[ | ||||
|  |                                         'Internal Reference'] if | ||||
|  |                                     values['Internal Reference'] else False, | ||||
|  |                                     'name': values['Name'], | ||||
|  |                                     'image_1920': link, | ||||
|  |                                     'sale_ok': values['Can be sold'], | ||||
|  |                                     'purchase_ok': values['Can be Purchased'], | ||||
|  |                                     'detailed_type': detailed, | ||||
|  |                                     'categ_id': pro_category, | ||||
|  |                                     'uom_id': uom, | ||||
|  |                                     'uom_po_id': po_uom, | ||||
|  |                                     'barcode': values['Barcode'] if values[ | ||||
|  |                                         'Barcode'] else False, | ||||
|  |                                     'taxes_id': [tax], | ||||
|  |                                     'supplier_taxes_id': [supplier_tax], | ||||
|  |                                     'description_sale': values[ | ||||
|  |                                         'Description for customers'], | ||||
|  |                                     'invoice_policy': invoicing_type, | ||||
|  |                                     'lst_price': values['Sales Price'], | ||||
|  |                                     'standard_price': values['Cost'], | ||||
|  |                                     'weight': values['Weight'], | ||||
|  |                                     'volume': values['Volume'], | ||||
|  |                                 } | ||||
|  |                                 if link: | ||||
|  |                                     vals.update({'image_1920': link}) | ||||
|  |                                 product = self.env[ | ||||
|  |                                     'product.product'].search( | ||||
|  |                                     [('barcode', '=', values['Barcode'])]) | ||||
|  |                                 if len(product): | ||||
|  |                                     product.write(vals) | ||||
|  |                                 else: | ||||
|  |                                     product = self.env[ | ||||
|  |                                         'product.product'].search( | ||||
|  |                                         [('default_code', '=', | ||||
|  |                                           values['Internal Reference'])]) | ||||
|  |                                     if product: | ||||
|  |                                         product.write(vals) | ||||
|  |                                     else: | ||||
|  |                                         raise UserError( | ||||
|  |                                             _("Please ensure that product " | ||||
|  |                                               "having the" | ||||
|  |                                               "contains Internal reference or " | ||||
|  |                                               "Barcode to with your file.")) | ||||
|  |                             else: | ||||
|  |                                 product = self.env['product.template'].create( | ||||
|  |                                     vals) | ||||
|  |                                 product.write({ | ||||
|  |                                     file_reader[0][24]: values['Char'], | ||||
|  |                                     file_reader[0][25]: vals_many, | ||||
|  |                                     file_reader[0][26]: vals_one[0], | ||||
|  |                                 }) | ||||
|  |                             attribute_values = [] | ||||
|  |                             for val_attribute in values[ | ||||
|  |                                 'Variant Attributes'].split(','): | ||||
|  |                                 attributes = self.env[ | ||||
|  |                                     'product.attribute'].search( | ||||
|  |                                     [('name', '=', val_attribute)]).id | ||||
|  |                                 if attributes: | ||||
|  |                                     attribute = attributes | ||||
|  |                                 else: | ||||
|  |                                     raise UserError( | ||||
|  |                                         _("Please add a valid attribute and " | ||||
|  |                                           "their values")) | ||||
|  |                                 attribute_values.append( | ||||
|  |                                     {'attribute': attribute}) | ||||
|  |                                 for value in values['Attribute Values'].split( | ||||
|  |                                         ','): | ||||
|  |                                     attri_values = self.env[ | ||||
|  |                                         'product.attribute.value'].search( | ||||
|  |                                         [('attribute_id', '=', attribute), | ||||
|  |                                          ('name', '=', value)]).ids | ||||
|  |                                     if len(attri_values) != 0: | ||||
|  |                                         attribute_values.extend( | ||||
|  |                                             {attri_values[0]}) | ||||
|  |                             variant = {} | ||||
|  |                             mylist = [] | ||||
|  |                             for attribute in attribute_values: | ||||
|  |                                 if isinstance(attribute, dict): | ||||
|  |                                     variant = attribute | ||||
|  |                                     variant['attribut_value'] = [] | ||||
|  |                                 else: | ||||
|  |                                     variant['attribut_value'].extend( | ||||
|  |                                         [attribute]) | ||||
|  |                                 if variant in mylist: | ||||
|  |                                     pass | ||||
|  |                                 else: | ||||
|  |                                     mylist.append(variant) | ||||
|  |                             for list in mylist: | ||||
|  |                                 val = { | ||||
|  |                                     'product_tmpl_id': product.id, | ||||
|  |                                     'attribute_id': list['attribute'], | ||||
|  |                                     'value_ids': list['attribut_value'], | ||||
|  |                                 } | ||||
|  |                                 self.env[ | ||||
|  |                                     'product.template.attribute.line'].create( | ||||
|  |                                     val) | ||||
|  |                             return { | ||||
|  |                                 'type': 'ir.actions.client', | ||||
|  |                                 'tag': 'reload', | ||||
|  |                             } | ||||
|  |         except UserError as e: | ||||
|  |             raise UserError(str(e)) | ||||
| @ -0,0 +1,43 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||
|  | <odoo> | ||||
|  |     <!-- This is used to import the /export the product--> | ||||
|  |     <record id="import_product_variant_action" model="ir.actions.act_window"> | ||||
|  |         <field name="name">Product Variant</field> | ||||
|  |         <field name="type">ir.actions.act_window</field> | ||||
|  |         <field name="res_model">import.product.variant</field> | ||||
|  |         <field name="view_mode">form</field> | ||||
|  |         <field name="target">new</field> | ||||
|  |     </record> | ||||
|  | 
 | ||||
|  |     <record id="import_product_variant_view_form" model="ir.ui.view"> | ||||
|  |         <field name="name">import.product.variant.view.form</field> | ||||
|  |         <field name="model">import.product.variant</field> | ||||
|  |         <field name="type">form</field> | ||||
|  |         <field name="arch" type="xml"> | ||||
|  |             <form> | ||||
|  |                 <sheet> | ||||
|  |                     <group> | ||||
|  |                         <field name="import_file" widget="radio"/> | ||||
|  |                         <field name="method" widget="radio"/> | ||||
|  |                         <field name="file"/> | ||||
|  |                     </group> | ||||
|  |                 </sheet> | ||||
|  |                 <footer> | ||||
|  |                     <button string="Import" type="object" | ||||
|  |                             name="action_import_product_variant" class="btn-primary"/> | ||||
|  |                     <button string="Cancel" special="cancel" | ||||
|  |                             class="btn-secondary"/> | ||||
|  |                 </footer> | ||||
|  |             </form> | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | 
 | ||||
|  |     <!--Import/export wizard menu--> | ||||
|  |     <menuitem id="import_product_variant_menu_action" | ||||
|  |               name="Import Product Variant" | ||||
|  |               parent="stock.menu_stock_inventory_control" | ||||
|  |               action="import_product_variant_action" | ||||
|  |               groups="product_variant_import.product_variant_access" | ||||
|  |               sequence="3"> | ||||
|  |     </menuitem> | ||||
|  | </odoo> | ||||