| @ -0,0 +1,44 @@ | |||||
|  | .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg | ||||
|  |     :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html | ||||
|  |     :alt: License: AGPL-3 | ||||
|  | 
 | ||||
|  | Website Return Order Management | ||||
|  | =============================== | ||||
|  | * Website Return Order Management module for Odoo 15 | ||||
|  | 
 | ||||
|  | Installation | ||||
|  | ============ | ||||
|  | - https://www.odoo.com/documentation/17.0/administration/install.html | ||||
|  | - Install our custom addon | ||||
|  | 
 | ||||
|  | Company | ||||
|  | ------- | ||||
|  | * 'Cybrosys Techno Solutions <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Credits | ||||
|  | ------- | ||||
|  | * Developer: | ||||
|  | (v14) Shijin @ Cybrosys | ||||
|  | (v15) Sabeel @ Cybrosys | ||||
|  | (v16) Rosmy @ Cybrosys | ||||
|  | 
 | ||||
|  | Contacts | ||||
|  | -------- | ||||
|  | * Mail Contact : odoo@cybrosys.com | ||||
|  | 
 | ||||
|  | Bug Tracker | ||||
|  | ----------- | ||||
|  | Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | ||||
|  | 
 | ||||
|  | Maintainer | ||||
|  | ========== | ||||
|  | .. 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,24 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU AFFERO | ||||
|  | #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|  | #    (AGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | from . import controllers | ||||
|  | from . import models | ||||
|  | from . import wizard | ||||
| @ -0,0 +1,55 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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': 'Website Return Order Management', | ||||
|  |     'version': '15.0.1.0.0', | ||||
|  |     'category': 'Website', | ||||
|  |     'summary': 'Sale Order Return Management from Website', | ||||
|  |     'description': """Website 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'], | ||||
|  |     'data': [ | ||||
|  |         'security/ir.model.access.csv', | ||||
|  |         'data/ir_sequence.xml', | ||||
|  |         'views/website_thankyou_templates.xml', | ||||
|  |         'views/portal_templates.xml', | ||||
|  |         'views/sale_return_views.xml', | ||||
|  |         'views/sale_order_views.xml', | ||||
|  |         'views/res_partner_views.xml', | ||||
|  |         'views/stock_picking_views.xml', | ||||
|  |         'report/website_return_management_reports.xml' | ||||
|  |     ], | ||||
|  |     'assets': { | ||||
|  |         'web.assets_frontend': [ | ||||
|  |             'website_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,23 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 portal | ||||
|  | from . import website_return_management | ||||
| @ -0,0 +1,136 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 import http | ||||
|  | from odoo.http import request | ||||
|  | from odoo.exceptions import AccessError, MissingError | ||||
|  | from odoo.tools import image_process | ||||
|  | from odoo.tools.translate import _ | ||||
|  | from odoo.addons.portal.controllers.portal import CustomerPortal | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class ReturnCustomerPortal(CustomerPortal): | ||||
|  |     """Class to show return orders on portal pages""" | ||||
|  |     def _prepare_home_portal_values(self, counters): | ||||
|  |         """Fetch total count of sale_return records""" | ||||
|  |         values = super()._prepare_home_portal_values(counters) | ||||
|  |         if 'return_count' in counters: | ||||
|  |             values['return_count'] = request.env['sale.return'].search_count([ | ||||
|  |                 ('state', 'in', ['draft', 'confirm', 'done', 'cancel'])]) | ||||
|  |         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): | ||||
|  |         """Return History in my accounts""" | ||||
|  |         values = self._prepare_portal_layout_values() | ||||
|  |         sale_return = request.env['sale.return'] | ||||
|  |         domain = [] | ||||
|  |         searchbar_sortings = { | ||||
|  |             'date': {'label': _('Newest'), 'order': 'create_date desc'}, | ||||
|  |             'name': {'label': _('Name'), 'order': 'name'}, | ||||
|  |             'sale': {'label': _('Sale Order'), 'order': 'sale_order'}, | ||||
|  |         } | ||||
|  |         # default sort by value | ||||
|  |         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'] | ||||
|  |         # pager | ||||
|  |         pager = request.website.pager( | ||||
|  |             url="/my/return_orders", | ||||
|  |             url_args={'date_begin': date_begin, 'date_end': date_end, | ||||
|  |                       'sortby': sortby}, | ||||
|  |             total=sale_return.search_count(domain), | ||||
|  |             page=page, | ||||
|  |             step=self._items_per_page | ||||
|  |         ) | ||||
|  |         # content according to pager and archive selected | ||||
|  |         orders = sale_return.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_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): | ||||
|  |         """Passing datas for detailed display in my account""" | ||||
|  |         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_return_management.' | ||||
|  |                                                 'report_sale_returns', | ||||
|  |                                      download=download) | ||||
|  |         values = self._sale_return_get_page_view_values(order_sudo, | ||||
|  |                                                         access_token, **kw) | ||||
|  |         return (request.render | ||||
|  |                 ("website_return_management.portal_sale_return_page", values)) | ||||
|  | 
 | ||||
|  |     def _sale_return_get_page_view_values(self, order, access_token, **kwargs): | ||||
|  |         def resize_to_48(b64source): | ||||
|  |             """Converting product images""" | ||||
|  |             if not b64source: | ||||
|  |                 b64source = request.env['ir.binary']._placeholder() | ||||
|  |             else: | ||||
|  |                 b64source = base64.b64decode(b64source) | ||||
|  |             return base64.b64encode(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,88 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 import http, _ | ||||
|  | from odoo.http import request | ||||
|  | from odoo.addons.website.controllers import main | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class CustomerRegistration(main.Home): | ||||
|  |     """Class to manage and create website return orders""" | ||||
|  |     @http.route('/sale_return', type='json', methods=['POST'], | ||||
|  |                 auth="public", website=True, | ||||
|  |                 csrf=False) | ||||
|  |     def sale_return(self, **kwargs): | ||||
|  |         """Controller to create return order""" | ||||
|  |         product_id = request.env['product.product'].sudo().search([ | ||||
|  |             ('id', '=', int(kwargs['product']))]) | ||||
|  |         order = request.env['sale.order'].sudo().search([ | ||||
|  |             ('id', '=', int(kwargs['order_id']))]) | ||||
|  |         values = { | ||||
|  |             'partner_id': order.partner_id.id, | ||||
|  |             'sale_order_id': order.id, | ||||
|  |             'product_id': product_id.id, | ||||
|  |             'quantity': kwargs['qty'], | ||||
|  |             'reason': kwargs['reason'], | ||||
|  |             'user_id': request.env.uid, | ||||
|  |             'create_date': datetime.now(), | ||||
|  |         } | ||||
|  |         stock_picks = request.env['stock.picking'].search([ | ||||
|  |             ('origin', '=', order.name)]) | ||||
|  |         moves = (stock_picks.mapped('move_ids_without_package').filtered | ||||
|  |                  (lambda p: p.product_id == product_id)) | ||||
|  |         if moves: | ||||
|  |             moves = moves.sorted('product_uom_qty', reverse=True) | ||||
|  |             values.update({'state': 'draft'}) | ||||
|  |             ret_order = request.env['sale.return'].create(values) | ||||
|  |             ret_order.return_confirm() | ||||
|  |             moves[0].picking_id.return_order_id = ret_order.id | ||||
|  |             moves[0].picking_id.return_order_picking = False | ||||
|  |         return True | ||||
|  | 
 | ||||
|  |     @http.route('/order_quantity', auth='public', type='json', | ||||
|  |                 website=True) | ||||
|  |     def return_quantity(self, **kwargs): | ||||
|  |         """Check the existing records for total returned quantity""" | ||||
|  |         current_order = (request.env['sale.order'].sudo().browse | ||||
|  |                          (int(kwargs['current_order']))) | ||||
|  |         for rec in current_order.order_line.filtered( | ||||
|  |                 lambda ids: ids.product_id.id == int( | ||||
|  |                     kwargs['product_id'])): | ||||
|  |             return_order = request.env['sale.return'].sudo().search([ | ||||
|  |                 ('sale_order_id', '=', current_order.id), | ||||
|  |                 ('product_id', '=', int(kwargs['product_id'])), | ||||
|  |                 ('state', 'in', ('confirm', 'done'))]) | ||||
|  |             if return_order: | ||||
|  |                 remaining_qty = rec.qty_delivered - sum( | ||||
|  |                     return_order.mapped('quantity')) | ||||
|  |                 if remaining_qty == 0: | ||||
|  |                     rec.return_qty = True | ||||
|  |                 return remaining_qty | ||||
|  |             else: | ||||
|  |                 return rec.qty_delivered | ||||
|  | 
 | ||||
|  |     @http.route('/my/request-thank-you', website=True, page=True, | ||||
|  |                 auth='public', csrf=False) | ||||
|  |     def maintenance_request_thanks(self): | ||||
|  |         """Thank you page""" | ||||
|  |         return (request.render | ||||
|  |                 ('website_return_management.customers_request_thank_page')) | ||||
| @ -0,0 +1,13 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | <odoo> | ||||
|  |     <data> | ||||
|  | <!--         Sequence Number For Sale Return--> | ||||
|  |         <record id="seq_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,5 @@ | |||||
|  | ## Module <website_return_management> | ||||
|  | #### 16.02.2024 | ||||
|  | #### Version 15.0.1.0.0 | ||||
|  | 
 | ||||
|  | - Initial Commit for Website Return Order Management | ||||
| @ -0,0 +1,25 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 sale_order | ||||
|  | from . import res_partner | ||||
|  | from . import sale_return | ||||
|  | from . import stock_picking | ||||
| @ -0,0 +1,63 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 to show sale_return count""" | ||||
|  |     _inherit = 'res.partner' | ||||
|  | 
 | ||||
