@ -0,0 +1,44 @@ | 
				
			|||||
 | 
					.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg | 
				
			||||
 | 
					    :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html | 
				
			||||
 | 
					    :alt: License: AGPL-3 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Multi Product Return From Website | 
				
			||||
 | 
					================================= | 
				
			||||
 | 
					* Manage Sale Order return from Website and can see in backend and manage return orders. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Configuration | 
				
			||||
 | 
					============= | 
				
			||||
 | 
					* No additional configuration required | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Company | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					`Cybrosys Techno Solutions <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					License | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					Affero General Public License, version 3 (AGPL v3). | 
				
			||||
 | 
					(https://www.gnu.org/licenses/agpl-3.0-standalone.html) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Credits | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					Developer: (V15) Bhagyadev kp, Contact: odoo@cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Contacts | 
				
			||||
 | 
					-------- | 
				
			||||
 | 
					* Mail Contact : odoo@cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Bug Tracker | 
				
			||||
 | 
					----------- | 
				
			||||
 | 
					Bugs are tracked on GitHub Issues. In case of trouble, please check there | 
				
			||||
 | 
					if your issue has already been reported. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Maintainer | 
				
			||||
 | 
					========== | 
				
			||||
 | 
					.. image:: https://cybrosys.com/images/logo.png | 
				
			||||
 | 
					   :target: https://cybrosys.com | 
				
			||||
 | 
					This module is maintained by Cybrosys Technologies. | 
				
			||||
 | 
					For support and more information, please visit https://www.cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Further information | 
				
			||||
 | 
					=================== | 
				
			||||
 | 
					HTML Description: `<static/description/index.html>`__ | 
				
			||||
@ -0,0 +1,22 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 models | 
				
			||||
 | 
					from . import controllers | 
				
			||||
@ -0,0 +1,54 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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': 'Multi Product Return From Website', | 
				
			||||
 | 
					    'version': '15.0.1.0.0', | 
				
			||||
 | 
					    'category': 'Website', | 
				
			||||
 | 
					    'summary': 'Sale Order Multi product Return Management from Website', | 
				
			||||
 | 
					    'description': """Website Multi product Return Order Management, | 
				
			||||
 | 
					     Website Return, Order Return, RMA, Website RMA""", | 
				
			||||
 | 
					    'author': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'company': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'maintainer': 'Cybrosys Techno Solutions', | 
				
			||||
 | 
					    'website': 'https://www.cybrosys.com', | 
				
			||||
 | 
					    'depends': ['website_sale', 'stock', 'sale_management', 'portal'], | 
				
			||||
 | 
					    'data': [ | 
				
			||||
 | 
					        'security/ir.model.access.csv', | 
				
			||||
 | 
					        'data/website_multi_product_return_management_data.xml', | 
				
			||||
 | 
					        'views/website_thankyou_template.xml', | 
				
			||||
 | 
					        'views/sale_return_views.xml', | 
				
			||||
 | 
					        'views/website_portal_templates.xml', | 
				
			||||
 | 
					        'views/sale_order_views.xml', | 
				
			||||
 | 
					        'views/res_partner_views.xml', | 
				
			||||
 | 
					        'views/stock_picking_views.xml', | 
				
			||||
 | 
					        'report/website_multi_product_return_management_reports.xml' | 
				
			||||
 | 
					    ], | 
				
			||||
 | 
					    'assets': { | 
				
			||||
 | 
					     'web.assets_frontend': [ | 
				
			||||
 | 
					            '/website_multi_product_return_management/static/src/js/sale_return.js', | 
				
			||||
 | 
					        ] | 
				
			||||
 | 
					    }, | 
				
			||||
 | 
					    '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) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (odoo@cybrosys.com) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU AFFERO | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program. | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					from . import main | 
				
			||||
 | 
					from . import portal | 
				
			||||
@ -0,0 +1,75 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 datetime import datetime | 
				
			||||
 | 
					from odoo.addons.web.controllers import main | 
				
			||||
 | 
					from odoo import http | 
				
			||||
 | 
					from odoo.http import request | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class CustomerRegistration(main.Home): | 
				
			||||
 | 
					    @http.route('/sale_return', type='json', csrf=False, auth="public", website=True) | 
				
			||||
 | 
					    def sale_return(self, **kwargs, ): | 
				
			||||
 | 
					        """Controller to create return order""" | 
				
			||||
 | 
					        if kwargs.get('vals'): | 
				
			||||
 | 
					            lines = [] | 
				
			||||
 | 
					            so_id = False | 
				
			||||
 | 
					            for line in kwargs.get('vals'): | 
				
			||||
 | 
					                so_id = request.env['sale.order'].sudo().search( | 
				
			||||
 | 
					                    [('id', '=', int(line['order_id']))]) | 
				
			||||
 | 
					                qty = int(line['quantity']) | 
				
			||||
 | 
					                d_qty = int(line['deli_qty']) | 
				
			||||
 | 
					                reason = line['reason'] | 
				
			||||
 | 
					                if qty > 0: | 
				
			||||
 | 
					                    lines.append((0, 0, {'product_id': line['product_id'], | 
				
			||||
 | 
					                                         'received_qty': qty, | 
				
			||||
 | 
					                                         'quantity': d_qty, | 
				
			||||
 | 
					                                         'reason': reason | 
				
			||||
 | 
					                                         })) | 
				
			||||
 | 
					            if so_id: | 
				
			||||
 | 
					                values = { | 
				
			||||
 | 
					                    'partner_id': so_id.partner_id.id, | 
				
			||||
 | 
					                    'sale_order_id': so_id.id, | 
				
			||||
 | 
					                    'user_id': request.env.uid, | 
				
			||||
 | 
					                    'create_date': datetime.now(), | 
				
			||||
 | 
					                    'return_line_ids': lines | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                stock_picks = request.env['stock.picking'].sudo().search( | 
				
			||||
 | 
					                    [('origin', '=', so_id.name)]) | 
				
			||||
 | 
					                moves = stock_picks.mapped( | 
				
			||||
 | 
					                    'move_ids_without_package').sudo().filtered( | 
				
			||||
 | 
					                    lambda p: p.product_id.id == line['product_id']) | 
				
			||||
 | 
					                if moves: | 
				
			||||
 | 
					                    moves = moves.sorted('product_uom_qty', reverse=True) | 
				
			||||
 | 
					                    values.update({'state': 'draft'}) | 
				
			||||
 | 
					                    ret_order = request.env['sale.return'].sudo().create(values) | 
				
			||||
 | 
					                    moves[0].picking_id.return_order_id = ret_order.id | 
				
			||||
 | 
					                    moves[0].picking_id.return_order_picking = False | 
				
			||||
 | 
					                return True | 
				
			||||
 | 
					        return False | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route('/my/request-thank-you', website=True, page=True, | 
				
			||||
 | 
					                auth='public', csrf=False) | 
				
			||||
 | 
					    def maintenance_request_thanks(self): | 
				
			||||
 | 
					        """Controller to redirect to the success page when return order | 
				
			||||
 | 
					         submitted successfully""" | 
				
			||||
 | 
					        return request.render( | 
				
			||||
 | 
					            'website_multi_product_return_management.' | 
				
			||||
 | 
					            'customers_request_thank_page') | 
				
			||||
@ -0,0 +1,159 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 base64 | 
				
			||||
 | 
					from collections import OrderedDict | 
				
			||||
 | 
					from odoo.exceptions import AccessError, MissingError | 
				
			||||
 | 
					from odoo import http | 
				
			||||
 | 
					from odoo.http import request | 
				
			||||
 | 
					from odoo.tools import image_process | 
				
			||||
 | 
					from odoo.tools.translate import _ | 
				
			||||
 | 
					from odoo.addons.portal.controllers.portal import CustomerPortal | 
				
			||||
 | 
					from odoo.addons.web.controllers.main import Binary | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class ReturnCustomerPortal(CustomerPortal): | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _prepare_home_portal_values(self, counters): | 
				
			||||
 | 
					        """ Add return details to main account page """ | 
				
			||||
 | 
					        values = super()._prepare_home_portal_values(counters) | 
				
			||||
 | 
					        partner = request.env.user.partner_id | 
				
			||||
 | 
					        if 'return_count' in counters: | 
				
			||||
 | 
					            if request.env.user.has_group('base.group_portal'): | 
				
			||||
 | 
					                values['return_count'] = request.env[ | 
				
			||||
 | 
					                    'sale.return'].search_count([ | 
				
			||||
 | 
					                    ('state', 'in', ['draft', 'confirm', 'done', 'cancel']), | 
				
			||||
 | 
					                    ('partner_id', '=', partner.id)]) | 
				
			||||
 | 
					            elif request.env.user.has_group('base.group_system'): | 
				
			||||
 | 
					                values['return_count'] = request.env[ | 
				
			||||
 | 
					                    'sale.return'].search_count([ | 
				
			||||
 | 
					                    ('state', 'in', ['draft', 'confirm', 'done', 'cancel'])]) | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                values['return_count'] = request.env[ | 
				
			||||
 | 
					                    'sale.return'].search_count( | 
				
			||||
 | 
					                    ['|', ('partner_id', '=', partner.id), | 
				
			||||
 | 
					                     ('user_id', '=', request.env.user.id)]) | 
				
			||||
 | 
					        return values | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route(['/my/return_orders', '/my/return_orders/page/<int:page>'], | 
				
			||||
 | 
					                type='http', auth="user", website=True) | 
				
			||||
 | 
					    def portal_my_sale_return(self, page=1, date_begin=None, date_end=None, | 
				
			||||
 | 
					                              sortby=None, filterby=None, **kw): | 
				
			||||
 | 
					        """ My orders function """ | 
				
			||||
 | 
					        values = self._prepare_portal_layout_values() | 
				
			||||
 | 
					        sale_return = request.env['sale.return'] | 
				
			||||
 | 
					        partner = request.env.user.partner_id | 
				
			||||
 | 
					        if request.env.user.has_group('base.group_portal'): | 
				
			||||
 | 
					            domain = [ | 
				
			||||
 | 
					                ('partner_id', '=', partner.id) | 
				
			||||
 | 
					            ] | 
				
			||||
 | 
					        elif request.env.user.has_group('base.group_system'): | 
				
			||||
 | 
					            domain = [] | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            domain = ['|', ('partner_id', '=', partner.id), | 
				
			||||
 | 
					                      ('user_id', '=', request.env.user.id)] | 
				
			||||
 | 
					        searchbar_sortings = { | 
				
			||||
 | 
					            'date': {'label': _('Newest'), 'order': 'create_date desc'}, | 
				
			||||
 | 
					            'name': {'label': _('Name'), 'order': 'name'}, | 
				
			||||
 | 
					            'sale': {'label': _('Sale Order'), 'order': 'sale_order_id'}, | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        if not sortby: | 
				
			||||
 | 
					            sortby = 'date' | 
				
			||||
 | 
					        order = searchbar_sortings[sortby]['order'] | 
				
			||||
 | 
					        if date_begin and date_end: | 
				
			||||
 | 
					            domain += [('create_date', '>', date_begin), | 
				
			||||
 | 
					                       ('create_date', '<=', date_end)] | 
				
			||||
 | 
					        searchbar_filters = { | 
				
			||||
 | 
					            'all': {'label': _('All'), 'domain': [ | 
				
			||||
 | 
					                ('state', 'in', ['draft', 'confirm', 'done', 'cancel'])]}, | 
				
			||||
 | 
					            'confirm': {'label': _('Confirmed'), | 
				
			||||
 | 
					                        'domain': [('state', '=', 'confirm')]}, | 
				
			||||
 | 
					            'cancel': {'label': _('Cancelled'), | 
				
			||||
 | 
					                       'domain': [('state', '=', 'cancel')]}, | 
				
			||||
 | 
					            'done': {'label': _('Done'), 'domain': [('state', '=', 'done')]}, | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        # default filter by value | 
				
			||||
 | 
					        if not filterby: | 
				
			||||
 | 
					            filterby = 'all' | 
				
			||||
 | 
					        domain += searchbar_filters[filterby]['domain'] | 
				
			||||
 | 
					        return_count = sale_return.sudo().search_count(domain) | 
				
			||||
 | 
					        # pager | 
				
			||||
 | 
					        pager = request.website.pager( | 
				
			||||
 | 
					            url="/my/return_orders", | 
				
			||||
 | 
					            url_args={'date_begin': date_begin, 'date_end': date_end, | 
				
			||||
 | 
					                      'sortby': sortby}, | 
				
			||||
 | 
					            total=return_count, | 
				
			||||
 | 
					            page=page, | 
				
			||||
 | 
					            step=self._items_per_page | 
				
			||||
 | 
					        ) | 
				
			||||
 | 
					        # content according to pager and archive selected | 
				
			||||
 | 
					        orders = sale_return.sudo().search(domain, order=order, | 
				
			||||
 | 
					                                           limit=self._items_per_page, | 
				
			||||
 | 
					                                           offset=pager['offset']) | 
				
			||||
 | 
					        request.session['my_return_history'] = orders.ids[:100] | 
				
			||||
 | 
					        values.update({ | 
				
			||||
 | 
					            'date': date_begin, | 
				
			||||
 | 
					            'orders': orders.sudo(), | 
				
			||||
 | 
					            'page_name': 'Sale_Return', | 
				
			||||
 | 
					            'default_url': '/my/return_orders', | 
				
			||||
 | 
					            'pager': pager, | 
				
			||||
 | 
					            'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), | 
				
			||||
 | 
					            'searchbar_sortings': searchbar_sortings, | 
				
			||||
 | 
					            'sortby': sortby, | 
				
			||||
 | 
					        }) | 
				
			||||
 | 
					        return request.render( | 
				
			||||
 | 
					            "website_multi_product_return_management.portal_my_returns", values) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route(['/my/return_orders/<int:order_id>'], type='http', | 
				
			||||
 | 
					                auth="public", website=True) | 
				
			||||
 | 
					    def portal_my_return_detail(self, order_id=None, access_token=None | 
				
			||||
 | 
					                                , report_type=None, download=False, **kw): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Function for return details in portal | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        try: | 
				
			||||
 | 
					            order_sudo = self._document_check_access('sale.return', order_id, | 
				
			||||
 | 
					                                                     access_token) | 
				
			||||
 | 
					        except (AccessError, MissingError): | 
				
			||||
 | 
					            return request.redirect('/my') | 
				
			||||
 | 
					        if report_type in ('html', 'pdf', 'text'): | 
				
			||||
 | 
					            return self._show_report(model=order_sudo, report_type=report_type, | 
				
			||||
 | 
					                                     report_ref='website_multi_product_return_management.' | 
				
			||||
 | 
					                                                'report_sale_returns', | 
				
			||||
 | 
					                                     download=download) | 
				
			||||
 | 
					        values = self._sale_return_get_page_view_values(order_sudo, | 
				
			||||
 | 
					                                                        access_token, **kw) | 
				
			||||
 | 
					        return request.render( | 
				
			||||
 | 
					            "website_multi_product_return_management.portal_sale_return_page", | 
				
			||||
 | 
					            values) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _sale_return_get_page_view_values(self, order, access_token, **kwargs): | 
				
			||||
 | 
					        """Function to get values of the sale return""" | 
				
			||||
 | 
					        def resize_to_48(b64source): | 
				
			||||
 | 
					            if not b64source: | 
				
			||||
 | 
					                b64source = base64.b64encode(Binary.placeholder()) | 
				
			||||
 | 
					            return image_process(b64source, size=(48, 48)) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        values = { | 
				
			||||
 | 
					            'orders': order, | 
				
			||||
 | 
					            'resize_to_48': resize_to_48, | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        return self._get_page_view_values(order, access_token, values, | 
				
			||||
 | 
					                                          'my_return_history', False, **kwargs) | 
				
			||||
@ -0,0 +1,13 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <data noupdate="1"> | 
				
			||||
 | 
					<!--        Return order sequence--> | 
				
			||||
 | 
					        <record id="sequence_sale_return" model="ir.sequence"> | 
				
			||||
 | 
					            <field name="name">Sale Return</field> | 
				
			||||
 | 
					            <field name="code">sale.return</field> | 
				
			||||
 | 
					            <field name="prefix">RET</field> | 
				
			||||
 | 
					            <field name="padding">5</field> | 
				
			||||
 | 
					            <field name="company_id" eval="False"/> | 
				
			||||
 | 
					        </record> | 
				
			||||
 | 
					    </data> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,7 @@ | 
				
			|||||
 | 
					## Module <website_multi_product_return_management> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#### 10.11.2023 | 
				
			||||
 | 
					#### Version 15.0.1.0.0 | 
				
			||||
 | 
					#### ADD | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					- Initial commit for Multi Product Return From Website | 
				
			||||
@ -0,0 +1,26 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 res_partner | 
				
			||||
 | 
					from . import sale_return | 
				
			||||
 | 
					from . import return_order_line | 
				
			||||
 | 
					from . import sale_order | 
				
			||||
 | 
					from . import stock_picking | 
				
			||||
 | 
					from . import stock_return_picking | 
				
			||||
@ -0,0 +1,63 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 ResPartner(models.Model): | 
				
			||||
 | 
					    """inheriting res_partner model to set return orders """ | 
				
			||||
 | 
					    _inherit = 'res.partner' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    return_order_count = fields.Integer(compute="_compute_returns", | 
				
			||||
 | 
					                                        string='Return Orders', | 
				
			||||
 | 
					                                        help="Number of return orders") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _compute_returns(self): | 
				
			||||
 | 
					        """Function to calculate the return count""" | 
				
			||||
 | 
					        all_partners = (self.with_context(active_test=False).sudo(). | 
				
			||||
 | 
					                        search([('id', 'child_of', self.ids)])) | 
				
			||||
 | 
					        all_partners.read(['parent_id']) | 
				
			||||
 | 
					        sale_return_groups = self.env['sale.return'].sudo().read_group( | 
				
			||||
 | 
					            domain=[('partner_id', '=', all_partners.ids)], | 
				
			||||
 | 
					            fields=['partner_id'], groupby=['partner_id']) | 
				
			||||
 | 
					        partners = self.sudo().browse() | 
				
			||||
 | 
					        for group in sale_return_groups: | 
				
			||||
 | 
					            partner = self.browse(group['partner_id'][0]) | 
				
			||||
 | 
					            while partner: | 
				
			||||
 | 
					                if partner in self: | 
				
			||||
 | 
					                    partner.return_order_count += group['partner_id_count'] | 
				
			||||
 | 
					                    partners |= partner | 
				
			||||
 | 
					                    partner = partner.parent_id | 
				
			||||
 | 
					        (self - partners).return_order_count = 0 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_open_returns(self): | 
				
			||||
 | 
					        """This function returns an action that displays the sale return orders | 
				
			||||
 | 
					         from partner.""" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        action = self.env['ir.actions.act_window']._for_xml_id( | 
				
			||||
 | 
					            'website_multi_product_return_management.sale_return_action') | 
				
			||||
 | 
					        domain = [] | 
				
			||||
 | 
					        if self.is_company: | 
				
			||||
 | 
					            domain.append(('partner_id.commercial_partner_id.id', '=', self.id)) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            domain.append(('partner_id.id', '=', self.id)) | 
				
			||||
 | 
					        action['domain'] = domain | 
				
			||||
 | 
					        action['context'] = {'search_default_customer': 1} | 
				
			||||
 | 
					        return action | 
				
			||||
@ -0,0 +1,64 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 api, fields, models | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class ReturnOrderLine(models.Model): | 
				
			||||
 | 
						"""creating model for return order lines""" | 
				
			||||
 | 
						_name = 'return.order.line' | 
				
			||||
 | 
						_description = "return products Details" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
						order_id = fields.Many2one("sale.return", string="Order", | 
				
			||||
 | 
						                           help="Orders") | 
				
			||||
 | 
						product_id = fields.Many2one('product.product', | 
				
			||||
 | 
						                             string="Product Variant", required=True, | 
				
			||||
 | 
						                             help="Defines the product variant that need to" | 
				
			||||
 | 
						                                  " be returned") | 
				
			||||
 | 
						product_tmpl_id = fields.Many2one('product.template', | 
				
			||||
 | 
						                                  related="product_id.product_tmpl_id", | 
				
			||||
 | 
						                                  store=True, string="Product", | 
				
			||||
 | 
						                                  help="Product") | 
				
			||||
 | 
						quantity = fields.Float(string="Delivered Quantity", store=True, | 
				
			||||
 | 
						                        help="product quantity") | 
				
			||||
 | 
						received_qty = fields.Float(string="Received Quantity", | 
				
			||||
 | 
						                            help="Received quantity") | 
				
			||||
 | 
						reason = fields.Text("Reason", help="Reason for returning the product") | 
				
			||||
 | 
						to_refund = fields.Boolean(string='Update SO/PO Quantity', | 
				
			||||
 | 
						                           help='Trigger a decrease of the' | 
				
			||||
 | 
						                                ' delivered/received quantity in the ' | 
				
			||||
 | 
						                                'associated Sale Order/Purchase Order') | 
				
			||||
 | 
					
 | 
				
			||||
 | 
						@api.onchange('product_id') | 
				
			||||
 | 
						def _onchange_product_id(self): | 
				
			||||
 | 
							""" setting up domain for products as per the products in the | 
				
			||||
 | 
							 vendor price list""" | 
				
			||||
 | 
							self.ensure_one() | 
				
			||||
 | 
							if self._context.get('order_id'): | 
				
			||||
 | 
								order_id = self.env['sale.order'].browse( | 
				
			||||
 | 
									self._context.get('order_id')) | 
				
			||||
 | 
								products = order_id.order_line.mapped('product_id').ids | 
				
			||||
 | 
								if self.product_id: | 
				
			||||
 | 
									dqty = sum( | 
				
			||||
 | 
										order_id.order_line.filtered( | 
				
			||||
 | 
											lambda p: p.product_id == self.product_id).mapped( | 
				
			||||
 | 
											'qty_delivered')) | 
				
			||||
 | 
									self.quantity = dqty | 
				
			||||
 | 
								return {'domain': {'product_id': [('id', 'in', products)]}} | 
				
			||||
@ -0,0 +1,55 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 SaleOrder(models.Model): | 
				
			||||
 | 
					    """inheriting sale_order model to set return orders """ | 
				
			||||
 | 
					    _inherit = 'sale.order' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    return_order_count = fields.Integer(string='Return Orders', | 
				
			||||
 | 
					                                        compute="_compute_returns", | 
				
			||||
 | 
					                                        help="Number of return orders") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _compute_returns(self): | 
				
			||||
 | 
					        """method to compute return count""" | 
				
			||||
 | 
					        sale_return_groups = self.env['sale.return'].sudo().read_group( | 
				
			||||
 | 
					            domain=[('sale_order_id', '=', self.ids)], | 
				
			||||
 | 
					            fields=['sale_order_id'], groupby=['sale_order_id']) | 
				
			||||
 | 
					        orders = self.sudo().browse() | 
				
			||||
 | 
					        for group in sale_return_groups: | 
				
			||||
 | 
					            sale_order = self.sudo().browse(group['sale_order_id'][0]) | 
				
			||||
 | 
					            while sale_order: | 
				
			||||
 | 
					                if sale_order in self: | 
				
			||||
 | 
					                    sale_order.return_order_count += group['sale_order_id_count'] | 
				
			||||
 | 
					                    orders |= sale_order | 
				
			||||
 | 
					                    sale_order = False | 
				
			||||
 | 
					        (self - orders).return_order_count = 0 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_open_returns(self): | 
				
			||||
 | 
					        """This function returns an action that displays the sale return orders | 
				
			||||
 | 
					         from sale order""" | 
				
			||||
 | 
					        action = self.env['ir.actions.act_window']._for_xml_id( | 
				
			||||
 | 
					            'website_multi_product_return_management.sale_return_action') | 
				
			||||
 | 
					        domain = [('sale_order_id', '=', self.id)] | 
				
			||||
 | 
					        action['domain'] = domain | 
				
			||||
 | 
					        action['context'] = {'search_default_order': 1} | 
				
			||||
 | 
					        return action | 
				
			||||
@ -0,0 +1,246 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 api, fields, models | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class ReturnOrder(models.Model): | 
				
			||||
 | 
					    """Creating model for returning order""" | 
				
			||||
 | 
					    _name = 'sale.return' | 
				
			||||
 | 
					    _inherit = ['portal.mixin'] | 
				
			||||
 | 
					    _rec_name = "name" | 
				
			||||
 | 
					    _order = "name" | 
				
			||||
 | 
					    _description = "Return Order" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.model | 
				
			||||
 | 
					    def _get_default_name(self): | 
				
			||||
 | 
					        """Used the default name for the return order""" | 
				
			||||
 | 
					        return self.env['ir.sequence'].get('sale.return') | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    active = fields.Boolean(string='Active', default=True, help='Active') | 
				
			||||
 | 
					    name = fields.Char(string="Name", default=_get_default_name, | 
				
			||||
 | 
					                       help='Name of order') | 
				
			||||
 | 
					    sale_order_id = fields.Many2one('sale.order', string="Sale Order", | 
				
			||||
 | 
					                                 required=True, help='Correspondent sale order') | 
				
			||||
 | 
					    partner_id = fields.Many2one('res.partner', string="Customer", | 
				
			||||
 | 
					                                 help='Partner of return order') | 
				
			||||
 | 
					    user_id = fields.Many2one('res.users', string="Responsible", | 
				
			||||
 | 
					                              default=lambda self: self.env.user, | 
				
			||||
 | 
					                              help="User of the order") | 
				
			||||
 | 
					    create_date = fields.Datetime(string="Create Date", | 
				
			||||
 | 
					                                  help="Create date of the order") | 
				
			||||
 | 
					    stock_picking_ids = fields.One2many('stock.picking', | 
				
			||||
 | 
					                                    'return_order_pick_id', | 
				
			||||
 | 
					                                    domain="[('return_order_id','=',False)]", | 
				
			||||
 | 
					                                    string="Return Picking", | 
				
			||||
 | 
					                                    help="Shows the return picking of the" | 
				
			||||
 | 
					                                         " corresponding return order") | 
				
			||||
 | 
					    picking_count = fields.Integer(compute="_compute_delivery", | 
				
			||||
 | 
					                                   string='Picking Order', | 
				
			||||
 | 
					                                   copy=False, default=0, store=True, | 
				
			||||
 | 
					                                   help="Number of pickings") | 
				
			||||
 | 
					    delivery_count = fields.Integer(compute="_compute_delivery", | 
				
			||||
 | 
					                                    string='Delivery Order', copy=False, | 
				
			||||
 | 
					                                    default=0, store=True, | 
				
			||||
 | 
					                                    help="Number of delivery") | 
				
			||||
 | 
					    state = fields.Selection([('draft', 'Draft'), ('confirm', 'Confirm'), | 
				
			||||
 | 
					                              ('done', 'Done'), ('cancel', 'Canceled')], | 
				
			||||
 | 
					                             string='Status', readonly=True, default='draft', | 
				
			||||
 | 
					                             help="State of the return order") | 
				
			||||
 | 
					    source_pick_ids = fields.One2many('stock.picking', 'return_order_id', | 
				
			||||
 | 
					                                  string="Source Delivery", | 
				
			||||
 | 
					                                  domain="[('return_order_pick_id','=',False)]", | 
				
			||||
 | 
					                                  help="Shows the delivery orders of the" | 
				
			||||
 | 
					                                       " corresponding return order") | 
				
			||||
 | 
					    note = fields.Text("Note", help="Note to display") | 
				
			||||
 | 
					    return_line_ids = fields.One2many('return.order.line', | 
				
			||||
 | 
					                                      'order_id', | 
				
			||||
 | 
					                                      string="Return Lines", | 
				
			||||
 | 
					                                      help="Return order lines") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_return_confirm(self): | 
				
			||||
 | 
					        """Confirm the sale return""" | 
				
			||||
 | 
					        if not self.source_pick_ids: | 
				
			||||
 | 
					            stock_picks = self.env['stock.picking'].sudo().search([('origin', '=', self.sale_order_id.name)]) | 
				
			||||
 | 
					            moves = stock_picks.mapped('move_ids_without_package').sudo().filtered( | 
				
			||||
 | 
					                lambda p: p.product_id.id in self.return_line_ids.mapped('product_id').ids) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            moves = self.source_pick_ids.mapped('move_ids_without_package').sudo().filtered( | 
				
			||||
 | 
					                lambda p: p.product_id.id in self.return_line_ids.mapped('product_id').ids) | 
				
			||||
 | 
					        if moves: | 
				
			||||
 | 
					            moves = moves.sorted('product_uom_qty', reverse=True) | 
				
			||||
 | 
					            pick = moves[0].picking_id | 
				
			||||
 | 
					            vals = {'picking_id': pick.id} | 
				
			||||
 | 
					            return_pick_wizard = self.env['stock.return.picking'].sudo().create(vals) | 
				
			||||
 | 
					            return_pick_wizard._onchange_picking_id() | 
				
			||||
 | 
					            return_pick_wizard.product_return_moves.unlink() | 
				
			||||
 | 
					            lines = [] | 
				
			||||
 | 
					            reason = '' | 
				
			||||
 | 
					            for line in self.return_line_ids: | 
				
			||||
 | 
					                move = moves.filtered(lambda m:m.product_id == line.product_id) | 
				
			||||
 | 
					                lines.append( | 
				
			||||
 | 
					                    {'product_id': line.product_id.id, "quantity": line.received_qty, | 
				
			||||
 | 
					                     'move_id': move.id, 'to_refund': line.to_refund}) | 
				
			||||
 | 
					                reason = reason + '\n' + line.reason | 
				
			||||
 | 
					            lines = self.env['stock.return.picking.line'].create(lines) | 
				
			||||
 | 
					            return_pick_wizard.write({ | 
				
			||||
 | 
					                'product_return_moves': [(6, 0, lines.ids)] | 
				
			||||
 | 
					            }) | 
				
			||||
 | 
					            return_pick = return_pick_wizard._create_returns() | 
				
			||||
 | 
					            if return_pick: | 
				
			||||
 | 
					                return_pick = self.env['stock.picking'].sudo().browse(return_pick[0]) | 
				
			||||
 | 
					                return_pick.update({'note': reason}) | 
				
			||||
 | 
					                return_pick.write({'return_order_id': False, 'return_order_pick_id': self.id, 'return_order_picking': True}) | 
				
			||||
 | 
					                self.write({'state': 'confirm'}) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_return_cancel(self): | 
				
			||||
 | 
					        """Cancel the return""" | 
				
			||||
 | 
					        self.write({'state': 'cancel'}) | 
				
			||||
 | 
					        if self.stock_picking_ids: | 
				
			||||
 | 
					            for rec in self.stock_picking_ids.sudo().filtered(lambda s: s.state not in ['done', 'cancel']): | 
				
			||||
 | 
					                rec.action_cancel() | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _get_report_base_filename(self): | 
				
			||||
 | 
					        """setting the file name""" | 
				
			||||
 | 
					        self.ensure_one() | 
				
			||||
 | 
					        return 'Sale Return - %s' % (self.name) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def _compute_access_url(self): | 
				
			||||
 | 
					        """access url""" | 
				
			||||
 | 
					        super(ReturnOrder, self)._compute_access_url() | 
				
			||||
 | 
					        for order in self: | 
				
			||||
 | 
					            order.access_url = '/my/return_orders/%s' % order.id | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.depends('stock_picking_ids', 'state') | 
				
			||||
 | 
					    def _compute_delivery(self): | 
				
			||||
 | 
					        """Function to compute picking and delivery counts""" | 
				
			||||
 | 
					        for rec in self: | 
				
			||||
 | 
					            rec.delivery_count = 0 | 
				
			||||
 | 
					            rec.picking_count = 0 | 
				
			||||
 | 
					            if rec.source_pick_ids: | 
				
			||||
 | 
					                rec.delivery_count = len(rec.source_pick_ids) | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                rec.delivery_count = self.env[ | 
				
			||||
 | 
					                    'stock.picking'].sudo().search_count( | 
				
			||||
 | 
					                    [('return_order_id', 'in', self.ids), | 
				
			||||
 | 
					                     ('return_order_picking', '=', False)]) | 
				
			||||
 | 
					            if rec.stock_picking_ids: | 
				
			||||
 | 
					                rec.picking_count = len(rec.stock_picking_ids) | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                rec.picking_count = self.env[ | 
				
			||||
 | 
					                    'stock.picking'].sudo().search_count( | 
				
			||||
 | 
					                    [('return_order_pick_id', 'in', self.ids), | 
				
			||||
 | 
					                     ('return_order_picking', '=', True)]) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_view_picking(self): | 
				
			||||
 | 
					        """Function to view the stock picking transfers""" | 
				
			||||
 | 
					        action = self.env["ir.actions.actions"]._for_xml_id( | 
				
			||||
 | 
					            "stock.action_picking_tree_all") | 
				
			||||
 | 
					        pickings = self.mapped('stock_picking_ids') | 
				
			||||
 | 
					        if not self.stock_picking_ids: | 
				
			||||
 | 
					            pickings = self.env['stock.picking'].sudo().search( | 
				
			||||
 | 
					                [('return_order_pick_id', '=', self.id), | 
				
			||||
 | 
					                 ('return_order_picking', '=', True)]) | 
				
			||||
 | 
					        if len(pickings) > 1: | 
				
			||||
 | 
					            action['domain'] = [('id', 'in', pickings.ids)] | 
				
			||||
 | 
					        elif pickings: | 
				
			||||
 | 
					            form_view = [(self.env.ref('stock.view_picking_form').id, 'form')] | 
				
			||||
 | 
					            if 'views' in action: | 
				
			||||
 | 
					                action['views'] = form_view + [(state, view) for state, view | 
				
			||||
 | 
					                                        in action['views'] if view != 'form'] | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                action['views'] = form_view | 
				
			||||
 | 
					            action['res_id'] = pickings.id | 
				
			||||
 | 
					        # Prepare the context. | 
				
			||||
 | 
					        picking_id = pickings.sudo().filtered( | 
				
			||||
 | 
					            lambda l: l.picking_type_id.code == 'outgoing') | 
				
			||||
 | 
					        if picking_id: | 
				
			||||
 | 
					            picking_id = picking_id[0] | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            picking_id = pickings[0] | 
				
			||||
 | 
					        action['context'] = dict(self._context, | 
				
			||||
 | 
					                                 default_partner_id=self.partner_id.id, | 
				
			||||
 | 
					                                 default_picking_type_id=picking_id. | 
				
			||||
 | 
					                                 picking_type_id.id) | 
				
			||||
 | 
					        return action | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def action_view_delivery(self): | 
				
			||||
 | 
					        """Function to view the delivery transfers""" | 
				
			||||
 | 
					        action = self.env["ir.actions.actions"]._for_xml_id( | 
				
			||||
 | 
					            "stock.action_picking_tree_all") | 
				
			||||
 | 
					        pickings = self.mapped('source_pick_ids') | 
				
			||||
 | 
					        if not self.source_pick_ids: | 
				
			||||
 | 
					            pickings = self.env['stock.picking'].sudo().search( | 
				
			||||
 | 
					                [('return_order_id', '=', self.id), | 
				
			||||
 | 
					                 ('return_order_picking', '=', False)]) | 
				
			||||
 | 
					        if len(pickings) > 1: | 
				
			||||
 | 
					            action['domain'] = [('id', 'in', pickings.ids)] | 
				
			||||
 | 
					        elif pickings: | 
				
			||||
 | 
					            form_view = [(self.env.ref('stock.view_picking_form').id, 'form')] | 
				
			||||
 | 
					            if 'views' in action: | 
				
			||||
 | 
					                action['views'] = form_view + [(state, view) for state, view in | 
				
			||||
 | 
					                                               action['views'] if | 
				
			||||
 | 
					                                               view != 'form'] | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                action['views'] = form_view | 
				
			||||
 | 
					            action['res_id'] = pickings.id | 
				
			||||
 | 
					        # Prepare the context. | 
				
			||||
 | 
					        picking_id = pickings.filtered( | 
				
			||||
 | 
					            lambda l: l.picking_type_id.code == 'outgoing') | 
				
			||||
 | 
					        if picking_id: | 
				
			||||
 | 
					            picking_id = picking_id[0] | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            picking_id = pickings[0] | 
				
			||||
 | 
					        action['context'] = dict(self._context, | 
				
			||||
 | 
					                                 default_partner_id=self.partner_id.id, | 
				
			||||
 | 
					                                 default_picking_type_id=picking_id. | 
				
			||||
 | 
					                                 picking_type_id.id) | 
				
			||||
 | 
					        return action | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.onchange('sale_order_id', 'source_pick_ids') | 
				
			||||
 | 
					    def _onchange_sale_order_id(self): | 
				
			||||
 | 
					        """All the fields are updated according to the sale order""" | 
				
			||||
 | 
					        delivery = None | 
				
			||||
 | 
					        if self.sale_order_id: | 
				
			||||
 | 
					            self.partner_id = self.sale_order_id.partner_id | 
				
			||||
 | 
					            delivery = self.env['stock.picking'].sudo().search( | 
				
			||||
 | 
					                [('origin', '=', self.sale_order_id.name)]) | 
				
			||||
 | 
					        if self.source_pick_ids: | 
				
			||||
 | 
					            delivery = self.source_pick_ids | 
				
			||||
 | 
					        if delivery: | 
				
			||||
 | 
					            product_ids = delivery.move_ids_without_package.mapped( | 
				
			||||
 | 
					                'product_id').ids | 
				
			||||
 | 
					            delivery = delivery.ids | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            product_ids = self.sale_order_id.order_line.mapped('product_id').ids | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        return {'domain': {'source_pick_ids': [('id', 'in', delivery)], | 
				
			||||
 | 
					                           'product_id': [('id', 'in', product_ids)]}} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @api.onchange('product_id') | 
				
			||||
 | 
					    def _onchange_product_id(self): | 
				
			||||
 | 
					        """Update the received quantity based on the selected product and source | 
				
			||||
 | 
					         pick.""" | 
				
			||||
 | 
					        if self.product_id and self.source_pick_ids: | 
				
			||||
 | 
					            moves = self.source_pick_ids.mapped( | 
				
			||||
 | 
					                'move_ids_without_package').sudo().filtered( | 
				
			||||
 | 
					                lambda p: p.product_id == self.product_id) | 
				
			||||
 | 
					            if moves: | 
				
			||||
 | 
					                self.received_qty = sum(moves.mapped('quantity_done')) | 
				
			||||
@ -0,0 +1,52 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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): | 
				
			||||
 | 
					    """Inheriting stock_picking model for validating the return order""" | 
				
			||||
 | 
					    _inherit = 'stock.picking' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    return_order_id = fields.Many2one('sale.return', | 
				
			||||
 | 
					                                   string='Return order', | 
				
			||||
 | 
					                                   help="Shows the return order of current" | 
				
			||||
 | 
					                                        " transfer") | 
				
			||||
 | 
					    return_order_pick_id = fields.Many2one('sale.return', | 
				
			||||
 | 
					                                        string='Return order Pick', | 
				
			||||
 | 
					                                        help="Shows the return order picking" | 
				
			||||
 | 
					                                             " of current return order") | 
				
			||||
 | 
					    return_order_picking = fields.Boolean(string='Return order picking', | 
				
			||||
 | 
					                                          help="Helps to identify delivery and" | 
				
			||||
 | 
					                                               " return picking, if true the " | 
				
			||||
 | 
					                                               "transfer is return picking" | 
				
			||||
 | 
					                                               " else delivery") | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    def button_validate(self): | 
				
			||||
 | 
					        """Validating the stock picking and update the return order""" | 
				
			||||
 | 
					        res = super(StockPicking, self).button_validate() | 
				
			||||
 | 
					        for rec in self: | 
				
			||||
 | 
					            if rec.return_order_pick_id: | 
				
			||||
 | 
					                if any(line.state != 'done' for line in | 
				
			||||
 | 
					                       rec.return_order_pick_id.stock_picking_ids): | 
				
			||||
 | 
					                    return res | 
				
			||||
 | 
					                else: | 
				
			||||
 | 
					                    rec.return_order_pick_id.write({'state': 'done'}) | 
				
			||||
 | 
					        return res | 
				
			||||
@ -0,0 +1,38 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					################################################################################ | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | 
				
			||||
 | 
					#    Author: Bhagyadev K P (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 models | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class StockReturnPicking(models.TransientModel): | 
				
			||||
 | 
						"""Inheriting stock_return_picking model for creating returns""" | 
				
			||||
 | 
						_inherit = 'stock.return.picking' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
						def _create_returns(self): | 
				
			||||
 | 
							"""create returns""" | 
				
			||||
 | 
							new_picking, pick_type_id = (super(StockReturnPicking, self). | 
				
			||||
 | 
							                             _create_returns()) | 
				
			||||
 | 
							picking = self.env['stock.picking'].browse(new_picking) | 
				
			||||
 | 
							if self.picking_id.return_order_id: | 
				
			||||
 | 
								picking.write({'return_order_picking': False, | 
				
			||||
 | 
								               'return_order_id': False, | 
				
			||||
 | 
								               'return_order_pick_id': self.picking_id.return_order_id.id}) | 
				
			||||
 | 
								self.picking_id.return_order_id.write({'state': 'confirm'}) | 
				
			||||
 | 
							return new_picking, pick_type_id | 
				
			||||
@ -0,0 +1,78 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <data> | 
				
			||||
 | 
					<!--        Return order report--> | 
				
			||||
 | 
					        <record id="report_sale_returns" model="ir.actions.report"> | 
				
			||||
 | 
					            <field name="name">Sale Return</field> | 
				
			||||
 | 
					            <field name="model">sale.return</field> | 
				
			||||
 | 
					            <field name="report_type">qweb-pdf</field> | 
				
			||||
 | 
					            <field name="report_name">website_multi_product_return_management.report_salereturn</field> | 
				
			||||
 | 
					            <field name="report_file">website_multi_product_return_management.report_salereturn</field> | 
				
			||||
 | 
					            <field name="print_report_name">'Sale Retun - %s' % object.name</field> | 
				
			||||
 | 
					            <field name="binding_model_id" ref="model_sale_return"/> | 
				
			||||
 | 
					            <field name="binding_type">report</field> | 
				
			||||
 | 
					        </record> | 
				
			||||
 | 
					<!--        Return order report template in html_container--> | 
				
			||||
 | 
					        <template id="report_salereturn"> | 
				
			||||
 | 
					            <t t-call="web.html_container"> | 
				
			||||
 | 
					                <t t-foreach="docs" t-as="doc"> | 
				
			||||
 | 
					                    <t t-call="website_multi_product_return_management.report_sale_return" t-lang="doc.partner_id.lang"/> | 
				
			||||
 | 
					                </t> | 
				
			||||
 | 
					            </t> | 
				
			||||
 | 
					        </template> | 
				
			||||
 | 
					<!--        Return order report template--> | 
				
			||||
 | 
					        <template id="report_sale_return"> | 
				
			||||
 | 
					            <t t-call="web.external_layout"> | 
				
			||||
 | 
					                <t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/> | 
				
			||||
 | 
					                <div class="page"> | 
				
			||||
 | 
					                    <div class="oe_structure"/> | 
				
			||||
 | 
					                    <h2 class="mt16"> | 
				
			||||
 | 
					                        <span>Return Order # </span> | 
				
			||||
 | 
					                        <span t-field="doc.name"/> | 
				
			||||
 | 
					                    </h2> | 
				
			||||
 | 
					                    <div class="row mt32 mb32" id="informations"> | 
				
			||||
 | 
					                        <div t-if="doc.partner_id" class="col-auto col-3 mw-100 mb-2"> | 
				
			||||
 | 
					                            <strong>Customer:</strong> | 
				
			||||
 | 
					                            <p class="m-0" t-field="doc.partner_id"/> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div t-if="doc.sale_order_id" class="col-auto col-3 mw-100 mb-2"> | 
				
			||||
 | 
					                            <strong>Sale Order:</strong> | 
				
			||||
 | 
					                            <p class="m-0" t-field="doc.sale_order_id"/> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div t-if="doc.create_date" class="col-auto col-3 mw-100 mb-2"> | 
				
			||||
 | 
					                            <strong>Creation Date:</strong> | 
				
			||||
 | 
					                            <p class="m-0" t-field="doc.create_date" t-options='{"widget": "date"}'/> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div t-if="doc.user_id" | 
				
			||||
 | 
					                             class="col-auto col-3 mw-100 mb-2" name="expiration_date"> | 
				
			||||
 | 
					                            <strong>Responsible:</strong> | 
				
			||||
 | 
					                            <p class="m-0" t-field="doc.user_id"/> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <table class="table table-sm o_main_table"> | 
				
			||||
 | 
					                        <!-- In case we want to repeat the header, remove "display: table-row-group" --> | 
				
			||||
 | 
					                        <thead style="display: table-row-group"> | 
				
			||||
 | 
					                            <tr> | 
				
			||||
 | 
					                                <th name="th_description" class="text-left">Product</th> | 
				
			||||
 | 
					                                <th name="th_quantity" class="text-left">Quantity</th> | 
				
			||||
 | 
					                                <th name="th_quantity" class="text-left">Reason</th> | 
				
			||||
 | 
					                            </tr> | 
				
			||||
 | 
					                        </thead> | 
				
			||||
 | 
					                        <tbody class="sale_tbody"> | 
				
			||||
 | 
					                            <tr t-foreach="doc.return_line_ids" t-as="line" t-att-class="'bg-200 font-weight-bold'"> | 
				
			||||
 | 
					                                <td name="td_product"><span t-field="line.product_id"/></td> | 
				
			||||
 | 
					                                <td name="td_quantity" class="text-left"> | 
				
			||||
 | 
					                                    <span t-esc="line.received_qty"/> | 
				
			||||
 | 
					                                    <span t-field="line.product_id.uom_id"/> | 
				
			||||
 | 
					                                </td> | 
				
			||||
 | 
					                                <td name="td_quantity" class="text-left"> | 
				
			||||
 | 
					                                    <span t-field="line.reason"/> | 
				
			||||
 | 
					                                </td> | 
				
			||||
 | 
					                            </tr> | 
				
			||||
 | 
					                        </tbody> | 
				
			||||
 | 
					                    </table> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </t> | 
				
			||||
 | 
					        </template> | 
				
			||||
 | 
					    </data> | 
				
			||||
 | 
					</odoo> | 
				
			||||
		
		
			
  | 
| 
		 After Width: | Height: | Size: 3.6 KiB  | 
| 
		 After Width: | Height: | Size: 310 B  | 
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 576 B  | 
| 
		 After Width: | Height: | Size: 733 B  | 
| 
		 After Width: | Height: | Size: 911 B  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 3.4 KiB  | 
| 
		 After Width: | Height: | Size: 673 B  | 
| 
		 After Width: | Height: | Size: 878 B  | 
| 
		 After Width: | Height: | Size: 653 B  | 
| 
		 After Width: | Height: | Size: 905 B  | 
| 
		 After Width: | Height: | Size: 839 B  | 
| 
		 After Width: | Height: | Size: 427 B  | 
| 
		 After Width: | Height: | Size: 627 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 988 B  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 1.5 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.9 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 2.1 KiB  | 
| 
		 After Width: | Height: | Size: 4.4 KiB  | 
| 
		 After Width: | Height: | Size: 589 B  | 
| 
		 After Width: | Height: | Size: 3.4 KiB  | 
| 
		 After Width: | Height: | Size: 1.7 KiB  | 
| 
		 After Width: | Height: | Size: 2.3 KiB  | 
| 
		 After Width: | Height: | Size: 967 B  | 
| 
		 After Width: | Height: | Size: 1.6 KiB  | 
| 
		 After Width: | Height: | Size: 3.8 KiB  | 
| 
		 After Width: | Height: | Size: 5.0 KiB  | 
| 
		 After Width: | Height: | Size: 57 KiB  | 
| 
		 After Width: | Height: | Size: 35 KiB  | 
| 
		 After Width: | Height: | Size: 32 KiB  | 
| 
		 After Width: | Height: | Size: 34 KiB  | 
| 
		 After Width: | Height: | Size: 34 KiB  | 
| 
		 After Width: | Height: | Size: 56 KiB  | 
| 
		 After Width: | Height: | Size: 135 KiB  | 
| 
		 After Width: | Height: | Size: 123 KiB  | 
| 
		 After Width: | Height: | Size: 144 KiB  | 
| 
		 After Width: | Height: | Size: 69 KiB  | 
| 
		 After Width: | Height: | Size: 122 KiB  | 
| 
		 After Width: | Height: | Size: 153 KiB  | 
| 
		 After Width: | Height: | Size: 43 KiB  | 
| 
		 After Width: | Height: | Size: 93 KiB  | 
| 
		 After Width: | Height: | Size: 116 KiB  | 
| 
		 After Width: | Height: | Size: 116 KiB  | 
| 
		 After Width: | Height: | Size: 112 KiB  | 
| 
		 After Width: | Height: | Size: 68 KiB  | 
| 
		 After Width: | Height: | Size: 70 KiB  | 
| 
		 After Width: | Height: | Size: 67 KiB  | 
| 
		 After Width: | Height: | Size: 73 KiB  | 
| 
		 After Width: | Height: | Size: 414 KiB  | 
| 
		 After Width: | Height: | Size: 102 KiB  | 
| 
		 After Width: | Height: | Size: 12 KiB  | 
@ -0,0 +1,676 @@ | 
				
			|||||
 | 
					<div style="background-color: #714B67; height: 810px; 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: #875A7B; 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 style="color: #017E84; 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>Odoo sh | 
				
			||||
 | 
					            </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;"> | 
				
			||||
 | 
					                    Multi Product Return From Website</h1> | 
				
			||||
 | 
					                <p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> | 
				
			||||
 | 
					                    Manage Sale Order return from Website</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>F | 
				
			||||
 | 
					<!-- 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"> | 
				
			||||
 | 
					        This module allows to create and manage sale order return from website. | 
				
			||||
 | 
					        The logged user can create multiple product return from website. The | 
				
			||||
 | 
					        Authorize persons can manage the return orders. And allow the portal | 
				
			||||
 | 
					        users can view their return orders from the account portal view. | 
				
			||||
 | 
					    </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;">Create Return Orders From Website</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <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;">Portal Return Order View</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					        <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;">Link Return With Sale Order</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					    <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;">Link Return Order With Partner</span> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					        <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;">Return Order report</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;">Return Button on Order Page on Portal.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/1.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;">Return Product Screen.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/2.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;">Return Orders in Portal for View.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/3.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;">Return Orders tree view in Portal.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/4.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;">Return Orders detailed view in Portal.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/5.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;">Return Orders - Backend</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/6.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;">Return Orders form view in backend.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/7.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;">Delivery Order Tab and Smart button</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/8.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;">Return Process on DO picking.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/9.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;">Delivery Order Return Button.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/10.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;">Delivery Order Return Wizard(Odoo Standard).</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/11.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;">Return Picking Order Tab and Smart button.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/12.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;">Smart Button on Customer Form.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/13.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;">Smart Button on Sale Order Form</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/14.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;">Return Orders - Report Sample.</h3> | 
				
			||||
 | 
					            <img src="assets/screenshots/15.png" class="img-thumbnail"> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF SCREENSHOTS SECTION --> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- RELATED PRODUCTS --> | 
				
			||||
 | 
					<div class="row"> | 
				
			||||
 | 
					    <div class="col-lg-12 d-flex flex-column justify-content-center" | 
				
			||||
 | 
					         style="text-align: center; padding: 2.5rem 1rem !important;"> | 
				
			||||
 | 
					        <h2 style="color: #212529 !important;">Suggested Products</h2> | 
				
			||||
 | 
					        <hr | 
				
			||||
 | 
					                style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;"/> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div id="demo1" class="row carousel slide" data-ride="carousel"> | 
				
			||||
 | 
					            <!-- The slideshow --> | 
				
			||||
 | 
					            <div class="carousel-inner"> | 
				
			||||
 | 
					                <div class="carousel-item active" style="min-height:0px"> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/15.0/odoo_website_helpdesk/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                                     src="./assets/modules/module_1.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/15.0/odoo_website_helpdesk_dashboard/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                                     src="./assets/modules/module_2.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/15.0/website_pdf_preview_snippet/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                                     src="./assets/modules/module_3.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="carousel-item" style="min-height:0px"> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/15.0/website_multi_variant/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                                     src="./assets/modules/module_4.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/15.0/product_visibility_website/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                                     src="./assets/modules/module_5.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" | 
				
			||||
 | 
					                         style="float:left"> | 
				
			||||
 | 
					                        <a href="https://apps.odoo.com/apps/modules/15.0/website_hide_button/" | 
				
			||||
 | 
					                           target="_blank"> | 
				
			||||
 | 
					                            <div style="border-radius:10px"> | 
				
			||||
 | 
					                                <img class="img img-responsive center-block" | 
				
			||||
 | 
					                                     style="border-top-left-radius:10px; border-top-right-radius:10px" | 
				
			||||
 | 
					                                     src="./assets/modules/module_6.png"> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </a> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <!-- Left and right controls --> | 
				
			||||
 | 
					            <a class="carousel-control-prev" href="#demo1" data-slide="prev" | 
				
			||||
 | 
					               style="left:-25px;width: 35px;color: #000;"> | 
				
			||||
 | 
					                    <span class="carousel-control-prev-icon"><i | 
				
			||||
 | 
					                            class="fa fa-chevron-left" | 
				
			||||
 | 
					                            style="font-size:24px"></i></span> </a> | 
				
			||||
 | 
					            <a class="carousel-control-next" href="#demo1" data-slide="next" | 
				
			||||
 | 
					               style="right:-25px;width: 35px;color: #000;"> | 
				
			||||
 | 
					                    <span class="carousel-control-next-icon"><i | 
				
			||||
 | 
					                            class="fa fa-chevron-right" | 
				
			||||
 | 
					                            style="font-size:24px"></i></span> | 
				
			||||
 | 
					            </a> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					</div> | 
				
			||||
 | 
					<!-- END OF 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> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- 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> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<!-- 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,59 @@ | 
				
			|||||
 | 
					odoo.define('website_multi_product_return_management.return', function (require) { | 
				
			||||
 | 
					    "use strict"; | 
				
			||||
 | 
					    var publicWidget = require('web.public.widget'); | 
				
			||||
 | 
					    var ajax = require('web.ajax'); | 
				
			||||
 | 
					//    Modal hiding and showing in button click
 | 
				
			||||
 | 
					    $("#hidden_box_btn").on('click', function () { | 
				
			||||
 | 
					        $('#hidden_box').modal('show'); | 
				
			||||
 | 
					    }) | 
				
			||||
 | 
					    $("#close-button").on('click', function () { | 
				
			||||
 | 
					        $('#hidden_box').modal('hide'); | 
				
			||||
 | 
					    }) | 
				
			||||
 | 
					//    Adding return quantity and it's details
 | 
				
			||||
 | 
					    $(".js_add_json").on('click', function (ev) { | 
				
			||||
 | 
					        var $link = $(ev.currentTarget); | 
				
			||||
 | 
					        var $input = $link.closest('.input-group').find("input"); | 
				
			||||
 | 
					        var min = parseFloat($input.data("min") || 0); | 
				
			||||
 | 
					        var max = parseFloat($input.data("max") || Infinity); | 
				
			||||
 | 
					        var previousQty = parseFloat($input.val() || 0, 10); | 
				
			||||
 | 
					        var quantity = ($link.has(".fa-minus").length ? -1 : 1) + previousQty; | 
				
			||||
 | 
					        var newQty = quantity > min ? (quantity < max ? quantity : max) : min; | 
				
			||||
 | 
					        if (newQty !== previousQty) { | 
				
			||||
 | 
					            $input.val(newQty).trigger('change'); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        return false; | 
				
			||||
 | 
					    }) | 
				
			||||
 | 
					//    Form submit function
 | 
				
			||||
 | 
					    $('#sale_return_form').on('submit', function(submission) { | 
				
			||||
 | 
					        var val = [] | 
				
			||||
 | 
					        submission.preventDefault(); | 
				
			||||
 | 
					        $("tr.order_line").each(function() { | 
				
			||||
 | 
					        var qty = parseFloat($(this).find(".quantity").val() || 0); | 
				
			||||
 | 
					            if (qty !== 0){ | 
				
			||||
 | 
					                    val.push({ 'order_id' : $(this).find(".quantity").data("order-id"), | 
				
			||||
 | 
					                        'line_id' : $(this).find(".quantity").data("line-id"), | 
				
			||||
 | 
					                        'deli_qty' : $(this).find(".quantity").data("delivered_qty"), | 
				
			||||
 | 
					                         'quantity' : $(this).find(".quantity").val(), | 
				
			||||
 | 
					                         'product_id' : $(this).find(".quantity").data('product-id'), | 
				
			||||
 | 
					                         'reason' : $(this).find("#return_reason").val()}); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					        }); | 
				
			||||
 | 
					        if (val.length !== 0){ | 
				
			||||
 | 
					            ajax.jsonRpc('/sale_return', 'call', { | 
				
			||||
 | 
					                        'vals':val, | 
				
			||||
 | 
					            }).then(function(result){ | 
				
			||||
 | 
					                if (result == true){ | 
				
			||||
 | 
					                  window.location.href = '/my/request-thank-you'; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                else{ | 
				
			||||
 | 
					                    alert("Retry again"); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					            }); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        else{ | 
				
			||||
 | 
					            alert("Please specify at least one return quantity"); | 
				
			||||
 | 
					            submission.preventDefault(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    }); | 
				
			||||
 | 
					}); | 
				
			||||
@ -0,0 +1,19 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					<!--    Inheriting res partner form view to add return orders button--> | 
				
			||||
 | 
					    <record id="view_partner_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">res.partner.view.form.inherit.website.multi.product.return.management</field> | 
				
			||||
 | 
					        <field name="model">res.partner</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="base.view_partner_form"/> | 
				
			||||
 | 
					        <field eval="1" name="priority"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//div[@name='button_box']" position="inside"> | 
				
			||||
 | 
					                <button name="action_open_returns" type="object" | 
				
			||||
 | 
					                        class="oe_stat_button" icon="fa-truck" | 
				
			||||
 | 
					                        attrs="{'invisible': [('return_order_count','=', 0)]}"> | 
				
			||||
 | 
					                    <field name="return_order_count" widget="statinfo"/> | 
				
			||||
 | 
					                </button> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,18 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="UTF-8" ?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <!--    Inheriting sale order form view to add retrun orders button--> | 
				
			||||
 | 
					    <record id="view_order_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">sale.order.view.form.inherit.website.multi.product.return.management</field> | 
				
			||||
 | 
					        <field name="model">sale.order</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="sale.view_order_form"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <xpath expr="//div[@name='button_box']" position="inside"> | 
				
			||||
 | 
					                <button name="action_open_returns" type="object" | 
				
			||||
 | 
					                        class="oe_stat_button" icon="fa-truck" | 
				
			||||
 | 
					                        attrs="{'invisible': [('return_order_count','=', 0)]}"> | 
				
			||||
 | 
					                    <field name="return_order_count" widget="statinfo"/> | 
				
			||||
 | 
					                </button> | 
				
			||||
 | 
					            </xpath> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,123 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					<!--    Sale return form view--> | 
				
			||||
 | 
					    <record id="sale_return_view_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">sale.return.view.form</field> | 
				
			||||
 | 
					        <field name="model">sale.return</field> | 
				
			||||
 | 
					        <field name="priority">100</field> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <form> | 
				
			||||
 | 
					                <header> | 
				
			||||
 | 
					                    <button name="action_return_confirm" string="Confirm" class="oe_highlight" | 
				
			||||
 | 
					                            type="object" states="draft"/> | 
				
			||||
 | 
					                    <button name="action_return_cancel" string="Cancel" type="object" states="draft,confirm"/> | 
				
			||||
 | 
					                    <field name="state" widget="statusbar" statusbar_visible="draft,confirm,done"/> | 
				
			||||
 | 
					                </header> | 
				
			||||
 | 
					                <sheet> | 
				
			||||
 | 
					                    <div class="oe_button_box" name="button_box"> | 
				
			||||
 | 
					                        <button name="action_view_picking" type="object" class="oe_stat_button" | 
				
			||||
 | 
					                                icon="fa-pencil-square-o" attrs="{'invisible': [('picking_count', '=', 0)]}"> | 
				
			||||
 | 
					                            <field name="picking_count" widget="statinfo" string="Return Picking"/> | 
				
			||||
 | 
					                        </button> | 
				
			||||
 | 
					                        <button name="action_view_delivery" type="object" class="oe_stat_button" | 
				
			||||
 | 
					                                icon="fa-pencil-square-o" attrs="{'invisible': [('delivery_count', '=', 0)]}"> | 
				
			||||
 | 
					                            <field name="delivery_count" widget="statinfo" string="Delivery order"/> | 
				
			||||
 | 
					                        </button> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="oe_title"> | 
				
			||||
 | 
					                        <h1> | 
				
			||||
 | 
					                            <field name="name"/> | 
				
			||||
 | 
					                        </h1> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <group> | 
				
			||||
 | 
					                        <group> | 
				
			||||
 | 
					                            <field name="sale_order_id"/> | 
				
			||||
 | 
					                            <field name="partner_id"/> | 
				
			||||
 | 
					                        </group> | 
				
			||||
 | 
					                        <group> | 
				
			||||
 | 
					                            <field name="create_date"/> | 
				
			||||
 | 
					                            <field name="user_id"/> | 
				
			||||
 | 
					                            <field name="stock_picking_ids" invisible="1"/> | 
				
			||||
 | 
					                        </group> | 
				
			||||
 | 
					                    </group> | 
				
			||||
 | 
					                    <notebook> | 
				
			||||
 | 
					                         <page string="Return Lines" name="order_line"> | 
				
			||||
 | 
					                             <field name="return_line_ids" context="{'order_id':sale_order_id}"> | 
				
			||||
 | 
					                                <tree editable="bottom"> | 
				
			||||
 | 
					                                    <field name="product_id" /> | 
				
			||||
 | 
					                                    <field name="product_tmpl_id" invisible="1"/> | 
				
			||||
 | 
					                                    <field name="quantity" readonly="1" force_save="1"/> | 
				
			||||
 | 
					                                    <field name="received_qty"/> | 
				
			||||
 | 
					                                    <field name="reason"/> | 
				
			||||
 | 
					                                    <field name="to_refund" optional="hide"/> | 
				
			||||
 | 
					                                </tree> | 
				
			||||
 | 
					                            </field> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                        </page> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                        <page string="Delivery Order" name="delivery_order"> | 
				
			||||
 | 
					                            <field name="source_pick_ids"/> | 
				
			||||
 | 
					                        </page> | 
				
			||||
 | 
					                        <page string="Return Picking" name="return_picking"> | 
				
			||||
 | 
					                            <field name="stock_picking_ids"/> | 
				
			||||
 | 
					                        </page> | 
				
			||||
 | 
					                        <page string="Other" name="other_info"> | 
				
			||||
 | 
					                            <separator colspan="4" string="Other Datails"/> | 
				
			||||
 | 
					                            <field name="note" colspan="4" nolabel="1"/> | 
				
			||||
 | 
					                        </page> | 
				
			||||
 | 
					                    </notebook> | 
				
			||||
 | 
					                </sheet> | 
				
			||||
 | 
					            </form> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					<!--    sale return tree view--> | 
				
			||||
 | 
					    <record id="sale_return_view_tree" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">sale.return.view.tree</field> | 
				
			||||
 | 
					        <field name="model">sale.return</field> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <tree default_order='create_date desc'> | 
				
			||||
 | 
					                <field name="name"/> | 
				
			||||
 | 
					                <field name="sale_order_id"/> | 
				
			||||
 | 
					                <field name="partner_id"/> | 
				
			||||
 | 
					                <field name="create_date"/> | 
				
			||||
 | 
					                <field name="user_id"/> | 
				
			||||
 | 
					                <field name="state"/> | 
				
			||||
 | 
					            </tree> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					<!--    sale return search view--> | 
				
			||||
 | 
					    <record id="sale_return_view_search" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">sale.return.view.search</field> | 
				
			||||
 | 
					        <field name="model">sale.return</field> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <search> | 
				
			||||
 | 
					                <field name="sale_order_id" string="Sale order"/> | 
				
			||||
 | 
					                <field name="partner_id" string="Customer"/> | 
				
			||||
 | 
					                <filter string="Done" name="done" domain="[('state', '=', 'done')]" help="Done order"/> | 
				
			||||
 | 
					                <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/> | 
				
			||||
 | 
					                <separator/> | 
				
			||||
 | 
					                <group expand="0" string="Group By"> | 
				
			||||
 | 
					                    <filter string="Status" name="status" domain="[]" context="{'group_by':'state'}"/> | 
				
			||||
 | 
					                    <filter string="Sale Order" name="order" context="{'group_by':'sale_order_id'}"/> | 
				
			||||
 | 
					                    <filter string="Customer" name="customer" domain="[]" context="{'group_by':'partner_id'}"/> | 
				
			||||
 | 
					                </group> | 
				
			||||
 | 
					            </search> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					<!--    sale return action--> | 
				
			||||
 | 
					    <record id="sale_return_action" model="ir.actions.act_window"> | 
				
			||||
 | 
					        <field name="name">Sale Return</field> | 
				
			||||
 | 
					        <field name="res_model">sale.return</field> | 
				
			||||
 | 
					        <field name="view_mode">tree,form</field> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <field name="help" type="html"> | 
				
			||||
 | 
					            <p class="oe_view_nocontent_create">Create The First Return | 
				
			||||
 | 
					            </p> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					<!--    Return orders menu--> | 
				
			||||
 | 
					    <menuitem id="sale_return_menu" | 
				
			||||
 | 
					              parent="sale.sale_menu_root" | 
				
			||||
 | 
					              name="Return Orders" | 
				
			||||
 | 
					              action="website_multi_product_return_management.sale_return_action"/> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,16 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					<!--    Inheriting stock picking form view--> | 
				
			||||
 | 
					    <record id="view_picking_form" model="ir.ui.view"> | 
				
			||||
 | 
					        <field name="name">stock.picking.view.form.inherit.website.multi.product.return.management</field> | 
				
			||||
 | 
					        <field name="model">stock.picking</field> | 
				
			||||
 | 
					        <field name="inherit_id" ref="stock.view_picking_form"/> | 
				
			||||
 | 
					        <field name="arch" type="xml"> | 
				
			||||
 | 
					            <field name="origin" position="after"> | 
				
			||||
 | 
					                <field name="return_order_id" attrs="{'invisible': [('return_order_id','=', False)]}"/> | 
				
			||||
 | 
					                <field name="return_order_pick_id" attrs="{'invisible': [('return_order_pick_id','=', False)]}"/> | 
				
			||||
 | 
					                <field name="return_order_picking" invisible="1"/> | 
				
			||||
 | 
					            </field> | 
				
			||||
 | 
					        </field> | 
				
			||||
 | 
					    </record> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,343 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <template id="sale_order_portal_content_return" | 
				
			||||
 | 
					              name="Sales Order Portal Content" | 
				
			||||
 | 
					              inherit_id="sale.sale_order_portal_content"> | 
				
			||||
 | 
					        <xpath expr="//div[@id='introduction']/h2" position="replace"> | 
				
			||||
 | 
					            <form id="sale_return_form"> | 
				
			||||
 | 
					                <div id="hidden_box" class="modal fade"> | 
				
			||||
 | 
					                    <div class="modal-dialog modal-content" | 
				
			||||
 | 
					                         style="border:solid 1px #604e5b; min-height:500px;max-width: 800px;"> | 
				
			||||
 | 
					                        <div class="modal-header"> | 
				
			||||
 | 
					                            <h5 class="modal-title"> | 
				
			||||
 | 
					                                <b>Sale Return</b> | 
				
			||||
 | 
					                            </h5> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="modal-body" id="pop_html"> | 
				
			||||
 | 
					                            <form> | 
				
			||||
 | 
					                                <table t-att-data-order-id="sale_order.id" | 
				
			||||
 | 
					                                       t-att-data-token="sale_order.access_token" | 
				
			||||
 | 
					                                       class="table table-sm" | 
				
			||||
 | 
					                                       id="sales_return_order_table"> | 
				
			||||
 | 
					                                    <thead class="bg-100"> | 
				
			||||
 | 
					                                        <tr> | 
				
			||||
 | 
					                                            <th class="text-left">Products</th> | 
				
			||||
 | 
					                                            <th class="text-right">Quantity</th> | 
				
			||||
 | 
					                                            <th class="text-right">Return | 
				
			||||
 | 
					                                                Quantity | 
				
			||||
 | 
					                                            </th> | 
				
			||||
 | 
					                                            <th class="text-right" | 
				
			||||
 | 
					                                                style="width:25px;">Reason | 
				
			||||
 | 
					                                            </th> | 
				
			||||
 | 
					                                        </tr> | 
				
			||||
 | 
					                                    </thead> | 
				
			||||
 | 
					                                    <tbody class="sale_tbody"> | 
				
			||||
 | 
					                                        <tr t-foreach="sale_order.order_line.filtered(lambda x:x.product_id.type!='service' and not x.display_type)" | 
				
			||||
 | 
					                                            t-as="line" class="order_line"> | 
				
			||||
 | 
					                                            <t t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''"> | 
				
			||||
 | 
					                                                <td id="product_name"> | 
				
			||||
 | 
					                                                    <span t-field="line.name"/> | 
				
			||||
 | 
					                                                </td> | 
				
			||||
 | 
					                                                <td class="text-right"> | 
				
			||||
 | 
					                                                    <div id="quote_qty"> | 
				
			||||
 | 
					                                                        <span t-field="line.product_uom_qty"/> | 
				
			||||
 | 
					                                                        <span t-field="line.product_uom"/> | 
				
			||||
 | 
					                                                    </div> | 
				
			||||
 | 
					                                                </td> | 
				
			||||
 | 
					                                                <td> | 
				
			||||
 | 
					                                                    <div class="css_quantity input-group"> | 
				
			||||
 | 
					                                                        <div class="input-group-prepend"> | 
				
			||||
 | 
					                                                            <a t-attf-href="#" | 
				
			||||
 | 
					                                                               class="btn btn-link js_add_json d-none d-md-inline-block" | 
				
			||||
 | 
					                                                               aria-label="Remove one" | 
				
			||||
 | 
					                                                               title="Remove one"> | 
				
			||||
 | 
					                                                                <i class="fa fa-minus"/> | 
				
			||||
 | 
					                                                            </a> | 
				
			||||
 | 
					                                                        </div> | 
				
			||||
 | 
					                                                        <input type="text" | 
				
			||||
 | 
					                                                               class="form-control quantity" | 
				
			||||
 | 
					                                                               style="width: 50px;height: 50px;text-align: center;" | 
				
			||||
 | 
					                                                               t-att-data-min="0" | 
				
			||||
 | 
					                                                               t-att-data-max="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty" | 
				
			||||
 | 
					                                                               t-att-data-line-id="line.id" | 
				
			||||
 | 
					                                                               t-att-data-order-id="sale_order.id" | 
				
			||||
 | 
					                                                               t-att-data-product-id="line.product_id.id" | 
				
			||||
 | 
					                                                               t-att-data-delivered_qty="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty" | 
				
			||||
 | 
					                                                               readonly="1"/> | 
				
			||||
 | 
					                                                        <div class="input-group-append"> | 
				
			||||
 | 
					                                                            <a t-attf-href="#" | 
				
			||||
 | 
					                                                               class="btn btn-link float_left  d-none d-md-inline-block js_add_json" | 
				
			||||
 | 
					                                                               aria-label="Add one" | 
				
			||||
 | 
					                                                               title="Add one"> | 
				
			||||
 | 
					                                                                <i class="fa fa-plus"/> | 
				
			||||
 | 
					                                                            </a> | 
				
			||||
 | 
					                                                        </div> | 
				
			||||
 | 
					                                                    </div> | 
				
			||||
 | 
					                                                </td> | 
				
			||||
 | 
					                                                <td style="width:20px;"> | 
				
			||||
 | 
					                                                    <textarea id="return_reason" | 
				
			||||
 | 
					                                                              name="reason" | 
				
			||||
 | 
					                                                              placeholder="Reason"/> | 
				
			||||
 | 
					                                                </td> | 
				
			||||
 | 
					                                            </t> | 
				
			||||
 | 
					                                        </tr> | 
				
			||||
 | 
					                                    </tbody> | 
				
			||||
 | 
					                                </table> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            </form> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="modal-footer"> | 
				
			||||
 | 
					                            <button id='submit' | 
				
			||||
 | 
					                                    class="btn btn-secondary flex-grow-1 mb-1"> | 
				
			||||
 | 
					                                Submit | 
				
			||||
 | 
					                            </button> | 
				
			||||
 | 
					                            <button type="button" class="btn btn-secondary" | 
				
			||||
 | 
					                                    id="close-button" | 
				
			||||
 | 
					                                    data-dismiss="modal">Close | 
				
			||||
 | 
					                            </button> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="row"> | 
				
			||||
 | 
					                    <div class="col-10"> | 
				
			||||
 | 
					                        <h2 class="my-0"> | 
				
			||||
 | 
					                            <t t-esc="sale_order.type_name"/> | 
				
			||||
 | 
					                            <em t-esc="sale_order.name"/> | 
				
			||||
 | 
					                        </h2> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div class="col-2"> | 
				
			||||
 | 
					                        <span class="btn-group flex-grow-1 mb-1 float-right"> | 
				
			||||
 | 
					                            <t t-if="sale_order.state in ['sale','done'] and sum(sale_order.order_line.mapped('qty_delivered')) > 0"> | 
				
			||||
 | 
					                                <a class="btn btn-secondary btn-block" | 
				
			||||
 | 
					                                   style="color: #FFFFFF;" | 
				
			||||
 | 
					                                   id="hidden_box_btn"> | 
				
			||||
 | 
					                                    <i class="fa fa-truck"/> | 
				
			||||
 | 
					                                    Return | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </t> | 
				
			||||
 | 
					                        </span> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </form> | 
				
			||||
 | 
					        </xpath> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					    <template id="portal_my_home_menu_sale_return" | 
				
			||||
 | 
					              name="Portal layout : Return Order menu entry" | 
				
			||||
 | 
					              inherit_id="portal.portal_breadcrumbs" priority="10"> | 
				
			||||
 | 
					        <xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside"> | 
				
			||||
 | 
					            <li t-if="page_name == 'Sale_Return' or sale_return" | 
				
			||||
 | 
					                t-attf-class="breadcrumb-item #{'active ' if not orders else ''}"> | 
				
			||||
 | 
					                <a t-if="orders" | 
				
			||||
 | 
					                   t-attf-href="/my/return_orders?{{ keep_query() }}">Return | 
				
			||||
 | 
					                    orders | 
				
			||||
 | 
					                </a> | 
				
			||||
 | 
					                <t t-else="">Return Order</t> | 
				
			||||
 | 
					            </li> | 
				
			||||
 | 
					        </xpath> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					    <template id="portal_my_home_sale_return" name="Show Return Order" | 
				
			||||
 | 
					              customize_show="True" | 
				
			||||
 | 
					              inherit_id="portal.portal_my_home" priority="25"> | 
				
			||||
 | 
					        <xpath expr="//div[hasclass('o_portal_docs')]" position="inside"> | 
				
			||||
 | 
					            <t t-call="portal.portal_docs_entry"> | 
				
			||||
 | 
					                <t t-set="title">Return Orders</t> | 
				
			||||
 | 
					                <t t-set="url" t-value="'/my/return_orders'"/> | 
				
			||||
 | 
					                <t t-set="placeholder_count" t-value="'return_count'"/> | 
				
			||||
 | 
					            </t> | 
				
			||||
 | 
					        </xpath> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					    <template id="portal_my_returns" name="Portal: My Sale Return"> | 
				
			||||
 | 
					        <t t-call="portal.portal_layout"> | 
				
			||||
 | 
					            <t t-set="breadcrumbs_searchbar" t-value="True"/> | 
				
			||||
 | 
					            <t t-call="portal.portal_searchbar"> | 
				
			||||
 | 
					                <t t-set="title">Sales Return</t> | 
				
			||||
 | 
					            </t> | 
				
			||||
 | 
					            <t t-if="not orders"> | 
				
			||||
 | 
					                <p>There are currently no return order for your account.</p> | 
				
			||||
 | 
					            </t> | 
				
			||||
 | 
					            <t t-if="orders" t-call="portal.portal_table"> | 
				
			||||
 | 
					                <thead> | 
				
			||||
 | 
					                    <tr class="active"> | 
				
			||||
 | 
					                        <th>Sale Return #</th> | 
				
			||||
 | 
					                        <th class="text-right">Create Date</th> | 
				
			||||
 | 
					                        <th class="text-right">Order</th> | 
				
			||||
 | 
					                        <th class="text-right">State</th> | 
				
			||||
 | 
					                    </tr> | 
				
			||||
 | 
					                </thead> | 
				
			||||
 | 
					                <tbody> | 
				
			||||
 | 
					                    <t t-foreach="orders" t-as="order"> | 
				
			||||
 | 
					                        <tr> | 
				
			||||
 | 
					                            <td> | 
				
			||||
 | 
					                                <a t-att-href="order.get_portal_url()"> | 
				
			||||
 | 
					                                    <t t-esc="order.name"/> | 
				
			||||
 | 
					                                </a> | 
				
			||||
 | 
					                            </td> | 
				
			||||
 | 
					                            <td class="text-right"> | 
				
			||||
 | 
					                                <span t-field="order.create_date"/> | 
				
			||||
 | 
					                            </td> | 
				
			||||
 | 
					                            <td class="text-right"> | 
				
			||||
 | 
					                                <span t-field="order.sale_order_id"/> | 
				
			||||
 | 
					                            </td> | 
				
			||||
 | 
					                            <td class="text-right"> | 
				
			||||
 | 
					                                <t t-if="order.state == 'draft'"> | 
				
			||||
 | 
					                                    <span class="badge bg-warning"><i | 
				
			||||
 | 
					                                            class="fa fa-fw fa-file-text"/>Draft | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </t> | 
				
			||||
 | 
					                                <t t-if="order.state == 'done'"> | 
				
			||||
 | 
					                                    <span class="badge bg-success "><i | 
				
			||||
 | 
					                                            class="fa fa-fw fa-file-text"/>Done | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </t> | 
				
			||||
 | 
					                                <t t-if="order.state == 'confirm'"> | 
				
			||||
 | 
					                                    <span class="badge bg-info"> | 
				
			||||
 | 
					                                        <i | 
				
			||||
 | 
					                                                class="fa fa-fw fa-file-text"/> | 
				
			||||
 | 
					                                        Confirmed | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </t> | 
				
			||||
 | 
					                                <t t-if="order.state == 'cancel'"> | 
				
			||||
 | 
					                                    <span class="badge bg-dark"> | 
				
			||||
 | 
					                                        <i class="fa fa-fw fa-remove"/> | 
				
			||||
 | 
					                                        Cancelled | 
				
			||||
 | 
					                                    </span> | 
				
			||||
 | 
					                                </t> | 
				
			||||
 | 
					                            </td> | 
				
			||||
 | 
					                        </tr> | 
				
			||||
 | 
					                    </t> | 
				
			||||
 | 
					                </tbody> | 
				
			||||
 | 
					            </t> | 
				
			||||
 | 
					        </t> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					    <template id="portal_sale_return_page" name="Portal: My Sale Return"> | 
				
			||||
 | 
					        <t t-call="portal.portal_layout"> | 
				
			||||
 | 
					            <t t-set="sale_return" t-value="orders"/> | 
				
			||||
 | 
					            <div id="optional_placeholder"/> | 
				
			||||
 | 
					            <div class="container"> | 
				
			||||
 | 
					                <div class="row mt16 o_portal_purchase_sidebar"> | 
				
			||||
 | 
					                    <!-- Sidebar --> | 
				
			||||
 | 
					                    <t t-call="portal.portal_record_sidebar"> | 
				
			||||
 | 
					                        <t t-set="classes" | 
				
			||||
 | 
					                           t-value="'col-lg-auto d-print-none'"/> | 
				
			||||
 | 
					                        <t t-set="title"> | 
				
			||||
 | 
					                            <h2 class="mb-0"> | 
				
			||||
 | 
					                                <b t-field="sale_return.name" | 
				
			||||
 | 
					                                   data-id="return_name"/> | 
				
			||||
 | 
					                            </h2> | 
				
			||||
 | 
					                        </t> | 
				
			||||
 | 
					                        <t t-set="entries"> | 
				
			||||
 | 
					                            <ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column"> | 
				
			||||
 | 
					                                <li class="list-group-item flex-grow-1"> | 
				
			||||
 | 
					                                    <div class="o_download_pdf btn-toolbar flex-sm-nowrap"> | 
				
			||||
 | 
					                                        <div class="btn-group flex-grow-1 mr-1 mb-1"> | 
				
			||||
 | 
					                                            <a class="btn btn-secondary btn-block o_download_btn" | 
				
			||||
 | 
					                                               t-att-href="sale_return.get_portal_url(report_type='pdf', download=True)" | 
				
			||||
 | 
					                                               title="Download"> | 
				
			||||
 | 
					                                                <i class="fa fa-download"/> | 
				
			||||
 | 
					                                                Download | 
				
			||||
 | 
					                                            </a> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <div class="btn-group flex-grow-1 mb-1"> | 
				
			||||
 | 
					                                            <a class="btn btn-secondary btn-block o_print_btn o_portal_invoice_print" | 
				
			||||
 | 
					                                               t-att-href="sale_return.get_portal_url(report_type='pdf')" | 
				
			||||
 | 
					                                               id="print_invoice_report" | 
				
			||||
 | 
					                                               title="Print" target="_blank"> | 
				
			||||
 | 
					                                                <i | 
				
			||||
 | 
					                                                        class="fa fa-print"/> | 
				
			||||
 | 
					                                                Print | 
				
			||||
 | 
					                                            </a> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </li> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                                <li t-if="sale_return.user_id" | 
				
			||||
 | 
					                                    class="list-group-item flex-grow-1"> | 
				
			||||
 | 
					                                    <div class="small mb-1"> | 
				
			||||
 | 
					                                        <strong class="text-muted"> | 
				
			||||
 | 
					                                            Representative | 
				
			||||
 | 
					                                        </strong> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                    <div class="row flex-nowrap"> | 
				
			||||
 | 
					                                        <div class="col flex-grow-0 pr-2"> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                        <div class="col pl-0" | 
				
			||||
 | 
					                                             style="min-width: 150px"> | 
				
			||||
 | 
					                                            <span t-field="sale_return.user_id" | 
				
			||||
 | 
					                                                  t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/> | 
				
			||||
 | 
					                                            <a href="#discussion" class="small"> | 
				
			||||
 | 
					                                                <i class="fa fa-comment"/> | 
				
			||||
 | 
					                                                Send | 
				
			||||
 | 
					                                                message | 
				
			||||
 | 
					                                            </a> | 
				
			||||
 | 
					                                        </div> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </li> | 
				
			||||
 | 
					                            </ul> | 
				
			||||
 | 
					                        </t> | 
				
			||||
 | 
					                    </t> | 
				
			||||
 | 
					                    <div class=" col-lg col-12 justify-content-end w-100"> | 
				
			||||
 | 
					                        <div class="card pb-5"> | 
				
			||||
 | 
					                            <div class="card-header bg-white pb-1"> | 
				
			||||
 | 
					                                <div class="row"> | 
				
			||||
 | 
					                                    <div class="col-lg-12"> | 
				
			||||
 | 
					                                        <h2 class="font-weight-normal"> | 
				
			||||
 | 
					                                            <t t-if="orders.state in ['draft']"> | 
				
			||||
 | 
					                                                Draft Return | 
				
			||||
 | 
					                                            </t> | 
				
			||||
 | 
					                                            <t t-else="1"> | 
				
			||||
 | 
					                                                Sale Return | 
				
			||||
 | 
					                                            </t> | 
				
			||||
 | 
					                                            <span class="font-italic" | 
				
			||||
 | 
					                                                  t-esc="orders.name"/> | 
				
			||||
 | 
					                                        </h2> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                            <div class="card-body"> | 
				
			||||
 | 
					                                <div class="mb-4"> | 
				
			||||
 | 
					                                    <strong>Creation Date:</strong> | 
				
			||||
 | 
					                                    <span t-field="orders.create_date" | 
				
			||||
 | 
					                                          t-options='{"widget": "date"}'/> | 
				
			||||
 | 
					                                    <br/> | 
				
			||||
 | 
					                                    <div t-att-class="'d-inline' if orders.sale_order_id else 'd-none'"> | 
				
			||||
 | 
					                                        <strong>Sale Order:</strong> | 
				
			||||
 | 
					                                        <span class="ml-1" | 
				
			||||
 | 
					                                              t-field="orders.sale_order_id"/> | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                                <h3 class="font-weight-normal">Returns</h3> | 
				
			||||
 | 
					                                <table class="table table-sm"> | 
				
			||||
 | 
					                                    <thead class="bg-100"> | 
				
			||||
 | 
					                                        <tr> | 
				
			||||
 | 
					                                            <th>Products</th> | 
				
			||||
 | 
					                                            <th class="text-right">Quantity</th> | 
				
			||||
 | 
					                                            <th class="text-right">Reason</th> | 
				
			||||
 | 
					                                        </tr> | 
				
			||||
 | 
					                                    </thead> | 
				
			||||
 | 
					                                    <tbody> | 
				
			||||
 | 
					                                        <tr t-foreach="orders.return_line_ids" | 
				
			||||
 | 
					                                            t-as="line"> | 
				
			||||
 | 
					                                            <td> | 
				
			||||
 | 
					                                                <span t-esc="line.product_id.name"/> | 
				
			||||
 | 
					                                            </td> | 
				
			||||
 | 
					                                            <td class="text-right"> | 
				
			||||
 | 
					                                                <span t-esc="line.received_qty"/> | 
				
			||||
 | 
					                                            </td> | 
				
			||||
 | 
					                                            <td class="text-right"> | 
				
			||||
 | 
					                                                <span t-esc="line.reason"/> | 
				
			||||
 | 
					                                            </td> | 
				
			||||
 | 
					                                        </tr> | 
				
			||||
 | 
					                                    </tbody> | 
				
			||||
 | 
					                                </table> | 
				
			||||
 | 
					                                <div class="row"/> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					            <div class="oe_structure mb32"/> | 
				
			||||
 | 
					        </t> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					</odoo> | 
				
			||||
@ -0,0 +1,28 @@ | 
				
			|||||
 | 
					<?xml version="1.0" encoding="utf-8" ?> | 
				
			||||
 | 
					<odoo> | 
				
			||||
 | 
					    <template id="customers_request_thank_page" name="Customer Request Thank"> | 
				
			||||
 | 
					        <t t-call="website.layout"> | 
				
			||||
 | 
					            <div class="oe_structure"> | 
				
			||||
 | 
					                <div class="contain"> | 
				
			||||
 | 
					                    <div id="wrap"> | 
				
			||||
 | 
					                        <div class="oe_structure" id="oe_structure_website_form_contact_us_thanks_1"/> | 
				
			||||
 | 
					                        <div class="container pt-3"> | 
				
			||||
 | 
					                            <h1>Thanks!</h1> | 
				
			||||
 | 
					                            <div class="row"> | 
				
			||||
 | 
					                                <div class="col-lg-12"> | 
				
			||||
 | 
					                                    <div class="alert alert-success" role="status"> | 
				
			||||
 | 
					                                        Your order for return has been sent successfully. | 
				
			||||
 | 
					                                    </div> | 
				
			||||
 | 
					                                    <p> | 
				
			||||
 | 
					                                        We will get back to you shortly. | 
				
			||||
 | 
					                                    </p> | 
				
			||||
 | 
					                                </div> | 
				
			||||
 | 
					                            </div> | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="oe_structure" id="oe_structure_website_form_contact_us_thanks_2"/> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </t> | 
				
			||||
 | 
					    </template> | 
				
			||||
 | 
					</odoo> | 
				
			||||