@ -0,0 +1,46 @@ | 
				
			|||||
 | 
					.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg | 
				
			||||
 | 
					    :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html | 
				
			||||
 | 
					    :alt: License: AGPL-3 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Odoo 3pl Connector | 
				
			||||
 | 
					================= | 
				
			||||
 | 
					Facilitates seamless integration  between Odoo and 3pl for efficient supply chain management. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Configuration | 
				
			||||
 | 
					============= | 
				
			||||
 | 
					* Install openpyxl (pip install openpyxl) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Company | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					License | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) | 
				
			||||
 | 
					(https://www.gnu.org/licenses/agpl-3.0-standalone.html) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Credits | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					Developer: (V16) Unnimaya C O, 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,24 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from . import controllers | 
				
			||||
 | 
					from . import models | 
				
			||||
 | 
					from . import wizard | 
				
			||||
@ -0,0 +1,57 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					    'name': "Odoo 3pl Connector", | 
				
			||||
 | 
					    'version': '16.0.1.0.0', | 
				
			||||
 | 
					    'category': 'Productivity', | 
				
			||||
 | 
					    'summary': """Facilitates seamless integration  between Odoo and 3pl  | 
				
			||||
 | 
					     for efficient supply chain management.""", | 
				
			||||
 | 
					    'description': """Enabling a smooth integration between Odoo and 3pl  | 
				
			||||
 | 
					     streamlines supply chain management for enhanced efficiency. This  | 
				
			||||
 | 
					     integration facilitates seamless coordination, optimizing processes  | 
				
			||||
 | 
					     across the entire supply chain. """, | 
				
			||||
 | 
					    'author': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'company': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'maintainer': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'website': 'https://www.cybrosys.com', | 
				
			||||
 | 
					    'depends': ['stock'], | 
				
			||||
 | 
					    'data': [ | 
				
			||||
 | 
					        'security/ir.model.access.csv', | 
				
			||||
 | 
					        'views/ftp_server_views.xml', | 
				
			||||
 | 
					        'views/stock_warehouse_views.xml', | 
				
			||||
 | 
					        'views/stock_picking_views.xml', | 
				
			||||
 | 
					        'wizard/tpl_operation_views.xml', | 
				
			||||
 | 
					    ], | 
				
			||||
 | 
					    'assets': { | 
				
			||||
 | 
					        'web.assets_backend': [ | 
				
			||||
 | 
					            'odoo_3pl_connector/static/src/js/action_manager.js', | 
				
			||||
 | 
					        ], | 
				
			||||
 | 
					    }, | 
				
			||||
 | 
					    'external_dependencies': { | 
				
			||||
 | 
					        'python': ['openpyxl'] | 
				
			||||
 | 
					    }, | 
				
			||||
 | 
					    'images': ['static/description/banner.jpg'], | 
				
			||||
 | 
					    'license': 'AGPL-3', | 
				
			||||
 | 
					    'installable': True, | 
				
			||||
 | 
					    'auto_install': False, | 
				
			||||
 | 
					    'application': False, | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from . import odoo_3pl_connector | 
				
			||||
@ -0,0 +1,53 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					import json | 
				
			||||
 | 
					from odoo import http | 
				
			||||
 | 
					from odoo.http import content_disposition, request | 
				
			||||
 | 
					from odoo.tools import html_escape | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class XLSXReportController(http.Controller): | 
				
			||||
 | 
					    """Controller for XlsX report""" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route('/xlsx_reports', type='http', auth='public', | 
				
			||||
 | 
					                methods=['POST']) | 
				
			||||
 | 
					    def get_report_xlsx(self, model, options, output_format, report_name): | 
				
			||||
 | 
					        """Function for generating xlsx report""" | 
				
			||||
 | 
					        try: | 
				
			||||
 | 
					            if output_format == 'xlsx': | 
				
			||||
 | 
					                response = request.make_response( | 
				
			||||
 | 
					                    None, | 
				
			||||
 | 
					                    headers=[('Content-Type', 'application/vnd.ms-excel'), | 
				
			||||
 | 
					                             ('Content-Disposition', | 
				
			||||
 | 
					                              content_disposition(report_name + '.xlsx'))] | 
				
			||||
 | 
					                ) | 
				
			||||
 | 
					                request.env[model].sudo().get_xlsx_report(options, response) | 
				
			||||
 | 
					                response.set_cookie('fileToken', 'dummy token') | 
				
			||||
 | 
					                return response | 
				
			||||
 | 
					        except Exception as e: | 
				
			||||
 | 
					            s_error = http.serialize_exception(e) | 
				
			||||
 | 
					            error = { | 
				
			||||
 | 
					                'code': 200, | 
				
			||||
 | 
					                'message': 'Odoo Server Error', | 
				
			||||
 | 
					                'data': s_error | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            return request.make_response(html_escape(json.dumps(error))) | 
				
			||||
@ -0,0 +1 @@ | 
				
			|||||
 | 
					,cybrounnimaya,cybrounnimaya,25.06.2024 09:24,file:///home/cybrounnimaya/.config/libreoffice/4; | 
				
			||||
@ -0,0 +1,6 @@ | 
				
			|||||
 | 
					## Module <odoo_3pl_connector> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					####  19.09.2024 | 
				
			||||
 | 
					#### Version 16.0.1.0.0 | 
				
			||||
 | 
					#### ADD | 
				
			||||
 | 
					- Initial commit for Odoo 3pl Connector | 
				
			||||
@ -0,0 +1,24 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from . import ftp_server | 
				
			||||
 | 
					from . import stock_picking | 
				
			||||
 | 
					from . import stock_warehouse | 
				
			||||
@ -0,0 +1,73 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from ftplib import FTP | 
				
			||||
 | 
					from odoo import api, fields, models | 
				
			||||
 | 
					from odoo.exceptions import ValidationError | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class FtpServer(models.Model): | 
				
			||||
 | 
					    """Model to connect with FTP""" | 
				
			||||
 | 
					    _name = 'ftp.server' | 
				
			||||
 | 
					    _description = 'FTP Server' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    name = fields.Char(string='Name', | 
				
			||||
 | 
					                       help='Name for FTP Server') | 
				
			||||
 | 
					    host = fields.Char(string="Host", | 
				
			||||
 | 
					                       help="Host of FTP server") | 
				
			||||
 | 
					    username = fields.Char(string="Username", | 
				
			||||
 | 
					                           help="Username of FTP server") | 
				
			||||
 | 
					    password = fields.Char(string="Password", | 
				
			||||
 | 
					                           help="Password of FTP server") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.model_create_multi | 
				
			||||
 | 
					    def create(self, vals_list): | 
				
			||||
 | 
					        """Inherited to create directories in FTP""" | 
				
			||||
 | 
					        for vals in vals_list: | 
				
			||||
 | 
					            try: | 
				
			||||
 | 
					                ftp = FTP(vals['host'], vals['username'], | 
				
			||||
 | 
					                          vals['password']) | 
				
			||||
 | 
					                ftp.encoding = "utf-8" | 
				
			||||
 | 
					                for item in ['Export_Sales', 'Export_Sales_Return', | 
				
			||||
 | 
					                             'Export_Purchase', 'Import_Sales', | 
				
			||||
 | 
					                             'Import_Sales_Return', | 
				
			||||
 | 
					                             'Import_Purchase']: | 
				
			||||
 | 
					                    ftp.mkd(item.replace(' ', '_')) | 
				
			||||
 | 
					            except Exception as e: | 
				
			||||
 | 
					                raise ValidationError(f"FTP Connection Error: {str(e)}") | 
				
			||||
 | 
					        return super().create(vals_list) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def unlink(self): | 
				
			||||
 | 
					        """Inherited to removing directories from FTP""" | 
				
			||||
 | 
					        for rec in self: | 
				
			||||
 | 
					            try: | 
				
			||||
 | 
					                ftp = FTP(rec.host, | 
				
			||||
 | 
					                          rec.username, | 
				
			||||
 | 
					                          rec.password) | 
				
			||||
 | 
					                ftp.encoding = "utf-8" | 
				
			||||
 | 
					                for item in ['Export_Sales', 'Export_Sales_Return', | 
				
			||||
 | 
					                             'Export_Purchase', 'Import_Sales', | 
				
			||||
 | 
					                             'Import_Sales_Return', | 
				
			||||
 | 
					                             'Import_Purchase']: | 
				
			||||
 | 
					                    ftp.rmd(item) | 
				
			||||
 | 
					            except Exception as e: | 
				
			||||
 | 
					                raise ValidationError(f"FTP Error: {str(e)}") | 
				
			||||
 | 
					        return super().unlink() | 
				
			||||
@ -0,0 +1,32 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from odoo import fields, models | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class StockPicking(models.Model): | 
				
			||||
 | 
					    """Inherited stock. picking to add 3pl fields""" | 
				
			||||
 | 
					    _inherit = 'stock.picking' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    is_exported = fields.Boolean(string='Exported', readonly=True, | 
				
			||||
 | 
					                                 help="True for exported pickings") | 
				
			||||
 | 
					    is_delivered = fields.Boolean(string='Delivered', readonly=True, | 
				
			||||
 | 
					                                  help="True for delivered pickings") | 
				
			||||
@ -0,0 +1,30 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from odoo import fields, models | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class StockWarehouse(models.Model): | 
				
			||||
 | 
					    """Inherited stock. warehouse to add 3pl fields""" | 
				
			||||
 | 
					    _inherit = 'stock.warehouse' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    server_id = fields.Many2one('ftp.server', string='FTP Server', | 
				
			||||
 | 
					                                help='Choose the FTP Server') | 
				
			||||
		
		
			
  | 
| 
		 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: 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: 144 KiB  | 
| 
		 After Width: | Height: | Size: 257 KiB  | 
| 
		 After Width: | Height: | Size: 88 KiB  | 
| 
		 After Width: | Height: | Size: 147 KiB  | 
| 
		 After Width: | Height: | Size: 146 KiB  | 
| 
		 After Width: | Height: | Size: 74 KiB  | 
| 
		 After Width: | Height: | Size: 50 KiB  | 
| 
		 After Width: | Height: | Size: 168 KiB  | 
| 
		 After Width: | Height: | Size: 53 KiB  | 
| 
		 After Width: | Height: | Size: 163 KiB  | 
| 
		 After Width: | Height: | Size: 40 KiB  | 
| 
		 After Width: | Height: | Size: 56 KiB  | 
| 
		 After Width: | Height: | Size: 55 KiB  | 
| 
		 After Width: | Height: | Size: 61 KiB  | 
| 
		 After Width: | Height: | Size: 64 KiB  | 
| 
		 After Width: | Height: | Size: 77 KiB  | 
| 
		 After Width: | Height: | Size: 161 KiB  | 
| 
		 After Width: | Height: | Size: 300 KiB  | 
| 
		 After Width: | Height: | Size: 84 KiB  | 
| 
		 After Width: | Height: | Size: 16 KiB  | 
@ -0,0 +1,665 @@ | 
				
			|||||
 | 
					<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;"> | 
				
			||||
 | 
					    <!-- TITLE BAR --> | 
				
			||||
 | 
					    <div class="d-flex align-items-center justify-content-between" | 
				
			||||
 | 
					         style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> | 
				
			||||
 | 
					        <img src="assets/misc/cybrosys-logo.png" width="42" height="42" | 
				
			||||
 | 
					             style="width: 42px; height: 42px;"/> | 
				
			||||
 | 
					        <div> | 
				
			||||
 | 
					            <div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | 
				
			||||
 | 
					                 class="mr-2"> | 
				
			||||
 | 
					                <i class="fa fa-check mr-1"></i>Community | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" | 
				
			||||
 | 
					                 class="mr-2"> | 
				
			||||
 | 
					                <i class="fa fa-check mr-1"></i>Enterprise | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <!-- END OF TITLE BAR --> | 
				
			||||
 | 
					    <div class="container"> | 
				
			||||
 | 
					        <div class="row"> | 
				
			||||
 | 
					            <div class="col-sm-12 col-md-12 col-lg-12"> | 
				
			||||
 | 
					                <!-- APP HERO --> | 
				
			||||
 | 
					                <h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> | 
				
			||||
 | 
					                    Odoo 3pl Connector</h1> | 
				
			||||
 | 
					                <p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> | 
				
			||||
 | 
					                    Facilitates seamless integration between Odoo and 3PL for efficient supply chain management. | 
				
			||||
 | 
					                    </p> | 
				
			||||
 | 
					                <!-- END OF APP HERO --> | 
				
			||||
 | 
					                <img src="assets/screenshots/hero.gif" | 
				
			||||
 | 
					                     style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- NAVIGATION SECTION --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> | 
				
			||||
 | 
					    <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/compass.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Explore This | 
				
			||||
 | 
					        Module</h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6 my-3"> | 
				
			||||
 | 
					        <a href="#overview"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-between align-items-center" | 
				
			||||
 | 
					                 style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> | 
				
			||||
 | 
					                    <span | 
				
			||||
 | 
					                            style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">Learn | 
				
			||||
 | 
					                        more about this | 
				
			||||
 | 
					                        module</span> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <img src="assets/misc/right-arrow.png" width="36" height="36"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6 my-3"> | 
				
			||||
 | 
					        <a href="#features"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-between align-items-center" | 
				
			||||
 | 
					                 style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> | 
				
			||||
 | 
					                    <span | 
				
			||||
 | 
					                            style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">View | 
				
			||||
 | 
					                        features of this | 
				
			||||
 | 
					                        module</span> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <img src="assets/misc/right-arrow.png" width="36" height="36"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="col-sm-12 col-md-6 my-3"> | 
				
			||||
 | 
					        <a href="#screenshots"> | 
				
			||||
 | 
					            <div class="d-flex justify-content-between align-items-center" | 
				
			||||
 | 
					                 style="background-color: #f5f5f5; padding: 30px; width: 100%;"> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> | 
				
			||||
 | 
					                    <span | 
				
			||||
 | 
					                            style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33;  display: block;">View | 
				
			||||
 | 
					                        screenshots for this | 
				
			||||
 | 
					                        module</span> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <img src="assets/misc/right-arrow.png" width="36" height="36"/> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF NAVIGATION SECTION --> | 
				
			||||
 | 
					<!-- OVERVIEW SECTION --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> | 
				
			||||
 | 
					    <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/pie-chart.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Overview | 
				
			||||
 | 
					    </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 py-4"> | 
				
			||||
 | 
					        Enabling a smooth integration between Odoo and 3pl | 
				
			||||
 | 
					        streamlines supply chain management for enhanced efficiency. This | 
				
			||||
 | 
					        integration facilitates seamless coordination, optimizing processes | 
				
			||||
 | 
					        across the entire supply chain. | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF OVERVIEW SECTION --> | 
				
			||||
 | 
					<!-- 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 align-items-center" | 
				
			||||
 | 
					             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;">Export Sales, Purchase and Sales Return Transfers</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="d-flex align-items-center" | 
				
			||||
 | 
					             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;">Import Sales, Purchase and Sales Return Transfers</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF FEATURES SECTION --> | 
				
			||||
 | 
					<!-- 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;"> | 
				
			||||
 | 
					                Navigate to FTP Server menu under 3pl Connector in Inventory | 
				
			||||
 | 
					                module.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot1.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;"> | 
				
			||||
 | 
					                Create an FTP Server. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> | 
				
			||||
 | 
					                For testing purpose you can use the credentials provided by the | 
				
			||||
 | 
					                <a href="https://dlptest.com/ftp-test/">DLP Test.</a> | 
				
			||||
 | 
					            </p> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot2.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;"> | 
				
			||||
 | 
					                Navigate to Warehouses menu under Configuration and open any | 
				
			||||
 | 
					                Warehouse. </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot3.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;"> | 
				
			||||
 | 
					                Choose the FTP Server. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot4.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;"> | 
				
			||||
 | 
					                Navigate to Operations menu under 3pl Connector. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot5.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;"> | 
				
			||||
 | 
					                Execute the Operation. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> | 
				
			||||
 | 
					                Select the Warehouse. Choose the operation as Export and Choose | 
				
			||||
 | 
					                the Items to Export/ Import. Then click EXECUTE. | 
				
			||||
 | 
					            </p> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot6.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;"> | 
				
			||||
 | 
					                Connect to FTP Server using any external software. Here we are | 
				
			||||
 | 
					                using Filezilla. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot9.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;"> | 
				
			||||
 | 
					                Open Export_Sales directory and right-click on the file and | 
				
			||||
 | 
					                click download. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot9.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 the file. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> | 
				
			||||
 | 
					                The specifics of the delivered product can be transferred to the | 
				
			||||
 | 
					                Import Folders. In this instance, I transferred the Excel file | 
				
			||||
 | 
					                from my local system to the Import_Sales folder by | 
				
			||||
 | 
					                right-clicking on the file on the left side and selecting the | 
				
			||||
 | 
					                Upload button. | 
				
			||||
 | 
					            </p> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot10.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 Operation. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> | 
				
			||||
 | 
					                Access the Operations menu and choose the Warehouse option. Opt for the Import Operation and then select the Items to Import/ Export. | 
				
			||||
 | 
					            </p> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot11.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;"> | 
				
			||||
 | 
					                Open any imported Transfer. It will be marked as Delivered. | 
				
			||||
 | 
					            </h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/Screenshot12.png" | 
				
			||||
 | 
					                 class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF SCREENSHOTS SECTION --> | 
				
			||||
 | 
					<!-- RELATED PRODUCTS --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <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/categories.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Related | 
				
			||||
 | 
					        Products | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="row"> | 
				
			||||
 | 
					    <div class="col-sm-12"> | 
				
			||||
 | 
					        <div id="demo1" class="row carousel slide" data-ride="carousel"> | 
				
			||||
 | 
					            <!-- The slideshow --> | 
				
			||||
 | 
					            <div class="carousel-inner" style="padding: 30px;"> | 
				
			||||
 | 
					                <div class="carousel-item" style="min-height: 198.656px;"> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/upcitemdb_integration/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/l1.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/16.0/education_erp_dashboard/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/l2.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/16.0/agriculture_management_odoo/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/l3.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="carousel-item active" | 
				
			||||
 | 
					                     style="min-height: 198.656px;"> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/16.0/product_image_suggestion/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/l4.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/16.0/odoo_magento_2_4_5/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/l5.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/16.0/advanced_dynamic_dashboard/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-radius: 0px;" | 
				
			||||
 | 
					                                     src="assets/modules/l6.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <!-- Left and right controls --> | 
				
			||||
 | 
					            <a class="carousel-control-prev" href="#demo1" data-slide="prev" | 
				
			||||
 | 
					               style="width:35px; color:#000"> <span | 
				
			||||
 | 
					                    class="carousel-control-prev-icon"><i | 
				
			||||
 | 
					                    class="fa fa-chevron-left" | 
				
			||||
 | 
					                    style="font-size:24px"></i></span> | 
				
			||||
 | 
					            </a> <a class="carousel-control-next" href="#demo1" | 
				
			||||
 | 
					                    data-slide="next" style="width:35px; color:#000"> | 
				
			||||
 | 
					                <span class="carousel-control-next-icon"><i | 
				
			||||
 | 
					                        class="fa fa-chevron-right" | 
				
			||||
 | 
					                        style="font-size:24px"></i></span> | 
				
			||||
 | 
					        </a> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF RELATED PRODUCTS --> | 
				
			||||
 | 
					<!-- OUR SERVICES --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <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/star.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Our Services | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="container my-5"> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <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> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!--END OF OUR SERVICES --> | 
				
			||||
 | 
					<!-- OUR INDUSTRIES --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <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/corporate.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Our | 
				
			||||
 | 
					        Industries | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="container my-5"> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-lg-3"> | 
				
			||||
 | 
					            <div class="my-4 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					                 style="background-color: #f6f8f9 !important; border-radius: 0px; 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: 0px; 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: 0px; 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: 0px; 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: 0px; 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: 0px; 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: 0px; 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: 0px; 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> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!--  END OF OUR INDUSTRIES --> | 
				
			||||
 | 
					<!-- SUPPORT --> | 
				
			||||
 | 
					<div class="d-flex align-items-center" | 
				
			||||
 | 
					     style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> | 
				
			||||
 | 
					    <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/customer-support.png"/> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <h2 class="mt-2" | 
				
			||||
 | 
					        style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | 
				
			||||
 | 
					        Support | 
				
			||||
 | 
					    </h2> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<div class="container mt-5"> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-sm-12 col-md-6"> | 
				
			||||
 | 
					            <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> | 
				
			||||
 | 
					                <div class="mr-4" | 
				
			||||
 | 
					                     style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> | 
				
			||||
 | 
					                    <img src="assets/misc/support.png" height="48" width="48" | 
				
			||||
 | 
					                         style="width: 42px; height: 42px;"/> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <h4>Need Help?</h4> | 
				
			||||
 | 
					                    <p style="line-height: 100%;">Got questions or need help? | 
				
			||||
 | 
					                        Get in touch.</p> | 
				
			||||
 | 
					                    <a href="mailto:odoo@cybrosys.com"> | 
				
			||||
 | 
					                        <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> | 
				
			||||
 | 
					                            odoo@cybrosys.com</p> | 
				
			||||
 | 
					                    </a> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					        <div class="col-sm-12 col-md-6"> | 
				
			||||
 | 
					            <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> | 
				
			||||
 | 
					                <div class="mr-4" | 
				
			||||
 | 
					                     style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> | 
				
			||||
 | 
					                    <img src="assets/misc/whatsapp.png" height="52" width="52" | 
				
			||||
 | 
					                         style="width: 52px; height: 52px;"/> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div> | 
				
			||||
 | 
					                    <h4>WhatsApp</h4> | 
				
			||||
 | 
					                    <p style="line-height: 100%;">Say hi to us on WhatsApp!</p> | 
				
			||||
 | 
					                    <a href="https://api.whatsapp.com/send?phone=918606827707"> | 
				
			||||
 | 
					                        <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> | 
				
			||||
 | 
					                            +91 86068 | 
				
			||||
 | 
					                            27707</p> | 
				
			||||
 | 
					                    </a> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <div class="row"> | 
				
			||||
 | 
					        <div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> | 
				
			||||
 | 
					            <img src="assets/misc/logo.png" width="144" height="31" | 
				
			||||
 | 
					                 style="width:144px; height: 31px; margin-top: 40px;"/> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF SUPPORT --> | 
				
			||||
@ -0,0 +1,19 @@ | 
				
			|||||
 | 
					/* @odoo-module */ | 
				
			||||
 | 
					import { registry } from "@web/core/registry"; | 
				
			||||
 | 
					import { download } from "@web/core/network/download"; | 
				
			||||
 | 
					import framework from 'web.framework'; | 
				
			||||
 | 
					import session from 'web.session'; | 
				
			||||
 | 
					registry.category("ir.actions.report handlers").add("xlsx", async (action) => { | 
				
			||||
 | 
					   if (action.report_type === 'xlsx') { | 
				
			||||
 | 
					       framework.blockUI(); | 
				
			||||
 | 
					       var def = $.Deferred(); | 
				
			||||
 | 
					       //Revoke controller for generating Excel report.
 | 
				
			||||
 | 
					       session.get_file({ | 
				
			||||
 | 
					           url: '/xlsx_reports', | 
				
			||||
 | 
					           data: action.data, | 
				
			||||
 | 
					           success: def.resolve.bind(def), | 
				
			||||
 | 
					           complete: framework.unblockUI, | 
				
			||||
 | 
					       }); | 
				
			||||
 | 
					       return def; | 
				
			||||
 | 
					   } | 
				
			||||
 | 
					}); | 
				
			||||
@ -0,0 +1,49 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!--    Ftp Server Form View--> | 
				
			||||
 | 
					    <record id="ftp_server_view_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">ftp.server.view.form</field> | 
				
			||||
 | 
					        <field name="model">ftp.server</field> | 
				
			||||
 | 
					        <field name="priority" eval="20"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <form> | 
				
			||||
 | 
					                <sheet name="Ftp Server"> | 
				
			||||
 | 
					                    <group> | 
				
			||||
 | 
					                        <group> | 
				
			||||
 | 
					                            <field name="name"/> | 
				
			||||
 | 
					                            <field name="host"/> | 
				
			||||
 | 
					                        </group> | 
				
			||||
 | 
					                        <group> | 
				
			||||
 | 
					                            <field name="username"/> | 
				
			||||
 | 
					                            <field name="password" password="True"/> | 
				
			||||
 | 
					                        </group> | 
				
			||||
 | 
					                    </group> | 
				
			||||
 | 
					                </sheet> | 
				
			||||
 | 
					            </form> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					    <!--    Ftp Server Tree View--> | 
				
			||||
 | 
					    <record id="ftp_server_view_tree" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">ftp.server.view.tree</field> | 
				
			||||
 | 
					        <field name="model">ftp.server</field> | 
				
			||||
 | 
					        <field name="priority" eval="20"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <tree> | 
				
			||||
 | 
					                <field name="name"/> | 
				
			||||
 | 
					                <field name="username"/> | 
				
			||||
 | 
					            </tree> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					    <!--    Ftp server action--> | 
				
			||||
 | 
					    <record id="ftp_server_action" model="ir.actions.act_window"> | 
				
			||||
 | 
					        <field name="name">FTP Server</field> | 
				
			||||
 | 
					        <field name="res_model">ftp.server</field> | 
				
			||||
 | 
					        <field name="view_mode">tree,form</field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					    <!--    3pl Connector Menu--> | 
				
			||||
 | 
					    <menuitem id="3pl_connector_menu" name="3pl Connector" | 
				
			||||
 | 
					              parent="stock.menu_stock_root"/> | 
				
			||||
 | 
					    <!--    Ftp Server Menu--> | 
				
			||||
 | 
					    <menuitem id="ftp_server_menu" name="FTP Server" | 
				
			||||
 | 
					              parent="3pl_connector_menu" action="ftp_server_action"/> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,30 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!--    Inherited  stock picking form view to add 3pl fields--> | 
				
			||||
 | 
					    <record id="view_picking_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field | 
				
			||||
 | 
					                name="name">stock.picking.view.form.inherit.odoo.3pl.connector | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					        <field name="model">stock.picking</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="stock.view_picking_form"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//field[@name='picking_type_id']" position="after"> | 
				
			||||
 | 
					                                            <field name="is_exported"/> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					     <!--    Inherited  stock picking tree view to add 3pl fields--> | 
				
			||||
 | 
					    <record id="vpicktree" model="ir.ui.view"> | 
				
			||||
 | 
					        <field | 
				
			||||
 | 
					                name="name">stock.picking.view.tree.inherit.odoo.3pl.connector | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					        <field name="model">stock.picking</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="stock.vpicktree"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//field[@name='company_id']" position="after"> | 
				
			||||
 | 
					                                            <field name="is_exported"/> | 
				
			||||
 | 
					                                            <field name="is_delivered"/> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,16 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!--    Inherited  stock warehouse form view to add 3pl fields--> | 
				
			||||
 | 
					    <record id="view_warehouse" model="ir.ui.view"> | 
				
			||||
 | 
					        <field | 
				
			||||
 | 
					                name="name">stock.warehouse.view.form.inherit.odoo.3pl.connector | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					        <field name="model">stock.warehouse</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="stock.view_warehouse"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//field[@name='code']" position="after"> | 
				
			||||
 | 
					                <field name="server_id"/> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from . import tpl_operation | 
				
			||||
@ -0,0 +1,270 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Unnimaya C O (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					import io | 
				
			||||
 | 
					import json | 
				
			||||
 | 
					import os | 
				
			||||
 | 
					import openpyxl | 
				
			||||
 | 
					import xlsxwriter | 
				
			||||
 | 
					from ftplib import FTP | 
				
			||||
 | 
					from odoo import api, fields, models, _ | 
				
			||||
 | 
					from odoo.exceptions import ValidationError | 
				
			||||
 | 
					from odoo.tools import date_utils | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class TplOperation(models.TransientModel): | 
				
			||||
 | 
					    """Model for performing the tpl operations""" | 
				
			||||
 | 
					    _name = 'tpl.operation' | 
				
			||||
 | 
					    _description = 'Tpl Operation' | 
				
			||||
 | 
					    _rec_name = 'warehouse_id' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    export = fields.Selection([ | 
				
			||||
 | 
					        ('sales', 'Sales'), | 
				
			||||
 | 
					        ('return', 'Sales Return'), | 
				
			||||
 | 
					        ('purchase', 'Purchase')], | 
				
			||||
 | 
					        string='Items to Export/ Import', | 
				
			||||
 | 
					        default='sales', required=True, | 
				
			||||
 | 
					        help='Select the items to import/export') | 
				
			||||
 | 
					    warehouse_id = fields.Many2one('stock.warehouse', | 
				
			||||
 | 
					                                   string="Warehouse", | 
				
			||||
 | 
					                                   help="Select the warehouse for the " | 
				
			||||
 | 
					                                        "operations", required=1) | 
				
			||||
 | 
					    operation = fields.Selection([('export', 'Export'), | 
				
			||||
 | 
					                                  ('import', 'Import')], | 
				
			||||
 | 
					                                 default='import', | 
				
			||||
 | 
					                                 string='Operation', help='The operation which ' | 
				
			||||
 | 
					                                                          'you want to perform') | 
				
			||||
 | 
					    picking_ids = fields.Many2many('stock.picking', | 
				
			||||
 | 
					                                   string='Sales Picking', | 
				
			||||
 | 
					                                   help='All the sales pickings which are not ' | 
				
			||||
 | 
					                                        'exported yet.') | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.onchange('export') | 
				
			||||
 | 
					    def _onchange_export(self): | 
				
			||||
 | 
					        """Method for calling bind_data() while changing the value of field | 
				
			||||
 | 
					         export""" | 
				
			||||
 | 
					        self.bind_data() | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def bind_data(self): | 
				
			||||
 | 
					        """Method for binding data to the one2many field""" | 
				
			||||
 | 
					        if self.operation == 'export': | 
				
			||||
 | 
					            if self.export == 'sales': | 
				
			||||
 | 
					                domain = 'WH-DELIVERY' | 
				
			||||
 | 
					            elif self.export == 'return': | 
				
			||||
 | 
					                domain = 'WH-RETURNS' | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                domain = 'WH-RECEIPTS' | 
				
			||||
 | 
					            self.picking_ids = ( | 
				
			||||
 | 
					                self.env['stock.picking'].search([('state', '=', 'assigned'), | 
				
			||||
 | 
					                                                  ('is_exported', '=', False)]). | 
				
			||||
 | 
					                filtered( | 
				
			||||
 | 
					                    lambda x: x.picking_type_id.barcode == domain)) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_execute(self): | 
				
			||||
 | 
					        """Execute button action""" | 
				
			||||
 | 
					        if self.operation == 'export' and self.picking_ids: | 
				
			||||
 | 
					            if not self.warehouse_id.server_id: | 
				
			||||
 | 
					                raise ValidationError(_('3PL not configured for selected ' | 
				
			||||
 | 
					                                        'warehouse.')) | 
				
			||||
 | 
					            picking_list = self.env['stock.move.line'].search_read( | 
				
			||||
 | 
					                domain=[('picking_id', 'in', self.picking_ids.ids)], | 
				
			||||
 | 
					                fields=[ | 
				
			||||
 | 
					                    'picking_id', | 
				
			||||
 | 
					                    'product_id', | 
				
			||||
 | 
					                    'reserved_qty', | 
				
			||||
 | 
					                    'picking_partner_id', | 
				
			||||
 | 
					                ]) | 
				
			||||
 | 
					            for item in picking_list: | 
				
			||||
 | 
					                if item['picking_partner_id']: | 
				
			||||
 | 
					                    partner = self.env['res.partner'].search_read( | 
				
			||||
 | 
					                        domain=[('id', '=', item['picking_partner_id'][0])], | 
				
			||||
 | 
					                        fields=[ | 
				
			||||
 | 
					                            'street', | 
				
			||||
 | 
					                            'street2', | 
				
			||||
 | 
					                            'zip', | 
				
			||||
 | 
					                            'city', | 
				
			||||
 | 
					                            'state_id', | 
				
			||||
 | 
					                            'country_id', | 
				
			||||
 | 
					                            'email', | 
				
			||||
 | 
					                            'phone', | 
				
			||||
 | 
					                            'mobile' | 
				
			||||
 | 
					                        ]) | 
				
			||||
 | 
					                    for rec in partner[0].keys(): | 
				
			||||
 | 
					                        if rec != 'id': | 
				
			||||
 | 
					                            item[rec] = partner[0][rec] | 
				
			||||
 | 
					            transfer_dict = {'sales': 'Export_Sales', | 
				
			||||
 | 
					                             'return': 'Export_Sales_Return', | 
				
			||||
 | 
					                             'purchase': 'Export_Purchase'} | 
				
			||||
 | 
					            return { | 
				
			||||
 | 
					                'type': 'ir.actions.report', | 
				
			||||
 | 
					                'data': { | 
				
			||||
 | 
					                    'model': 'tpl.operation', | 
				
			||||
 | 
					                    'output_format': 'xlsx', | 
				
			||||
 | 
					                    'report_name': 'Excel Report', | 
				
			||||
 | 
					                    'options': json.dumps({ | 
				
			||||
 | 
					                        'warehouse_id': self.warehouse_id.id, | 
				
			||||
 | 
					                        'picking_list': picking_list, | 
				
			||||
 | 
					                        'transfer': transfer_dict[self.export] | 
				
			||||
 | 
					                    }, default=date_utils.json_default) | 
				
			||||
 | 
					                }, | 
				
			||||
 | 
					                'report_type': 'xlsx', | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        if self.operation == 'import': | 
				
			||||
 | 
					            ftp = FTP(self.warehouse_id.server_id.host, | 
				
			||||
 | 
					                      self.warehouse_id.server_id.username, | 
				
			||||
 | 
					                      self.warehouse_id.server_id.password) | 
				
			||||
 | 
					            try: | 
				
			||||
 | 
					                ftp.encoding = "utf-8" | 
				
			||||
 | 
					                transfer_dict = {'sales': 'Import_Sales', | 
				
			||||
 | 
					                                 'return': 'Import_Sales_Return', | 
				
			||||
 | 
					                                 'purchase': 'Import_Purchase'} | 
				
			||||
 | 
					                local_filepath = os.path.normpath( | 
				
			||||
 | 
					                    os.path.join(os.path.dirname(os.path.abspath(__file__)), | 
				
			||||
 | 
					                                 "..", "demo", | 
				
			||||
 | 
					                                 "imported_report.xlsx") | 
				
			||||
 | 
					                ) | 
				
			||||
 | 
					                ftp.cwd('/' + transfer_dict[self.export]) | 
				
			||||
 | 
					                for remote_file in ftp.nlst(): | 
				
			||||
 | 
					                    with open(local_filepath, 'wb') as local_file: | 
				
			||||
 | 
					                        ftp.retrbinary(f"RETR {remote_file}", | 
				
			||||
 | 
					                                       local_file.write) | 
				
			||||
 | 
					                    workbook = openpyxl.load_workbook(local_filepath) | 
				
			||||
 | 
					                    sheet = workbook['Sheet1'] | 
				
			||||
 | 
					                    for row in sheet.iter_rows(min_row=2, values_only=True): | 
				
			||||
 | 
					                        picking = self.env['stock.picking'].search( | 
				
			||||
 | 
					                            [('name', '=', row[0])]) | 
				
			||||
 | 
					                        if picking: | 
				
			||||
 | 
					                            picking.action_confirm() | 
				
			||||
 | 
					                            picking.action_assign() | 
				
			||||
 | 
					                            picking.move_ids._set_quantities_to_reservation() | 
				
			||||
 | 
					                            picking.button_validate() | 
				
			||||
 | 
					                            picking.sudo().write({ | 
				
			||||
 | 
					                                'state':'done', | 
				
			||||
 | 
					                                'is_delivered': True | 
				
			||||
 | 
					                            }) | 
				
			||||
 | 
					                    ftp.delete(remote_file) | 
				
			||||
 | 
					                self.bind_data() | 
				
			||||
 | 
					                return {'type': 'ir.actions.act_window_close'} | 
				
			||||
 | 
					            except Exception as e: | 
				
			||||
 | 
					                raise ValidationError(f"An Error occurred: {str(e)}") | 
				
			||||
 | 
					            finally: | 
				
			||||
 | 
					                ftp.quit() | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def get_xlsx_report(self, data, response): | 
				
			||||
 | 
					        """Organizing xlsx report""" | 
				
			||||
 | 
					        data = json.loads(data) | 
				
			||||
 | 
					        output = io.BytesIO() | 
				
			||||
 | 
					        workbook = xlsxwriter.Workbook(output, {'in_memory': True}) | 
				
			||||
 | 
					        sheet = workbook.add_worksheet() | 
				
			||||
 | 
					        cell_format = workbook.add_format( | 
				
			||||
 | 
					            {'font_size': '14', 'bold': True, 'align': 'center', | 
				
			||||
 | 
					             'valign': 'center', 'border': True}) | 
				
			||||
 | 
					        body = workbook.add_format( | 
				
			||||
 | 
					            {'align': 'left', 'text_wrap': True, 'border': True}) | 
				
			||||
 | 
					        body_right = workbook.add_format( | 
				
			||||
 | 
					            {'align': 'right', 'text_wrap': True, 'border': True}) | 
				
			||||
 | 
					        sheet.set_column('A1:A2', 18) | 
				
			||||
 | 
					        sheet.set_column('B1:B2', 50) | 
				
			||||
 | 
					        sheet.set_column('C1:C2', 12) | 
				
			||||
 | 
					        sheet.set_column('D1:M1', 18) | 
				
			||||
 | 
					        sheet.set_row(0, 20) | 
				
			||||
 | 
					        sheet.set_row(1, 20) | 
				
			||||
 | 
					        sheet.merge_range('A1:A2', 'Reference', cell_format) | 
				
			||||
 | 
					        sheet.merge_range('B1:B2', 'Product', cell_format) | 
				
			||||
 | 
					        sheet.merge_range('C1:C2', 'Quantity', cell_format) | 
				
			||||
 | 
					        sheet.write('D2', 'Delivery Name', cell_format) | 
				
			||||
 | 
					        sheet.merge_range('D1:M1', 'Delivery', cell_format) | 
				
			||||
 | 
					        sheet.write('E2', 'Street', cell_format) | 
				
			||||
 | 
					        sheet.write('F2', 'Street2', cell_format) | 
				
			||||
 | 
					        sheet.write('G2', 'City', cell_format) | 
				
			||||
 | 
					        sheet.write('H2', 'State', cell_format) | 
				
			||||
 | 
					        sheet.write('I2', 'Country', cell_format) | 
				
			||||
 | 
					        sheet.write('J2', 'Zip', cell_format) | 
				
			||||
 | 
					        sheet.write('K2', 'Email', cell_format) | 
				
			||||
 | 
					        sheet.write('L2', 'Phone', cell_format) | 
				
			||||
 | 
					        sheet.write('M2', 'Mobile', cell_format) | 
				
			||||
 | 
					        row = 2 | 
				
			||||
 | 
					        column = 0 | 
				
			||||
 | 
					        for item in data['picking_list']: | 
				
			||||
 | 
					            sheet.write(row, column, item['picking_id'][1], body) | 
				
			||||
 | 
					            sheet.write(row, column + 1, item['product_id'][1], body) | 
				
			||||
 | 
					            sheet.write(row, column + 2, | 
				
			||||
 | 
					                        "{:.2f}".format(int(item['reserved_qty'])), body_right) | 
				
			||||
 | 
					            sheet.write(row, column + 3, item['picking_partner_id'][1], | 
				
			||||
 | 
					                        body) if item['picking_partner_id'] else ( | 
				
			||||
 | 
					                sheet.write(row, column + 3, " ", body)) | 
				
			||||
 | 
					            sheet.write(row, column + 4, item['street'], | 
				
			||||
 | 
					                        body) if 'street' in item.keys() and item['street'] \ | 
				
			||||
 | 
					                else sheet.write(row, column + 4, " ", body) | 
				
			||||
 | 
					            sheet.write(row, column + 5, item['street2'], | 
				
			||||
 | 
					                        body) if 'street2' in item.keys() and item['street2'] \ | 
				
			||||
 | 
					                else sheet.write(row, column + 5, " ", body) | 
				
			||||
 | 
					            sheet.write(row, column + 6, item['city'], | 
				
			||||
 | 
					                        body) if 'city' in item.keys() and item['city'] else ( | 
				
			||||
 | 
					                sheet.write(row, column + 6, " ", body)) | 
				
			||||
 | 
					            sheet.write(row, column + 7, item['state_id'][1], | 
				
			||||
 | 
					                        body) if ('state_id' in item.keys() and | 
				
			||||
 | 
					                                  item['state_id']) else ( | 
				
			||||
 | 
					                sheet.write(row, column + 7, " ", body)) | 
				
			||||
 | 
					            sheet.write(row, column + 8, item['country_id'][1], | 
				
			||||
 | 
					                        body) if ('country_id' in item.keys() and | 
				
			||||
 | 
					                                  item['country_id']) else ( | 
				
			||||
 | 
					                sheet.write(row, column + 8, " ", body)) | 
				
			||||
 | 
					            sheet.write(row, column + 9, item['zip'], | 
				
			||||
 | 
					                        body) if ('zip' in item.keys() and item['zip']) else ( | 
				
			||||
 | 
					                sheet.write(row, column + 9, " ", body)) | 
				
			||||
 | 
					            sheet.write(row, column + 10, item['email'], | 
				
			||||
 | 
					                        body) if ('email' in item.keys() and item['email']) \ | 
				
			||||
 | 
					                else sheet.write(row, column + 10, " ", body) | 
				
			||||
 | 
					            sheet.write(row, column + 11, item['phone'], | 
				
			||||
 | 
					                        body) if ('phone' in item.keys() and item['phone']) \ | 
				
			||||
 | 
					                else sheet.write(row, column + 11, " ", body) | 
				
			||||
 | 
					            sheet.write(row, column + 12, item['mobile'], | 
				
			||||
 | 
					                        body) if ('mobile' in item.keys() and item['mobile']) \ | 
				
			||||
 | 
					                else sheet.write(row, column + 12, " ", body) | 
				
			||||
 | 
					            row = row + 1 | 
				
			||||
 | 
					        workbook.close() | 
				
			||||
 | 
					        remote_file = (data['transfer'] + '/exported_report_' + | 
				
			||||
 | 
					                       fields.Datetime.now( | 
				
			||||
 | 
					                       ).strftime("%Y_%m_%d_%H_%M_%S_%f")[:-3] + '.xlsx') | 
				
			||||
 | 
					        try: | 
				
			||||
 | 
					            server = self.env['stock.warehouse'].browse( | 
				
			||||
 | 
					                int(data['warehouse_id'])).server_id | 
				
			||||
 | 
					            if not server: | 
				
			||||
 | 
					                ValidationError(_('3PL not configured for the Warehouse')) | 
				
			||||
 | 
					            ftp = FTP(server.host, server.username, | 
				
			||||
 | 
					                      server.password) | 
				
			||||
 | 
					            ftp.encoding = "utf-8" | 
				
			||||
 | 
					            local_filepath = os.path.normpath(os.path.join( | 
				
			||||
 | 
					                os.path.dirname(os.path.abspath(__file__)), "..", "demo", | 
				
			||||
 | 
					                "imported_report.xlsx")) | 
				
			||||
 | 
					            with open(local_filepath, 'wb') as temp_file: | 
				
			||||
 | 
					                temp_file.write(output.getvalue()) | 
				
			||||
 | 
					            with open(local_filepath, 'rb') as file: | 
				
			||||
 | 
					                ftp.storbinary(f'STOR {remote_file}', file) | 
				
			||||
 | 
					            output.seek(0) | 
				
			||||
 | 
					            response.stream.write(output.read()) | 
				
			||||
 | 
					            output.close() | 
				
			||||
 | 
					            for item in data['picking_list']: | 
				
			||||
 | 
					                self.env['stock.picking'].browse( | 
				
			||||
 | 
					                    item['picking_id'][0]).write({'is_exported': True}) | 
				
			||||
 | 
					        except Exception as e: | 
				
			||||
 | 
					            raise ValidationError(f"An error occurred: {e}") | 
				
			||||
@ -0,0 +1,58 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="UTF-8" ?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!--    Tpl Operation Connector form view--> | 
				
			||||
 | 
					    <record id="tpl_operation_view_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">tpl.operation.view.form</field> | 
				
			||||
 | 
					        <field name="model">tpl.operation</field> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <form create="0"> | 
				
			||||
 | 
					                <sheet> | 
				
			||||
 | 
					                    <group> | 
				
			||||
 | 
					                        <field name="warehouse_id" | 
				
			||||
 | 
					                               options="{'no_create': True, | 
				
			||||
 | 
					                                   'no_create_edit':True}"/> | 
				
			||||
 | 
					                        <field name="operation" widget="radio"/> | 
				
			||||
 | 
					                        <field name="export"/> | 
				
			||||
 | 
					                    </group> | 
				
			||||
 | 
					                    <group | 
				
			||||
 | 
					                            attrs="{'invisible': [('operation', '!=', 'export')]}"> | 
				
			||||
 | 
					                        <field name="picking_ids" string=""> | 
				
			||||
 | 
					                            <tree create="0" options="{'no_create_edit': True}"> | 
				
			||||
 | 
					                                <field name="name"/> | 
				
			||||
 | 
					                                <field name="location_id"/> | 
				
			||||
 | 
					                                <field name="location_dest_id"/> | 
				
			||||
 | 
					                                <field name="partner_id"/> | 
				
			||||
 | 
					                                <field name="scheduled_date"/> | 
				
			||||
 | 
					                                <field name="origin"/> | 
				
			||||
 | 
					                                <field name="state"/> | 
				
			||||
 | 
					                            </tree> | 
				
			||||
 | 
					                        </field> | 
				
			||||
 | 
					                    </group> | 
				
			||||
 | 
					                    <footer> | 
				
			||||
 | 
					                        <button string="Execute" class="oe_highlight" | 
				
			||||
 | 
					                                type="object" name="action_execute"/> | 
				
			||||
 | 
					                        <button string="Cancel" special="cancel" | 
				
			||||
 | 
					                                class="btn btn-secondary"/> | 
				
			||||
 | 
					                    </footer> | 
				
			||||
 | 
					                </sheet> | 
				
			||||
 | 
					            </form> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					    <!--    Operations menu action--> | 
				
			||||
 | 
					    <record id="tpl_operation_action" model="ir.actions.act_window"> | 
				
			||||
 | 
					        <field name="name">Operations</field> | 
				
			||||
 | 
					        <field name="type">ir.actions.act_window</field> | 
				
			||||
 | 
					        <field name="res_model">tpl.operation</field> | 
				
			||||
 | 
					        <field name="view_mode">form</field> | 
				
			||||
 | 
					        <field name="view_id" ref="tpl_operation_view_form"/> | 
				
			||||
 | 
					        <field name="target">new</field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					    <!--    Operations menu--> | 
				
			||||
 | 
					    <menuitem | 
				
			||||
 | 
					            id="tpl_operation_menu" | 
				
			||||
 | 
					            name="Operations" | 
				
			||||
 | 
					            parent="3pl_connector_menu" | 
				
			||||
 | 
					            sequence="1" | 
				
			||||
 | 
					            action="tpl_operation_action" | 
				
			||||
 | 
					    /> | 
				
			||||
 | 
					</odoo> | 
				
			||||