|  |     return_order_count = fields.Integer(compute="_compute_returns", | ||||
|  |                                         string='Return Orders', | ||||
|  |                                         help="Fetch return order count") | ||||
|  | 
 | ||||
|  |     def _compute_returns(self): | ||||
|  |         """Function to calculate the return count""" | ||||
|  |         all_partners = self.with_context(active_test=False).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.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_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,65 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 to add internal link and counts of sale_return""" | ||||
|  |     _inherit = 'sale.order' | ||||
|  | 
 | ||||
|  |     return_order_count = fields.Integer(compute="_compute_returns", | ||||
|  |                                         string='Return Orders', | ||||
|  |                                         help="Fetch return order count") | ||||
|  | 
 | ||||
|  |     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.browse() | ||||
|  |         for group in sale_return_groups: | ||||
|  |             sale_order = self.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_return_management.sale_return_action')) | ||||
|  |         domain = [('sale_order_id', '=', self.id)] | ||||
|  |         action['domain'] = domain | ||||
|  |         action['context'] = {'search_default_order': 1} | ||||
|  |         return action | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class SaleOrderLine(models.Model): | ||||
|  |     """Inherit sale order line to add a new field""" | ||||
|  |     _inherit = 'sale.order.line' | ||||
|  | 
 | ||||
|  |     return_qty = fields.Boolean(string="Return Qty", | ||||
|  |                                 help="Hide the product from returning") | ||||
| @ -0,0 +1,264 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 SaleReturn(models.Model): | ||||
|  |     _name = 'sale.return' | ||||
|  |     _inherit = ['portal.mixin'] | ||||
|  |     _rec_name = "name" | ||||
|  |     _order = "name" | ||||
|  |     _description = "Sale Return" | ||||
|  | 
 | ||||
|  |     @api.model | ||||
|  |     def _get_default_name(self): | ||||
|  |         """Default value for name field""" | ||||
|  |         return self.env['ir.sequence'].get('sale.return') | ||||
|  | 
 | ||||
|  |     active = fields.Boolean('Active', default=True, | ||||
|  |                             help="Show Active Record") | ||||
|  |     name = fields.Char(string="Name", default=_get_default_name, | ||||
|  |                        help="Name Field") | ||||
|  |     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 template relation") | ||||
|  |     sale_order_id = fields.Many2one('sale.order', | ||||
|  |                                     string="Sale Order", | ||||
|  |                                     required=True, help="Sale order relation") | ||||
|  |     partner_id = fields.Many2one('res.partner', string="Customer", | ||||
|  |                                  help="Res partner relation") | ||||
|  |     user_id = fields.Many2one('res.users', string="Responsible", | ||||
|  |                               default=lambda self: self.env.user, | ||||
|  |                               help="Res user relation") | ||||
|  |     create_date = fields.Datetime(string="Create Date", help="Create Date") | ||||
|  |     quantity = fields.Float(string="Quantity", default=0, | ||||
|  |                             help="Number of quantity") | ||||
|  |     received_qty = fields.Float(string="Received Quantity", | ||||
|  |                                 help="Number of received quantity") | ||||
|  |     reason = fields.Text("Reason", help="Reason to add") | ||||
|  |     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="Picking count") | ||||
|  |     delivery_count = fields.Integer(compute="_compute_delivery", | ||||
|  |                                     string='Delivery Order', copy=False, | ||||
|  |                                     default=0, | ||||
|  |                                     store=True, | ||||
|  |                                     help="Delivery Count") | ||||
|  |     state = fields.Selection([('draft', 'Draft'), | ||||
|  |                               ('confirm', 'Confirm'), ('done', 'Done'), | ||||
|  |                               ('cancel', 'Canceled')], | ||||
|  |                              string='Status', readonly=True, default='draft', | ||||
|  |                              help="State") | ||||
|  |     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 field") | ||||
|  |     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') | ||||
|  | 
 | ||||
|  |     def return_confirm(self): | ||||
|  |         """Confirm the sale return""" | ||||
|  |         if not self.source_pick_ids: | ||||
|  |             stock_picks = self.env['stock.picking'].search([ | ||||
|  |                 ('origin', '=', self.sale_order_id.name)]) | ||||
|  |             moves = (stock_picks.mapped('move_ids_without_package').filtered | ||||
|  |                      (lambda p: p.product_id == self.product_id)) | ||||
|  |         else: | ||||
|  |             moves = (self.source_pick_ids.mapped | ||||
|  |                      ('move_ids_without_package').filtered | ||||
|  |                      (lambda p: p.product_id == self.product_id)) | ||||
|  |         if moves: | ||||
|  |             moves = moves.sorted('product_uom_qty', reverse=True) | ||||
|  |             return_pick_wizard = (self.env['stock.return.picking'].create | ||||
|  |                                   ({'picking_id': moves[0].picking_id.id})) | ||||
|  |             return_pick_wizard._onchange_picking_id() | ||||
|  |             return_pick_wizard.product_return_moves.unlink() | ||||
|  |             lines = {'product_id': self.product_id.id, | ||||
|  |                      "quantity": self.quantity, | ||||
|  |                      'wizard_id': return_pick_wizard.id, | ||||
|  |                      'move_id': moves[0].id, 'to_refund': self.to_refund} | ||||
|  |             self.env['stock.return.picking.line'].create(lines) | ||||
|  |             return_pick = return_pick_wizard._create_returns() | ||||
|  |             if return_pick: | ||||
|  |                 return_pick = self.env['stock.picking'].browse(return_pick[0]) | ||||
|  |                 return_pick.update({'note': self.reason}) | ||||
|  |                 return_pick.write({'return_order_id': False, | ||||
|  |                                    'return_order_pick_id': self.id, | ||||
|  |                                    'return_order_picking': True}) | ||||
|  |                 self.write({'state': 'confirm'}) | ||||
|  | 
 | ||||
|  |     def return_cancel(self): | ||||
|  |         """Cancel the return""" | ||||
|  |         self.write({'state': 'cancel'}) | ||||
|  |         if self.source_pick_ids: | ||||
|  |             for rec in (self.source_pick_ids.filtered(lambda s: | ||||
|  |                                                       s.state not in | ||||
|  |                                                       ['done', 'cancel'])): | ||||
|  |                 rec.action_cancel() | ||||
|  | 
 | ||||
|  |     def _get_report_base_filename(self): | ||||
|  |         """Fetch report name""" | ||||
|  |         self.ensure_one() | ||||
|  |         return 'Sale Return - %s' % (self.name) | ||||
|  | 
 | ||||
|  |     def _compute_access_url(self): | ||||
|  |         """URL accessing""" | ||||
|  |         super(SaleReturn, 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'].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'].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'].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.filtered | ||||
|  |                       (lambda x: x.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('stock_picking_ids') | ||||
|  |         if not self.stock_picking_ids: | ||||
|  |             pickings = self.env['stock.picking'].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 x: | ||||
|  |                                         x.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', 'source_pick') | ||||
|  |     def onchange_sale_order(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'].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': [('id', 'in', delivery)], | ||||
|  |                            'product_id': [('id', 'in', product_ids)]}} | ||||
|  | 
 | ||||
|  |     @api.onchange('product_id') | ||||
|  |     def onchange_product_id(self): | ||||
|  |         """Return Stock Valuation""" | ||||
|  |         if self.product_id and self.source_pick_ids: | ||||
|  |             moves = (self.source_pick_ids.mapped('move_ids_without_package'). | ||||
|  |                      filtered(lambda p: p.product_id == self.product_id)) | ||||
|  |             if moves: | ||||
|  |                 self.received_qty = sum(moves.mapped('quantity_done')) | ||||
| @ -0,0 +1,72 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 to add new fields regarding return orders""" | ||||
|  |     _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): | ||||
|  |         """Supering Validate Button function""" | ||||
|  |         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: | ||||
|  |                     for line in (rec.return_order_pick_id.sale_order_id. | ||||
|  |                             order_line.filtered( | ||||
|  |                             lambda ids: ids.product_id.id == rec. | ||||
|  |                                     return_order_pick_id.product_id.id)): | ||||
|  |                         return_order = self.env[ | ||||
|  |                             'sale.return'].sudo().search( | ||||
|  |                             [('sale_order_id', '=', | ||||
|  |                               rec.return_order_pick_id.sale_order_id.id), | ||||
|  |                              ('product_id', '=', | ||||
|  |                               rec.return_order_pick_id.product_id.id), | ||||
|  |                              ('state', '=', 'done')]) | ||||
|  |                         if (return_order and ( | ||||
|  |                                 sum(return_order.mapped('quantity')) + | ||||
|  |                                 rec.return_order_pick_id.quantity) == | ||||
|  |                                 line.qty_delivered): | ||||
|  |                             line.return_qty = True | ||||
|  |                         elif (rec.return_order_pick_id.quantity == | ||||
|  |                               line.qty_delivered): | ||||
|  |                             line.return_qty = True | ||||
|  |                     rec.return_order_pick_id.state = 'done' | ||||
|  |         return res | ||||
| @ -0,0 +1,77 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <data> | ||||
|  |           <!--    PDF report action--> | ||||
|  |         <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_return_management.report_salereturn</field> | ||||
|  |             <field name="report_file">website_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> | ||||
|  | <!--        Calling template--> | ||||
|  |         <template id="report_salereturn"> | ||||
|  |             <t t-call="web.html_container"> | ||||
|  |                 <t t-foreach="docs" t-as="doc"> | ||||
|  |                     <t t-call="website_return_management.report_sale_return" t-lang="doc.partner_id.lang"/> | ||||
|  |                 </t> | ||||
|  |             </t> | ||||
|  |         </template> | ||||
|  | <!--        PDF 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"> | ||||
|  |                         <thead style="display: table-row-group"> | ||||
|  |                             <tr> | ||||
|  |                                 <th name="th_description" class="text-left">Product</th> | ||||
|  |                                 <th name="th_quantity" class="text-right">Quantity</th> | ||||
|  |                             </tr> | ||||
|  |                         </thead> | ||||
|  |                         <tbody class="sale_tbody"> | ||||
|  |                             <tr t-att-class="'bg-200 font-weight-bold'"> | ||||
|  |                                 <td name="td_product"><span t-field="doc.product_id"/></td> | ||||
|  |                                 <td name="td_quantity" class="text-right"> | ||||
|  |                                     <span t-field="doc.quantity"/> | ||||
|  |                                     <span t-field="doc.product_id.uom_id"/> | ||||
|  |                                 </td> | ||||
|  |                             </tr> | ||||
|  |                         </tbody> | ||||
|  |                     </table> | ||||
|  |                     <div t-if="doc.partner_id" class="col-auto col-3 mw-100 mb-2"> | ||||
|  |                         <strong>Reason:</strong> | ||||
|  |                         <p class="m-0" t-field="doc.reason"/> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             </t> | ||||
|  |         </template> | ||||
|  |     </data> | ||||
|  | </odoo> | ||||
| 
 | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| 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: 6.3 KiB | 
| 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: 59 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 56 KiB | 
| After Width: | Height: | Size: 58 KiB | 
| After Width: | Height: | Size: 280 KiB | 
| After Width: | Height: | Size: 119 KiB | 
| After Width: | Height: | Size: 67 KiB | 
| After Width: | Height: | Size: 87 KiB | 
| After Width: | Height: | Size: 95 KiB | 
| After Width: | Height: | Size: 203 KiB | 
| After Width: | Height: | Size: 40 KiB | 
| After Width: | Height: | Size: 134 KiB | 
| After Width: | Height: | Size: 123 KiB | 
| After Width: | Height: | Size: 119 KiB | 
| After Width: | Height: | Size: 101 KiB | 
| After Width: | Height: | Size: 269 KiB | 
| After Width: | Height: | Size: 69 KiB | 
| After Width: | Height: | Size: 86 KiB | 
| After Width: | Height: | Size: 106 KiB | 
| After Width: | Height: | Size: 94 KiB | 
| After Width: | Height: | Size: 9.6 KiB | 
| @ -0,0 +1,832 @@ | |||||
|  | <div class="container" | ||||
|  |      style="padding: 1rem !important; margin-bottom: 1rem !important;"> | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between" | ||||
|  |              style="border-bottom: 1px solid #d5d5d5;"> | ||||
|  |             <div class="my-3"> | ||||
|  |                 <img src="./assets/icons/logo.png" | ||||
|  |                      style="width: auto !important; height: 40px !important;"> | ||||
|  |             </div> | ||||
|  |             <div class="my-3 d-flex align-items-center"> | ||||
|  |                 <div | ||||
|  |                         style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;"> | ||||
|  |                     <i class="fa fa-check mr-1"></i>Community | ||||
|  |                 </div> | ||||
|  |                 <div | ||||
|  |                         style="background-color: #875A7B !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;"> | ||||
|  |                     <i class="fa fa-check mr-1"></i>Enterprise | ||||
|  |                 </div> | ||||
|  | 
 | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | <div class="container" style="padding: 0rem 1.5rem 4rem !important"> | ||||
|  |     <div class="row" style="height: 950px !important;"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12" | ||||
|  |              style="padding: 4.1rem 1rem !important; background-color: #FFFFFF !important; height: 600px !important;"> | ||||
|  |             <div class="d-flex justify-content-center mb-2"> | ||||
|  |                 <h1 | ||||
|  |                         style="font-family: 'Montserrat', sans-serif !important; font-weight: 800 !important; color: #282F33 !important;  font-size: 4rem !important; text-align: center !important;"> | ||||
|  |                     Website Return Order Management</h1> | ||||
|  |             </div> | ||||
|  |             <p | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-weight: 300 !important; color: #282F33 !important;  font-size: 1.4rem !important; text-align: center !important;"> | ||||
|  |                 Manage Sale Order return from Website | ||||
|  |             </p> | ||||
|  |             <img src="./assets/screenshots/hero.gif" class="img-responsive" | ||||
|  |                  width="100%" height="700px"/> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12 px-3 text-center"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 1.4rem; font-weight: 700 !important;"> | ||||
|  |                 Explore this module</h2> | ||||
|  |             <div class="mt-3"> | ||||
|  |                 <a href="#overview" class="mr-5" | ||||
|  |                    style="font-family: 'Montserrat', sans-serif !important; font-size: 1rem; font-weight: 700; color: #714B67 !important;">Overview | ||||
|  |                     <i class="fa fa-chevron-right ml-1" | ||||
|  |                        style="color: #714B67 !important;"></i></a> | ||||
|  |                 <a href="#features" class="mr-5" | ||||
|  |                    style="font-family: 'Montserrat', sans-serif !important; font-size: 1rem; font-weight: 700; color: #714B67 !important;">Key | ||||
|  |                     Features <i class="fa fa-chevron-right ml-1" | ||||
|  |                                 style="color: #714B67 !important;"></i></a> | ||||
|  |                 <a href="#screenshots" class="mr-5" | ||||
|  |                    style="font-family: 'Montserrat', sans-serif !important; font-size: 1rem; font-weight: 700; color: #714B67 !important;">Screenshots | ||||
|  |                     <i class="fa fa-chevron-right ml-1" | ||||
|  |                        style="color: #714B67 !important;"></i></a> | ||||
|  |             </div> | ||||
|  |             <hr class="my-5" style="border-color: d5d5d5 !important;"/> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  |     <div class="row " id="overview"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12 px-4"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |                 Overview</h2> | ||||
|  |             <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  |             <p class="mt-4" | ||||
|  |                style="font-size: 1.1rem !important; color: #282F33 !important; font-weight: 400 !important; line-height: 1.85 !important"> | ||||
|  |                 This module enables the creation and management of sales order returns on the website. | ||||
|  |                 Authorized individuals have the capability to oversee return orders. | ||||
|  |                 Additionally, portal users can view their return orders through the account portal view | ||||
|  |             </p> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  |     <div class="row" id="features" style="margin-top: 3rem;"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12 px-4"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |                 Features</h2> | ||||
|  |             <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  |             <div class="row"> | ||||
|  |                 <div class="col-sm-12 col-md-6"> | ||||
|  |                     <div class="d-flex my-5" | ||||
|  |                          style="padding-bottom: 1.3rem !important; border-bottom: 2px solid #f0f0f0;"> | ||||
|  |                         <img src="assets/icons/check.png" width="24px" | ||||
|  |                              height="24px" class="mr-2"> | ||||
|  |                         <h3 style="font-size: 1.2rem !important;">Create Return | ||||
|  |                             Orders From Website</h3> | ||||
|  |                         <span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 12px;">Customers can create return order from Portal/My Account and cangenerate return | ||||
|  |                             order in backend by clicking the "Return" button to return item from the current order</span> | ||||
|  |                     </div> | ||||
|  | 
 | ||||
|  |                     <div class="d-flex my-5" | ||||
|  |                          style="padding-bottom: 1.3rem !important; border-bottom: 2px solid #f0f0f0;"> | ||||
|  |                         <img src="assets/icons/check.png" width="24px" | ||||
|  |                              height="24px" class="mr-2"> | ||||
|  |                         <h3 style="font-size: 1.2rem !important;">Portal Return | ||||
|  |                             Order View</h3> | ||||
|  |                         <span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;">Customers can view the list of their return orders from My Account.</span> | ||||
|  |                     </div> | ||||
|  | 
 | ||||
|  |                     <div class="d-flex my-5" | ||||
|  |                          style="padding-bottom: 1.3rem !important; border-bottom: 2px solid #f0f0f0;"> | ||||
|  |                         <img src="assets/icons/check.png" width="24px" | ||||
|  |                              height="24px" class="mr-2"> | ||||
|  |                         <h3 style="font-size: 1.2rem !important;">Link Return | ||||
|  |                             With Sale Order</h3> | ||||
|  |                         <span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;">Easily switch the return orders from sale order by clicking the | ||||
|  |                             return smart button in the sale order.</span> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |                 <div class="col-sm-12 col-md-6"> | ||||
|  |                     <div class="d-flex my-5" | ||||
|  |                          style="padding-bottom: 1.3rem !important; border-bottom: 2px solid #f0f0f0;"> | ||||
|  |                         <img src="assets/icons/check.png" width="24px" | ||||
|  |                              height="24px" class="mr-2"> | ||||
|  |                         <h3 style="font-size: 1.2rem !important;">Link Return | ||||
|  |                             Order With Partner | ||||
|  |                         </h3> | ||||
|  |                         <span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;">We can see the list of return related to a partner from the | ||||
|  |                             partner form view and easily switch to return order by clicking Return Count smart | ||||
|  |                             button.</span> | ||||
|  |                     </div> | ||||
|  | 
 | ||||
|  |                     <div class="d-flex my-5" | ||||
|  |                          style="padding-bottom: 1.3rem !important; border-bottom: 2px solid #f0f0f0;"> | ||||
|  |                         <img src="assets/icons/check.png" width="24px" | ||||
|  |                              height="24px" class="mr-2"> | ||||
|  |                         <h3 style="font-size: 1.2rem !important;">Return Order | ||||
|  |                             print</h3> | ||||
|  |                         <span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;">Allows to take PDF print of the return order.</span> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |     <div class="row " id="screenshots"> | ||||
|  |         <div class="col-sm-12 col-md-12 col-lg-12 px-4"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |                 Screenshots</h2> | ||||
|  |             <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Button on | ||||
|  |                         Order Page on Portal</h3> | ||||
|  |                 </div> | ||||
|  |                 <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> | ||||
|  |                     Goto Portal/ My Account -> Sale order , from the sale order | ||||
|  |                     click Return button. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_1.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Product Screen</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     From the product screen you can select the product , | ||||
|  |                     quantity and return reason, after | ||||
|  |                     that you can submit the return using Submit button. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_2.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Orders in | ||||
|  |                         Portal for View</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     Customer can see list of RMA orders in Portal / My Account. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_3.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Orders tree | ||||
|  |                         view in Portal.</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     The customer can see the basic details and status of the | ||||
|  |                     return order. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_4.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Orders | ||||
|  |                         detailed view in Portal.</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     The customer can see the detailed information of the return | ||||
|  |                     order in portal. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_5.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>RMA Return Orders - | ||||
|  |                         Backend</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     Return order tree view, Goto Sales -> Return Orders | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_6.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Orders form | ||||
|  |                         view in backend.</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     Backend form view of return order. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_7.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Delivery Order Tab | ||||
|  |                         and Smart button</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     Shows all the delivery order's related with Sales order. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_8.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |             <div class="mt-5"> | ||||
|  |                 <div class="d-flex mb-2" | ||||
|  |                      style="padding-bottom: 0.5rem !important;"> | ||||
|  |                     <img src="assets/icons/chevron.png" width="20px" | ||||
|  |                          height="20px" class="mr-2" | ||||
|  |                          style="margin-top: 4px !important;"> | ||||
|  |                     <h3>Return Process on DO | ||||
|  |                         picking.</h3> | ||||
|  |                 </div> | ||||
|  |                 <p> | ||||
|  |                     Return picking creation from return order using confirm | ||||
|  |                     button. | ||||
|  |                 </p> | ||||
|  |                 <img src="assets/screenshots/scrshot_7.png" | ||||
|  |                      class="img-responsive img-thumbnail border"> | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  |     <div class="mt-5"> | ||||
|  |         <div class="d-flex mb-2" style="padding-bottom: 0.5rem !important;"> | ||||
|  |             <img src="assets/icons/chevron.png" width="20px" height="20px" | ||||
|  |                  class="mr-2" | ||||
|  |                  style="margin-top: 4px !important;"> | ||||
|  |             <h3>Delivery Order Return | ||||
|  |                 Button.</h3> | ||||
|  |         </div> | ||||
|  |         <p> | ||||
|  |             Return picking creation from return button in delivery (Odoo | ||||
|  |             Standard process). | ||||
|  |         </p> | ||||
|  |         <img src="assets/screenshots/scrshot_9.png" | ||||
|  |              class="img-responsive img-thumbnail border"> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  | </div> | ||||
|  | </div> | ||||
|  | <div class="mt-5"> | ||||
|  |     <div class="d-flex mb-2" style="padding-bottom: 0.5rem !important;"> | ||||
|  |         <img src="assets/icons/chevron.png" width="20px" height="20px" | ||||
|  |              class="mr-2" | ||||
|  |              style="margin-top: 4px !important;"> | ||||
|  |         <h3>Delivery Order Return | ||||
|  |             Wizard(Odoo Standard).</h3> | ||||
|  |     </div> | ||||
|  |     <p> | ||||
|  |         Odoo default wizard for product return. | ||||
|  |     </p> | ||||
|  |     <img src="assets/screenshots/scrshot_10.png" | ||||
|  |          class="img-responsive img-thumbnail border"> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | </div> | ||||
|  | </div> | ||||
|  | <div class="mt-5"> | ||||
|  |     <div class="d-flex mb-2" style="padding-bottom: 0.5rem !important;"> | ||||
|  |         <img src="assets/icons/chevron.png" width="20px" height="20px" | ||||
|  |              class="mr-2" | ||||
|  |              style="margin-top: 4px !important;"> | ||||
|  |         <h3>Return Picking Order | ||||
|  |             Tab and Smart button)</h3> | ||||
|  |     </div> | ||||
|  |     <p> | ||||
|  |         Shows all the return picking order's related with Return Order. | ||||
|  |     </p> | ||||
|  |     <img src="assets/screenshots/scrshot_11.png" | ||||
|  |          class="img-responsive img-thumbnail border"> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | </div> | ||||
|  | </div> | ||||
|  | <div class="mt-5"> | ||||
|  |     <div class="d-flex mb-2" style="padding-bottom: 0.5rem !important;"> | ||||
|  |         <img src="assets/icons/chevron.png" width="20px" height="20px" | ||||
|  |              class="mr-2" | ||||
|  |              style="margin-top: 4px !important;"> | ||||
|  |         <h3>Smart Button on | ||||
|  |             Customer Form</h3> | ||||
|  |     </div> | ||||
|  |     <p> | ||||
|  |         On customer form smart button showing all return order related to that | ||||
|  |         customer. | ||||
|  |     </p> | ||||
|  |     <img src="assets/screenshots/scrshot_12.png" | ||||
|  |          class="img-responsive img-thumbnail border"> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | </div> | ||||
|  | </div> | ||||
|  | <div class="mt-5"> | ||||
|  |     <div class="d-flex mb-2" style="padding-bottom: 0.5rem !important;"> | ||||
|  |         <img src="assets/icons/chevron.png" width="20px" height="20px" | ||||
|  |              class="mr-2" | ||||
|  |              style="margin-top: 4px !important;"> | ||||
|  |         <h3>Smart Button on Sale | ||||
|  |             Order Form</h3> | ||||
|  |     </div> | ||||
|  |     <p> | ||||
|  |         On Sale Order form smart button showing all return order related to that | ||||
|  |         sale order. | ||||
|  |     </p> | ||||
|  |     <img src="assets/screenshots/scrshot_13.png" | ||||
|  |          class="img-responsive img-thumbnail border"> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | </div> | ||||
|  | </div> | ||||
|  | <div class="mt-5"> | ||||
|  |     <div class="d-flex mb-2" style="padding-bottom: 0.5rem !important;"> | ||||
|  |         <img src="assets/icons/chevron.png" width="20px" height="20px" | ||||
|  |              class="mr-2" | ||||
|  |              style="margin-top: 4px !important;"> | ||||
|  |         <h3>Return Orders - | ||||
|  |             Report Sample</h3> | ||||
|  |     </div> | ||||
|  |     <p> | ||||
|  |         Print RMA PDF Report - Print Return Report. | ||||
|  |     </p> | ||||
|  |     <img src="assets/screenshots/scrshot_14.png" | ||||
|  |          class="img-responsive img-thumbnail border"> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | </div> | ||||
|  | </div> | ||||
|  | 
 | ||||
|  | <!-- SUGGESTED PRODUCTS --> | ||||
|  | <div class="row mt-3"> | ||||
|  |     <div class="col-lg-12 d-flex flex-column justify-content-center" | ||||
|  |          style="padding: 2.5rem 1rem !important;"> | ||||
|  |         <h2 | ||||
|  |                 style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |             Suggested Products</h2> | ||||
|  |         <hr | ||||
|  |                 style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  | 
 | ||||
|  |         <div id="demo1" class="row carousel slide mt-4 data-ride=" carousel=""> | ||||
|  |             <!-- The slideshow --> | ||||
|  |             <div class="carousel-inner"> | ||||
|  |                 <div class="carousel-item active" style="min-height:0px"> | ||||
|  |                      <div class="carousel-item active" style="min-height:0px"> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/export_stockinfo_xls/" target="_blank"> | ||||
|  |                                 <div style="border-radius:10px"> | ||||
|  |                                     <img class="img img-responsive center-block" | ||||
|  |                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | ||||
|  |                                         src="./assets/modules/export_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank"> | ||||
|  |                                 <div style="border-radius:10px"> | ||||
|  |                                     <img class="img img-responsive center-block" | ||||
|  |                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | ||||
|  |                                         src="./assets/modules/gantt_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/sales_credit_limit/" target="_blank"> | ||||
|  |                                 <div style="border-radius:10px"> | ||||
|  |                                     <img class="img img-responsive center-block" | ||||
|  |                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | ||||
|  |                                         src="./assets/modules/credit_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                     </div> | ||||
|  |                     <div class="carousel-item" style="min-height:0px"> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/base_account_budget/" target="_blank"> | ||||
|  |                                 <div style="border-radius:10px"> | ||||
|  |                                     <img class="img img-responsive center-block" | ||||
|  |                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | ||||
|  |                                         src="./assets/modules/budget_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/product_to_quotation/" target="_blank"> | ||||
|  |                                 <div style="border-radius:10px"> | ||||
|  |                                     <img class="img img-responsive center-block" | ||||
|  |                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | ||||
|  |                                         src="./assets/modules/quotation_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | ||||
|  |                             <a href="https://apps.odoo.com/apps/modules/15.0/employee_documents_expiry/" | ||||
|  |                                 target="_blank"> | ||||
|  |                                 <div style="border-radius:10px"> | ||||
|  |                                     <img class="img img-responsive center-block" | ||||
|  |                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | ||||
|  |                                         src="./assets/modules/employee_image.png"> | ||||
|  |                                 </div> | ||||
|  |                             </a> | ||||
|  |                         </div> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             <!-- Left and right controls --> | ||||
|  |             <a class="carousel-control-prev" href="#demo1" data-slide="prev" | ||||
|  |                style="left:-25px;width: 35px;color: #000;"> <span | ||||
|  |                     class="carousel-control-prev-icon"><i | ||||
|  |                     class="fa fa-chevron-left" | ||||
|  |                     style="font-size:24px"></i></span> </a> <a | ||||
|  |                 class="carousel-control-next" href="#demo1" data-slide="next" | ||||
|  |                 style="right:-25px;width: 35px;color: #000;"> | ||||
|  |                     <span class="carousel-control-next-icon"><i | ||||
|  |                             class="fa fa-chevron-right" | ||||
|  |                             style="font-size:24px"></i></span> | ||||
|  |         </a> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </div> | ||||
|  | <!-- END OF SUGGESTED PRODUCTS --> | ||||
|  | 
 | ||||
|  | <!-- OUR SERVICES --> | ||||
|  | <section class="container" style="margin-top: 6rem !important;"> | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-lg-12"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |                 Our Services</h2> | ||||
|  |             <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/cogs.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Customization</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/wrench.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Implementation</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/lifebuoy.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Support</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/user.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Hire | ||||
|  |                 Odoo | ||||
|  |                 Developer</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #54a0ff  !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/puzzle.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Integration</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/update.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Migration</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/consultation.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Consultancy</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/training.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Implementation</h6> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | ||||
|  |             <div class="d-flex justify-content-center align-items-center mx-3 my-3" | ||||
|  |                  style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | ||||
|  |                 <img src="assets/icons/license.png" class="img-responsive" | ||||
|  |                      height="48px" width="48px"> | ||||
|  |             </div> | ||||
|  |             <h6 class="text-center" | ||||
|  |                 style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | ||||
|  |                 Odoo | ||||
|  |                 Licensing Consultancy</h6> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </section> | ||||
|  | <!-- END OF END OF OUR SERVICES --> | ||||
|  | 
 | ||||
|  | <!-- OUR INDUSTRIES --> | ||||
|  | <section class="container" style="margin-top: 6rem !important;"> | ||||
|  |     <div class="row"> | ||||
|  |         <div class="col-lg-12"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |                 Our Industries</h2> | ||||
|  |             <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/trading-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     Trading | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     Easily procure | ||||
|  |                     and | ||||
|  |                     sell your products</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/pos-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     POS | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     Easy | ||||
|  |                     configuration | ||||
|  |                     and convivial experience</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/education-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" | ||||
|  |                      width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     Education | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     A platform for | ||||
|  |                     educational management</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/manufacturing-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" | ||||
|  |                      width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     Manufacturing | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     Plan, track and | ||||
|  |                     schedule your operations</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/ecom-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     E-commerce & Website | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     Mobile | ||||
|  |                     friendly, | ||||
|  |                     awe-inspiring product pages</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/service-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     Service Management | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     Keep track of | ||||
|  |                     services and invoice</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/restaurant-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" | ||||
|  |                      width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     Restaurant | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     Run your bar or | ||||
|  |                     restaurant methodically</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-3"> | ||||
|  |             <div class="my-4 d-flex flex-column justify-content-center" | ||||
|  |                  style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | ||||
|  |                 <img src="./assets/icons/hotel-black.png" | ||||
|  |                      class="img-responsive mb-3" height="48px" width="48px"> | ||||
|  |                 <h5 | ||||
|  |                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | ||||
|  |                     Hotel Management | ||||
|  |                 </h5> | ||||
|  |                 <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | ||||
|  |                     An | ||||
|  |                     all-inclusive | ||||
|  |                     hotel management application</p> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |     </div> | ||||
|  | </section> | ||||
|  | 
 | ||||
|  | <!-- END OF END OF OUR INDUSTRIES --> | ||||
|  | 
 | ||||
|  | <!-- FOOTER --> | ||||
|  | <!-- Footer Section --> | ||||
|  | <section class="container" style="margin: 5rem auto 2rem;"> | ||||
|  |     <div class="row" style="max-width:1540px;"> | ||||
|  |         <div class="col-lg-12"> | ||||
|  |             <h2 | ||||
|  |                     style="font-family: 'Montserrat', sans-serif !important; font-size: 2rem; font-weight: 700 !important; color: #21272B !important;"> | ||||
|  |                 Need Help?</h2> | ||||
|  |             <hr | ||||
|  |                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 30px !important; margin-left: 0 !important; margin-bottom: 2rem !important;"/> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | 
 | ||||
|  |     <!-- Contact Cards --> | ||||
|  |     <div class="row d-flex justify-content-center align-items-center" | ||||
|  |          style="max-width:1540px; margin: 0 auto 2rem auto;"> | ||||
|  | 
 | ||||
|  |         <div class="col-lg-12" | ||||
|  |              style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; "> | ||||
|  | 
 | ||||
|  |             <div class="row mt-4"> | ||||
|  |                 <div class="col-lg-6"> | ||||
|  |                     <a href="mailto:odoo@cybrosys.com" target="_blank" | ||||
|  |                        class="btn btn-block mb-2 deep_hover" | ||||
|  |                        style="text-decoration: none;  background-color: #4d4d4d; color: #FFF;  border-radius: 4px;"><i | ||||
|  |                             class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a> | ||||
|  |                 </div> | ||||
|  |                 <div class="col-lg-6"> | ||||
|  |                     <a href="https://api.whatsapp.com/send?phone=918606827707" | ||||
|  |                        target="_blank" | ||||
|  |                        class="btn btn-block mb-2 deep_hover" | ||||
|  |                        style="text-decoration: none;  background-color: #25D366; color: #FFF;  border-radius: 4px;"><i | ||||
|  |                             class="fa fa-whatsapp mr-2"></i>+91 86068 27707</a> | ||||
|  |                 </div> | ||||
|  |             </div> | ||||
|  |         </div> | ||||
|  | 
 | ||||
|  |     </div> | ||||
|  |     <!-- End of Contact Cards --> | ||||
|  | </section> | ||||
|  | <!-- Footer --> | ||||
|  | <section class="oe_container" style="padding: 2rem 3rem 1rem;"> | ||||
|  |     <div class="row" | ||||
|  |          style="max-width:1540px; margin: 0 auto; margin-right: 3rem; "> | ||||
|  |         <!-- Logo --> | ||||
|  |         <div class="col-lg-12 d-flex justify-content-center align-items-center" | ||||
|  |              style="margin-top: 3rem;"> | ||||
|  |             <img src="https://www.cybrosys.com/images/logo.png" width="200px" | ||||
|  |                  height="auto"/> | ||||
|  |         </div> | ||||
|  |         <!-- End of Logo --> | ||||
|  |         <div class="col-lg-12"> | ||||
|  |             <hr | ||||
|  |                     style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;"> | ||||
|  |             <!-- End of Footer Section --> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </section> | ||||
|  | <!-- END OF FOOTER --> | ||||
|  | 
 | ||||
|  | </div> | ||||
| @ -0,0 +1,88 @@ | |||||
|  | odoo.define('website_return_management.return', function(require) { | ||||
|  |     "use strict"; | ||||
|  |     var publicWidget = require('web.public.widget'); | ||||
|  |     var ajax = require('web.ajax'); | ||||
|  |     var rpc = require('web.rpc'); | ||||
|  |     var core = require('web.core'); | ||||
|  |     var QWeb = core.qweb; | ||||
|  |     /** | ||||
|  |         new component to publicWidget | ||||
|  |      */ | ||||
|  |     publicWidget.registry.returnOrderModal = publicWidget.Widget.extend({ | ||||
|  |         selector: 'div[id="sale_return_modal"]', | ||||
|  |         events: { | ||||
|  |             'click #hidden_box_btn': '_onShowButtonClick', | ||||
|  |             'change #product': '_onShowFormSubmit', | ||||
|  |             'click #submit': '_onClickFormSubmit', | ||||
|  |             'change #qty': '_onChangeQuantity', | ||||
|  |         }, | ||||
|  |         _onShowButtonClick: function() { | ||||
|  |             /** | ||||
|  |             on-click function to show the modal | ||||
|  |             */ | ||||
|  |             $('#hidden_box').modal('show'); | ||||
|  |         }, | ||||
|  |         _onShowFormSubmit: function() { | ||||
|  |             /** | ||||
|  |             on-click function to show the submit button | ||||
|  |             */ | ||||
|  |             var x = $('#submit'); | ||||
|  |             x.addClass('d-none'); | ||||
|  |             if ($("#product").val() == 'none') { | ||||
|  |                 if (!x.hasClass('d-none')) { | ||||
|  |                     x.addClass('d-none'); | ||||
|  |                 } | ||||
|  |             } else { | ||||
|  |                 if (x.hasClass('d-none')) { | ||||
|  |                     x.removeClass('d-none'); | ||||
|  |                 } | ||||
|  |             } | ||||
|  |         }, | ||||
|  | 
 | ||||
|  |         _onChangeQuantity: function() { | ||||
|  |          /** | ||||
|  |            on-change function to check the quantity | ||||
|  |          */ | ||||
|  |          if (!$("#warning_message").hasClass('d-none')) { | ||||
|  |     $('#warning_message').addClass('d-none'); | ||||
|  |     $('#submit').prop('disabled', false); | ||||
|  | } | ||||
|  |     else if (!$("#product_null_warning").hasClass('d-none')){ | ||||
|  |               $('#product_null_warning').addClass('d-none'); | ||||
|  |          $('#submit').prop('disabled', false); | ||||
|  |          } | ||||
|  |         }, | ||||
|  | 
 | ||||
|  |         _onClickFormSubmit: function(ev) { | ||||
|  |             /** | ||||
|  |             on-click function to show the submit button | ||||
|  |             */ | ||||
|  |             ev.preventDefault(); | ||||
|  |             var current_order = $('#order_id').val() | ||||
|  |             var return_qty = $('#qty').val() | ||||
|  |             var product = $('#product').val() | ||||
|  |             var reason = $('#return_reason').val() | ||||
|  |             ajax.jsonRpc('/order_quantity', 'call', { | ||||
|  |             'current_order': current_order, 'return_qty': return_qty, | ||||
|  |             'product_id': product}) | ||||
|  |                 .then(function(data) { | ||||
|  |                        if (data < return_qty) { | ||||
|  |                          $('#warning_message').removeClass('d-none'); | ||||
|  |                     } | ||||
|  |                      else if (return_qty <= 0){ | ||||
|  |                       $('#product_null_warning').removeClass('d-none'); | ||||
|  |                       $('#submit').prop('disabled', true); | ||||
|  |                      } | ||||
|  |                      else { | ||||
|  |                           // Submit the form if the condition is met
 | ||||
|  |                           ajax.jsonRpc('/sale_return', 'call', { | ||||
|  |                           'order_id': current_order, 'qty': return_qty, | ||||
|  |                           'product': product, 'reason': reason}).then(function(result) { | ||||
|  |                            window.location.href = '/my/request-thank-you'; | ||||
|  |                           }) | ||||
|  |                     } | ||||
|  |                     }); | ||||
|  | 
 | ||||
|  |         }, | ||||
|  |     }) | ||||
|  | }) | ||||
| @ -0,0 +1,377 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||
|  | <odoo> | ||||
|  |     <!--    Portal template --> | ||||
|  |     <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"> | ||||
|  |             <div id="sale_return_modal"> | ||||
|  |             <form> | ||||
|  |                 <span id="hidden_box" class="modal fade"> | ||||
|  |                     <div class="modal-dialog modal-content" | ||||
|  |                          style="border:solid 1px #604e5b; min-height:px;max-width:500px;max-height: 685px;"> | ||||
|  |                         <div class="modal-body" id="pop_html"> | ||||
|  |                             <a href="#" | ||||
|  |                                class="o_popup_btn_close o_not_editable  pull-right" | ||||
|  |                                data-dismiss="modal" style="font-size:20px">x | ||||
|  |                             </a> | ||||
|  |                             <br/> | ||||
|  |                             <h2 style="text-align:center; font-size 24px; font-weight:bold" | ||||
|  |                                 class="o_default_snippet_text">Sale Return | ||||
|  |                             </h2> | ||||
|  |                             <form> | ||||
|  |                                 <div class="form-group row form-field o_website_form_custom o_website_form_required_custom"> | ||||
|  |                                     <div class="col-6 d-block font-weight-bold"> | ||||
|  |                                         Customer Name | ||||
|  |                                     </div> | ||||
|  |                                     <div class="col-6 d-block font-weight-bold"> | ||||
|  |                                         Sale Order | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                                 <div class="row form-group"> | ||||
|  |                                     <div class="col-6 align-middle"> | ||||
|  |                                         <input type="text" readonly="1" | ||||
|  |                                                t-att-value="sale_order.partner_id.name" | ||||
|  |                                                name="partner" | ||||
|  |                                                class="form-control o_website_form_custom" | ||||
|  |                                                style="color: #606060;box-shadow: none;padding-left: 0;font-size: 18px;border: 1px solid #aaa;box-sizing: border-box; text-align: center;"/> | ||||
|  |                                     </div> | ||||
|  |                                     <div class="col-6 align-middle"> | ||||
|  |                                         <input type="text" | ||||
|  |                                                style="color: #606060;box-shadow: none;padding-left: 0;font-size: 18px;border: 1px solid #aaa;box-sizing: border-box;text-align: center;" | ||||
|  |                                                t-att-value="sale_order.name" | ||||
|  |                                                name="order" readonly="1" | ||||
|  |                                                class="form-control o_website_form_custom"/> | ||||
|  |                                         <input type="text" | ||||
|  |                                                style="color: #606060;box-shadow: none;padding-left: 0;font-size: 18px;border: 1px solid #aaa;box-sizing: border-box;text-align: center;" | ||||
|  |                                                t-att-value="sale_order.id" | ||||
|  |                                                name="order_id" | ||||
|  |                                                id="order_id" | ||||
|  |                                                class="form-control o_website_form_custom d-none"/> | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                                 <div class="row"> | ||||
|  |                                     <br/> | ||||
|  |                                 </div> | ||||
|  |                                 <div class="form-group row "> | ||||
|  |                                     <div class="col-6 d-block font-weight-bold"> | ||||
|  |                                         Select Product | ||||
|  |                                     </div> | ||||
|  |                                     <div class="col-6 d-block font-weight-bold"> | ||||
|  |                                         Quantity | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                                 <div class="form-group row"> | ||||
|  |                                     <div class="col-6 align-middle"> | ||||
|  |                                         <select class="form-control product" | ||||
|  |                                                 id="product" name="product" | ||||
|  |                                                 default="None" | ||||
|  |                                                 style="color: #606060;box-shadow: none;padding-left: 0;font-size: 18px;border: 1px solid #aaa;box-sizing: border-box;text-align: center;"> | ||||
|  |                                             <option value="none">None</option> | ||||
|  |                                                <t t-foreach="sale_order.order_line.filtered(lambda line: not line.return_qty).mapped('product_id')" | ||||
|  |                                                t-as="product"> | ||||
|  |                                                 <option t-att-value='product.id'> | ||||
|  |                                                     <t t-esc="product.name"/> | ||||
|  |                                                 </option> | ||||
|  |                                             </t> | ||||
|  |                                         </select> | ||||
|  |                                     </div> | ||||
|  |                                     <div class="col-6 align-middle"> | ||||
|  |                                         <input type="text" | ||||
|  |                                                style="color: #606060;box-shadow: none;padding-left: 0;font-size: 18px;border: 1px solid #aaa;box-sizing: border-box; text-align: center;" | ||||
|  |                                                value="0" | ||||
|  |                                                name="qty" | ||||
|  |                                                id="qty" | ||||
|  |                                                class="form-control"/> | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                                 <div class="form-group row"> | ||||
|  |                                     <div class="col-12 d-block font-weight-bold"> | ||||
|  |                                         Reason | ||||
|  |                                     </div> | ||||
|  |                                     <div class="col-12"> | ||||
|  |                                         <textarea rows="10" cols="45" | ||||
|  |                                                   id="return_reason" | ||||
|  |                                                   name="reason" | ||||
|  |                                                   placeholder="Explain your Reason"/> | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                                 <div class="form-group row"> | ||||
|  |                                     <div class="col-12"> | ||||
|  |                                             <div id="warning_message" class="alert alert-danger d-none" role="alert" | ||||
|  |                                             style="width: 300px; height: 70px;"> | ||||
|  |                                             Return quantity exceeds the delivered quantity. | ||||
|  |                                             </div> | ||||
|  |                                         <div id="product_null_warning" class="alert alert-danger d-none" role="alert" | ||||
|  |                                             style="width: 300px; height: 70px;"> | ||||
|  |                                             Add a quantity to return. | ||||
|  |                                         </div> | ||||
|  |                                         <button id='submit' | ||||
|  |                                                 class="btn btn-secondary flex-grow-1 mb-1 d-none"> | ||||
|  |                                             Submit | ||||
|  |                                         </button> | ||||
|  |                                         <span id="o_website_form_result"/> | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                             </form> | ||||
|  |                         </div> | ||||
|  |                     </div> | ||||
|  |                 </span> | ||||
|  |                 <div class="row"> | ||||
|  |                     <div class="col-6"> | ||||
|  |                         <h2 class="my-0"> | ||||
|  |                             <t t-esc="sale_order.type_name"/> | ||||
|  |                             <em t-esc="sale_order.name"/> | ||||
|  |                         </h2> | ||||
|  |                     </div> | ||||
|  |                     <div class="col-6"> | ||||
|  |                         <span class="btn-group flex-grow-1 mb-1 float-left" | ||||
|  |                               style="padding-left: 18rem !important;"> | ||||
|  |                             <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> | ||||
|  |             </div> | ||||
|  |         </xpath> | ||||
|  |     </template> | ||||
|  |     <!--    Returns order breadcrumbs--> | ||||
|  |     <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> | ||||
|  |     <!--    Returns orders --> | ||||
|  |     <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> | ||||
|  |     <!--    User returns in portal --> | ||||
|  |     <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">Sale Returns</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 badge-warning"><i | ||||
|  |                                             class="fa fa-fw fa-file-text"/>Draft | ||||
|  |                                     </span> | ||||
|  |                                 </t> | ||||
|  |                                 <t t-if="order.state == 'done'"> | ||||
|  |                                     <span class="badge badge-success "><i | ||||
|  |                                             class="fa fa-fw fa-file-text"/>Done | ||||
|  |                                     </span> | ||||
|  |                                 </t> | ||||
|  |                                 <t t-if="order.state == 'confirm'"> | ||||
|  |                                     <span class="badge badge-info"> | ||||
|  |                                         <i | ||||
|  |                                                 class="fa fa-fw fa-file-text"/> | ||||
|  |                                         Confirmed | ||||
|  |                                     </span> | ||||
|  |                                 </t> | ||||
|  |                                 <t t-if="order.state == 'cancel'"> | ||||
|  |                                     <span class="badge badge-dark"> | ||||
|  |                                         <i class="fa fa-fw fa-remove"/> | ||||
|  |                                         Cancelled | ||||
|  |                                     </span> | ||||
|  |                                 </t> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                     </t> | ||||
|  |                 </tbody> | ||||
|  |             </t> | ||||
|  |         </t> | ||||
|  |     </template> | ||||
|  |     <!--    Adding sale return options in portal--> | ||||
|  |     <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"> | ||||
|  |                                             <img class="rounded-circle mr4 float-left o_portal_contact_img" | ||||
|  |                                                  t-if="sale_return.user_id.image_1024" | ||||
|  |                                                  t-att-src="image_data_uri(sale_return.user_id.image_1024)" | ||||
|  |                                                  alt="Contact"/> | ||||
|  |                                             <img class="rounded-circle mr4 float-left o_portal_contact_img" | ||||
|  |                                                  t-if="not sale_return.user_id.image_1024" | ||||
|  |                                                  src="/web/static/src/img/placeholder.png" | ||||
|  |                                                  alt="Contact"/> | ||||
|  |                                         </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> | ||||
|  |                                         </tr> | ||||
|  |                                     </thead> | ||||
|  |                                     <tbody> | ||||
|  |                                         <tr> | ||||
|  |                                             <td> | ||||
|  |                                                 <img t-att-src="image_data_uri(orders.product_id.image_1024)" | ||||
|  |                                                      alt="Product" | ||||
|  |                                                      class="d-none d-lg-inline" | ||||
|  |                                                      width="48" height="48"/> | ||||
|  |                                                 <span t-esc="orders.name"/> | ||||
|  |                                             </td> | ||||
|  |                                             <td class="text-right"> | ||||
|  |                                                 <span t-esc="orders.quantity"/> | ||||
|  |                                             </td> | ||||
|  |                                         </tr> | ||||
|  |                                     </tbody> | ||||
|  |                                 </table> | ||||
|  |                                 <div class="row"/> | ||||
|  |                                 <div class="row"> | ||||
|  |                                     <div class="col-lg-12"> | ||||
|  |                                         <h5 class="font-weight-normal">Reason | ||||
|  |                                         </h5> | ||||
|  |                                         <p t-esc="orders.reason"/> | ||||
|  |                                     </div> | ||||
|  |                                 </div> | ||||
|  |                             </div> | ||||
|  |                         </div> | ||||
|  |                     </div> | ||||
|  |                 </div> | ||||
|  |             </div> | ||||
|  |             <div class="oe_structure mb32"/> | ||||
|  |         </t> | ||||
|  |     </template> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,19 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  | <!--    Inherit res_partner--> | ||||
|  |     <record id="view_partner_form" model="ir.ui.view"> | ||||
|  |         <field name="name">res.partner.view.form.inherit.sale.return</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,21 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--    Sale order inherit to add a new button --> | ||||
|  |     <record id="view_order_form" model="ir.ui.view"> | ||||
|  |         <field name="name">sale.order.view.form.inherit.sales.return</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> | ||||
|  |              <xpath expr="//notebook/page[@name='order_lines']/field/tree/field[@name='qty_delivered']" position="after"> | ||||
|  |                  <field name="return_qty" attrs="{'column_invisible': [('parent.state', 'not in', ('sale', 'done'))]}"/> | ||||
|  |              </xpath> | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,118 @@ | |||||
|  | <?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</field> | ||||
|  |         <field name="model">sale.return</field> | ||||
|  |         <field name="priority">100</field> | ||||
|  |         <field name="arch" type="xml"> | ||||
|  |             <form> | ||||
|  |                 <header> | ||||
|  |                     <button name="return_confirm" string="Confirm" class="oe_highlight" | ||||
|  |                             type="object" states="draft"/> | ||||
|  |                     <button name="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"/> | ||||
|  |                             <field name="create_date"/> | ||||
|  |                             <field name="user_id"/> | ||||
|  |                         </group> | ||||
|  |                         <group> | ||||
|  |                             <field name="product_id"/> | ||||
|  |                             <field name="received_qty" readonly="1" force_save="1"/> | ||||
|  |                             <field name="quantity"/> | ||||
|  |                             <field name="to_refund"/> | ||||
|  |                             <field name="stock_picking_ids" invisible="1"/> | ||||
|  |                         </group> | ||||
|  |                     </group> | ||||
|  |                     <notebook> | ||||
|  |                         <page string="Reason" name="reason"> | ||||
|  |                             <field name="reason"/> | ||||
|  |                         </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 model="ir.ui.view" id="sale_return_tree_view"> | ||||
|  |         <field name="name">Sale Return</field> | ||||
|  |         <field name="model">sale.return</field> | ||||
|  |         <field name="arch" type="xml"> | ||||
|  |             <tree> | ||||
|  |                 <field name="name"/> | ||||
|  |                 <field name="sale_order_id"/> | ||||
|  |                 <field name="partner_id"/> | ||||
|  |                 <field name="create_date"/> | ||||
|  |                 <field name="user_id"/> | ||||
|  |                 <field name="state"/> | ||||
|  |                 <field name="product_id" optional="hide"/> | ||||
|  |             </tree> | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | <!--    Sale return search--> | ||||
|  |     <record id="sale_return_view_search" model="ir.ui.view"> | ||||
|  |         <field name="name">sale.return.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"/> | ||||
|  |                 <field name="product_id" string="Product"/> | ||||
|  |                 <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'}"/> | ||||
|  |                     <filter string="Product" name="product" domain="[]" context="{'group_by':'product_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> | ||||
|  | <!--    Sale return menu--> | ||||
|  |     <menuitem id="sale_return_menu" | ||||
|  |               parent="sale.sale_menu_root" | ||||
|  |               name="Return Orders" | ||||
|  |               action="website_return_management.sale_return_action"/> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,16 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  | <!--    Inheriting model stock_picking form view to add new fields--> | ||||
|  |     <record id="view_picking_form" model="ir.ui.view"> | ||||
|  |         <field name="name">stock.picking.view.form.inherit.website.return</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,36 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||
|  | <odoo> | ||||
|  |     <!--    Acknowledgement template--> | ||||
|  |     <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-8"> | ||||
|  |                                     <div class="alert alert-success" | ||||
|  |                                          role="status"> | ||||
|  |                                         Your order for return has been sent | ||||
|  |                                         successfully. | ||||
|  |                                         <button type="button" class="close" | ||||
|  |                                                 data-dismiss="alert">&times; | ||||
|  |                                         </button> | ||||
|  |                                     </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> | ||||
| @ -0,0 +1,22 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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 stock_return_picking | ||||
| @ -0,0 +1,40 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Sabeel B (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): | ||||
|  |     """Transient model to create return order""" | ||||
|  |     _inherit = 'stock.return.picking' | ||||
|  | 
 | ||||
|  |     def _create_returns(self): | ||||
|  |         """Supering create_returns function""" | ||||
|  |         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 | ||||