Browse Source

Jan 03: [ADD] Initial Commit 'website_multi_product_return_management'

pull/299/head
Shijin V 1 year ago
parent
commit
e98902d0d9
  1. 47
      website_multi_product_return_management/README.rst
  2. 22
      website_multi_product_return_management/__init__.py
  3. 55
      website_multi_product_return_management/__manifest__.py
  4. 22
      website_multi_product_return_management/controllers/__init__.py
  5. 161
      website_multi_product_return_management/controllers/portal.py
  6. 78
      website_multi_product_return_management/controllers/website_multi_product_return_management.py
  7. 13
      website_multi_product_return_management/data/ir_sequence_data.xml
  8. 6
      website_multi_product_return_management/doc/RELEASE_NOTES.md
  9. 26
      website_multi_product_return_management/models/__init__.py
  10. 63
      website_multi_product_return_management/models/res_partner.py
  11. 61
      website_multi_product_return_management/models/return_order_line.py
  12. 55
      website_multi_product_return_management/models/sale_order.py
  13. 246
      website_multi_product_return_management/models/sale_return.py
  14. 52
      website_multi_product_return_management/models/stock_picking.py
  15. 37
      website_multi_product_return_management/models/stock_return_picking.py
  16. 14
      website_multi_product_return_management/report/sale_return_reports.xml
  17. 78
      website_multi_product_return_management/report/sale_return_templates.xml
  18. 3
      website_multi_product_return_management/security/ir.model.access.csv
  19. BIN
      website_multi_product_return_management/static/description/assets/icons/check.png
  20. BIN
      website_multi_product_return_management/static/description/assets/icons/chevron.png
  21. BIN
      website_multi_product_return_management/static/description/assets/icons/cogs.png
  22. BIN
      website_multi_product_return_management/static/description/assets/icons/consultation.png
  23. BIN
      website_multi_product_return_management/static/description/assets/icons/ecom-black.png
  24. BIN
      website_multi_product_return_management/static/description/assets/icons/education-black.png
  25. BIN
      website_multi_product_return_management/static/description/assets/icons/hotel-black.png
  26. BIN
      website_multi_product_return_management/static/description/assets/icons/license.png
  27. BIN
      website_multi_product_return_management/static/description/assets/icons/lifebuoy.png
  28. BIN
      website_multi_product_return_management/static/description/assets/icons/manufacturing-black.png
  29. BIN
      website_multi_product_return_management/static/description/assets/icons/pos-black.png
  30. BIN
      website_multi_product_return_management/static/description/assets/icons/puzzle.png
  31. BIN
      website_multi_product_return_management/static/description/assets/icons/restaurant-black.png
  32. BIN
      website_multi_product_return_management/static/description/assets/icons/service-black.png
  33. BIN
      website_multi_product_return_management/static/description/assets/icons/trading-black.png
  34. BIN
      website_multi_product_return_management/static/description/assets/icons/training.png
  35. BIN
      website_multi_product_return_management/static/description/assets/icons/update.png
  36. BIN
      website_multi_product_return_management/static/description/assets/icons/user.png
  37. BIN
      website_multi_product_return_management/static/description/assets/icons/wrench.png
  38. BIN
      website_multi_product_return_management/static/description/assets/misc/categories.png
  39. BIN
      website_multi_product_return_management/static/description/assets/misc/check-box.png
  40. BIN
      website_multi_product_return_management/static/description/assets/misc/compass.png
  41. BIN
      website_multi_product_return_management/static/description/assets/misc/corporate.png
  42. BIN
      website_multi_product_return_management/static/description/assets/misc/customer-support.png
  43. BIN
      website_multi_product_return_management/static/description/assets/misc/cybrosys-logo.png
  44. BIN
      website_multi_product_return_management/static/description/assets/misc/features.png
  45. BIN
      website_multi_product_return_management/static/description/assets/misc/logo.png
  46. BIN
      website_multi_product_return_management/static/description/assets/misc/pictures.png
  47. BIN
      website_multi_product_return_management/static/description/assets/misc/pie-chart.png
  48. BIN
      website_multi_product_return_management/static/description/assets/misc/right-arrow.png
  49. BIN
      website_multi_product_return_management/static/description/assets/misc/star.png
  50. BIN
      website_multi_product_return_management/static/description/assets/misc/support.png
  51. BIN
      website_multi_product_return_management/static/description/assets/misc/whatsapp.png
  52. BIN
      website_multi_product_return_management/static/description/assets/modules/1.png
  53. BIN
      website_multi_product_return_management/static/description/assets/modules/2.png
  54. BIN
      website_multi_product_return_management/static/description/assets/modules/3.png
  55. BIN
      website_multi_product_return_management/static/description/assets/modules/4.jpg
  56. BIN
      website_multi_product_return_management/static/description/assets/modules/5.jpg
  57. BIN
      website_multi_product_return_management/static/description/assets/modules/6.jpg
  58. BIN
      website_multi_product_return_management/static/description/assets/screenshots/1.png
  59. BIN
      website_multi_product_return_management/static/description/assets/screenshots/10.png
  60. BIN
      website_multi_product_return_management/static/description/assets/screenshots/11.png
  61. BIN
      website_multi_product_return_management/static/description/assets/screenshots/12.png
  62. BIN
      website_multi_product_return_management/static/description/assets/screenshots/13.png
  63. BIN
      website_multi_product_return_management/static/description/assets/screenshots/14.png
  64. BIN
      website_multi_product_return_management/static/description/assets/screenshots/15.png
  65. BIN
      website_multi_product_return_management/static/description/assets/screenshots/2.png
  66. BIN
      website_multi_product_return_management/static/description/assets/screenshots/3.png
  67. BIN
      website_multi_product_return_management/static/description/assets/screenshots/4.png
  68. BIN
      website_multi_product_return_management/static/description/assets/screenshots/5.png
  69. BIN
      website_multi_product_return_management/static/description/assets/screenshots/6.png
  70. BIN
      website_multi_product_return_management/static/description/assets/screenshots/7.png
  71. BIN
      website_multi_product_return_management/static/description/assets/screenshots/8.png
  72. BIN
      website_multi_product_return_management/static/description/assets/screenshots/9.png
  73. BIN
      website_multi_product_return_management/static/description/assets/screenshots/hero.gif
  74. BIN
      website_multi_product_return_management/static/description/banner.jpg
  75. BIN
      website_multi_product_return_management/static/description/icon.png
  76. 653
      website_multi_product_return_management/static/description/index.html
  77. 59
      website_multi_product_return_management/static/src/js/sale_return.js
  78. 19
      website_multi_product_return_management/views/res_partner_views.xml
  79. 18
      website_multi_product_return_management/views/sale_order_views.xml
  80. 123
      website_multi_product_return_management/views/sale_return_views.xml
  81. 16
      website_multi_product_return_management/views/stock_picking_views.xml
  82. 343
      website_multi_product_return_management/views/website_portal_templates.xml
  83. 29
      website_multi_product_return_management/views/website_thankyou_template.xml

47
website_multi_product_return_management/README.rst

@ -0,0 +1,47 @@
.. 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
Multi Product Return From Website
=================================
Sale Order Multi product Return Management from Website.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
=======
General Public License, version 3 (AGPL v3).
("https://www.odoo.com/documentation/16.0/legal/licenses.html")
Credits
-------
Developer : (V16) Bhagyadev KP, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your
issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

22
website_multi_product_return_management/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from . import models
from . import controllers

55
website_multi_product_return_management/__manifest__.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
{
'name': 'Multi Product Return From Website',
'version': '16.0.1.0.0',
'category': 'Website',
'summary': 'Sale Order Multi product Return Management from Website',
'description': """Website Multi product Return Order Management,
Website Return, Order Return, RMA, Website RMA""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['website_sale', 'stock', 'sale_management', 'portal'],
'data': [
'security/ir.model.access.csv',
'data/ir_sequence_data.xml',
'views/website_thankyou_template.xml',
'views/sale_return_views.xml',
'views/website_portal_templates.xml',
'views/sale_order_views.xml',
'views/res_partner_views.xml',
'views/stock_picking_views.xml',
'report/sale_return_reports.xml',
'report/sale_return_templates.xml'
],
'assets': {
'web.assets_frontend': [
'/website_multi_product_return_management/static/src/js/sale_return.js',
]
},
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

22
website_multi_product_return_management/controllers/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from . import website_multi_product_return_management
from . import portal

161
website_multi_product_return_management/controllers/portal.py

@ -0,0 +1,161 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
import base64
from collections import OrderedDict
from odoo.exceptions import AccessError, MissingError
from odoo import http
from odoo.http import request
from odoo.tools import image_process
from odoo.tools.translate import _
from odoo.addons.portal.controllers.portal import CustomerPortal
from odoo.addons.web.controllers.binary import Binary
class ReturnCustomerPortal(CustomerPortal):
"""
In this class setting the return orders data in the portal.
"""
def _prepare_home_portal_values(self, counters):
""" Add return details to main account page """
values = super()._prepare_home_portal_values(counters)
partner = request.env.user.partner_id
if 'return_count' in counters:
if request.env.user.has_group('base.group_portal'):
values['return_count'] = request.env[
'sale.return'].search_count([
('state', 'in', ['draft', 'confirm', 'done', 'cancel']),
('partner_id', '=', partner.id)])
elif request.env.user.has_group('base.group_system'):
values['return_count'] = request.env[
'sale.return'].search_count([
('state', 'in', ['draft', 'confirm', 'done', 'cancel'])])
else:
values['return_count'] = request.env[
'sale.return'].search_count(
['|', ('partner_id', '=', partner.id),
('user_id', '=', request.env.user.id)])
return values
@http.route(['/my/return_orders', '/my/return_orders/page/<int:page>'],
type='http', auth="user", website=True)
def portal_my_sale_return(self, page=1, date_begin=None, date_end=None,
sortby=None, filterby=None, **kw):
""" My orders function """
values = self._prepare_portal_layout_values()
sale_return = request.env['sale.return']
partner = request.env.user.partner_id
if request.env.user.has_group('base.group_portal'):
domain = [
('partner_id', '=', partner.id)
]
elif request.env.user.has_group('base.group_system'):
domain = []
else:
domain = ['|', ('partner_id', '=', partner.id),
('user_id', '=', request.env.user.id)]
searchbar_sortings = {
'date': {'label': _('Newest'), 'order': 'create_date desc'},
'name': {'label': _('Name'), 'order': 'name'},
'sale': {'label': _('Sale Order'), 'order': 'sale_order_id'},
}
# 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']
return_count = sale_return.sudo().search_count(domain)
# pager
pager = request.website.pager(
url="/my/return_orders",
url_args={'date_begin': date_begin, 'date_end': date_end,
'sortby': sortby},
total=return_count,
page=page,
step=self._items_per_page
)
# content according to pager and archive selected
orders = sale_return.sudo().search(domain, order=order,
limit=self._items_per_page,
offset=pager['offset'])
request.session['my_return_history'] = orders.ids[:100]
values.update({
'date': date_begin,
'orders': orders.sudo(),
'page_name': 'Sale_Return',
'default_url': '/my/return_orders',
'pager': pager,
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
})
return request.render(
"website_multi_product_return_management.portal_my_returns", values)
@http.route(['/my/return_orders/<int:order_id>'], type='http',
auth="public", website=True)
def portal_my_return_detail(self, order_id=None, access_token=None
, report_type=None, download=False, **kw):
"""
Function for return details in portal
"""
try:
order_sudo = self._document_check_access('sale.return', order_id,
access_token)
except (AccessError, MissingError):
return request.redirect('/my')
if report_type in ('html', 'pdf', 'text'):
return self._show_report(model=order_sudo, report_type=report_type,
report_ref='website_multi_product_return_management.'
'report_sale_returns',
download=download)
values = self._sale_return_get_page_view_values(order_sudo,
access_token, **kw)
return request.render(
"website_multi_product_return_management.portal_sale_return_page",
values)
def _sale_return_get_page_view_values(self, order, access_token, **kwargs):
"""Function to get values of the sale return"""
def resize_to_48(b64source):
if not b64source:
b64source = base64.b64encode(Binary.placeholder())
return image_process(b64source, size=(48, 48))
values = {
'orders': order,
'resize_to_48': resize_to_48,
}
return self._get_page_view_values(order, access_token, values,
'my_return_history', False, **kwargs)

78
website_multi_product_return_management/controllers/website_multi_product_return_management.py

@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from datetime import datetime
from odoo.addons.web.controllers import home
from odoo import http
from odoo.http import request
class CustomerRegistration(home.Home):
"""In this class, creating sale returns"""
@http.route('/sale_return', type='json', csrf=False, auth="public",
website=True)
def sale_return(self, **kwargs, ):
"""Controller to create return order"""
if kwargs.get('vals'):
lines = []
so_id = False
for line in kwargs.get('vals'):
so_id = request.env['sale.order'].sudo().search(
[('id', '=', int(line['order_id']))])
qty = int(line['quantity'])
d_qty = int(line['deli_qty'])
reason = line['reason']
if qty > 0:
lines.append((0, 0, {'product_id': line['product_id'],
'received_qty': qty,
'quantity': d_qty,
'reason': reason
}))
if so_id:
values = {
'partner_id': so_id.partner_id.id,
'sale_order_id': so_id.id,
'user_id': request.env.uid,
'create_date': datetime.now(),
'return_line_ids': lines
}
stock_picks = request.env['stock.picking'].sudo().search(
[('origin', '=', so_id.name)])
moves = stock_picks.mapped(
'move_ids_without_package').sudo().filtered(
lambda p: p.product_id.id == line['product_id'])
if moves:
moves = moves.sorted('product_uom_qty', reverse=True)
values.update({'state': 'draft'})
ret_order = request.env['sale.return'].sudo().create(values)
moves[0].picking_id.return_order_id = ret_order.id
moves[0].picking_id.return_order_picking = False
return True
return False
@http.route('/my/request-thank-you', website=True, page=True,
auth='public', csrf=False)
def maintenance_request_thanks(self):
"""Controller to redirect to the success page when return order
submitted successfully"""
return request.render(
'website_multi_product_return_management.'
'customers_request_thank_page')

13
website_multi_product_return_management/data/ir_sequence_data.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<!-- Return order sequence-->
<record id="sequence_sale_return" model="ir.sequence">
<field name="name">Sale Return</field>
<field name="code">sale.return</field>
<field name="prefix">RET</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>

6
website_multi_product_return_management/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <website_multi_product_return_management>
#### 05.01.2024
#### Version 16.0.1.0.0
##### ADD
- Initial Commit for Multi Product Return From Website

26
website_multi_product_return_management/models/__init__.py

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from . import sale_return
from . import res_partner
from . import sale_order
from . import stock_picking
from . import stock_return_picking
from . import return_order_line

63
website_multi_product_return_management/models/res_partner.py

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import fields, models
class ResPartner(models.Model):
"""inheriting res_partner model to set return orders """
_inherit = 'res.partner'
return_order_count = fields.Integer(compute="_compute_returns",
string='Return Orders',
help="Number of return orders")
def _compute_returns(self):
"""Function to calculate the return count"""
all_partners = (self.with_context(active_test=False).sudo().
search([('id', 'child_of', self.ids)]))
all_partners.read(['parent_id'])
sale_return_groups = self.env['sale.return'].sudo().read_group(
domain=[('partner_id', '=', all_partners.ids)],
fields=['partner_id'], groupby=['partner_id'])
partners = self.sudo().browse()
for group in sale_return_groups:
partner = self.browse(group['partner_id'][0])
while partner:
if partner in self:
partner.return_order_count += group['partner_id_count']
partners |= partner
partner = partner.parent_id
(self - partners).return_order_count = 0
def action_open_returns(self):
"""This function returns an action that displays the sale return orders
from partner."""
action = self.env['ir.actions.act_window']._for_xml_id(
'website_multi_product_return_management.sale_return_action')
domain = []
if self.is_company:
domain.append(('partner_id.commercial_partner_id.id', '=', self.id))
else:
domain.append(('partner_id.id', '=', self.id))
action['domain'] = domain
action['context'] = {'search_default_customer': 1}
return action

61
website_multi_product_return_management/models/return_order_line.py

@ -0,0 +1,61 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import api, fields, models
class ReturnOrderLine(models.Model):
"""creating model for return order lines"""
_name = 'return.order.line'
_description = "return products Details"
order_id = fields.Many2one("sale.return", string="Order",
help="Orders")
product_id = fields.Many2one('product.product',
string="Product Variant", required=True,
help="Defines the product variant that need to"
" be returned")
product_tmpl_id = fields.Many2one('product.template',
related="product_id.product_tmpl_id",
store=True, string="Product",
help="Product")
quantity = fields.Float(string="Delivered Quantity", store=True,
help="product quantity")
received_qty = fields.Float(string="Received Quantity",
help="Received quantity")
reason = fields.Text("Reason", help="Reason for returning the product")
to_refund = fields.Boolean(string='Update SO/PO Quantity',
help='Trigger a decrease of the'
' delivered/received quantity in the '
'associated Sale Order/Purchase Order')
@api.onchange('product_id')
def _onchange_product_id(self):
""" setting up domain for products as per the products in the
vendor price list"""
self.ensure_one()
if self._context.get('order_id'):
order_id = self.env['sale.order'].browse(self._context.get('order_id'))
products = order_id.order_line.mapped('product_id').ids
if self.product_id:
dqty = sum(
order_id.order_line.filtered(lambda p: p.product_id == self.product_id).mapped('qty_delivered'))
self.quantity = dqty
return {'domain': {'product_id': [('id', 'in', products)]}}

55
website_multi_product_return_management/models/sale_order.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import fields, models
class SaleOrder(models.Model):
"""inheriting sale_order model to set return orders """
_inherit = 'sale.order'
return_order_count = fields.Integer(string='Return Orders',
compute="_compute_returns",
help="Number of return orders")
def _compute_returns(self):
"""method to compute return count"""
sale_return_groups = self.env['sale.return'].sudo().read_group(
domain=[('sale_order_id', '=', self.ids)],
fields=['sale_order_id'], groupby=['sale_order_id'])
orders = self.sudo().browse()
for group in sale_return_groups:
sale_order = self.sudo().browse(group['sale_order_id'][0])
while sale_order:
if sale_order in self:
sale_order.return_order_count += group['sale_order_id_count']
orders |= sale_order
sale_order = False
(self - orders).return_order_count = 0
def action_open_returns(self):
"""This function returns an action that displays the sale return orders
from sale order"""
action = self.env['ir.actions.act_window']._for_xml_id(
'website_multi_product_return_management.sale_return_action')
domain = [('sale_order_id', '=', self.id)]
action['domain'] = domain
action['context'] = {'search_default_order': 1}
return action

246
website_multi_product_return_management/models/sale_return.py

@ -0,0 +1,246 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import api, fields, models
class ReturnOrder(models.Model):
"""Creating model for returning order"""
_name = 'sale.return'
_inherit = ['portal.mixin']
_rec_name = "name"
_order = "name"
_description = "Sale Return"
@api.model
def _get_default_name(self):
return self.env['ir.sequence'].get('sale.return')
active = fields.Boolean(string='Active', default=True, help='Active')
name = fields.Char(string="Name", default=_get_default_name,
help='Name of order')
sale_order_id = fields.Many2one('sale.order', string="Sale Order",
required=True, help='Correspondent sale order')
partner_id = fields.Many2one('res.partner', string="Customer",
help='Partner of return order')
user_id = fields.Many2one('res.users', string="Responsible",
default=lambda self: self.env.user,
help="User of the order")
create_date = fields.Datetime(string="Create Date",
help="Create date of the order")
stock_picking_ids = fields.One2many('stock.picking',
'return_order_pick_id',
domain="[('return_order_id','=',False)]",
string="Return Picking",
help="Shows the return picking of the"
" corresponding return order")
picking_count = fields.Integer(compute="_compute_delivery",
string='Picking Order',
copy=False, default=0, store=True,
help="Number of pickings")
delivery_count = fields.Integer(compute="_compute_delivery",
string='Delivery Order', copy=False,
default=0, store=True,
help="Number of delivery")
state = fields.Selection([('draft', 'Draft'), ('confirm', 'Confirm'),
('done', 'Done'), ('cancel', 'Canceled')],
string='Status', readonly=True, default='draft',
help="State of the return order")
source_pick_ids = fields.One2many('stock.picking', 'return_order_id',
string="Source Delivery",
domain="[('return_order_pick_id','=',False)]",
help="Shows the delivery orders of the"
" corresponding return order")
note = fields.Text("Note", help="Note to display")
return_line_ids = fields.One2many('return.order.line',
'order_id',
string="Return Lines",
help="Return order lines")
def action_return_confirm(self):
"""Confirm the sale return"""
if not self.source_pick_ids:
stock_picks = self.env['stock.picking'].sudo().search([('origin', '=', self.sale_order_id.name)])
moves = stock_picks.mapped('move_ids_without_package').sudo().filtered(
lambda p: p.product_id.id in self.return_line_ids.mapped('product_id').ids)
else:
moves = self.source_pick_ids.mapped('move_ids_without_package').sudo().filtered(
lambda p: p.product_id.id in self.return_line_ids.mapped('product_id').ids)
if moves:
moves = moves.sorted('product_uom_qty', reverse=True)
pick = moves[0].picking_id
vals = {'picking_id': pick.id}
return_pick_wizard = self.env['stock.return.picking'].sudo().create(vals)
return_pick_wizard._onchange_picking_id()
return_pick_wizard.product_return_moves.unlink()
lines = []
reason = ''
for line in self.return_line_ids:
move = moves.filtered(lambda m:m.product_id == line.product_id)
lines.append(
{'product_id': line.product_id.id, "quantity": line.received_qty,
'move_id': move.id, 'to_refund': line.to_refund})
reason = reason + '\n' + line.reason
lines = self.env['stock.return.picking.line'].create(lines)
return_pick_wizard.write({
'product_return_moves': [(6, 0, lines.ids)]
})
return_pick = return_pick_wizard._create_returns()
if return_pick:
return_pick = self.env['stock.picking'].sudo().browse(return_pick[0])
return_pick.update({'note': reason})
return_pick.write({'return_order_id': False, 'return_order_pick_id': self.id, 'return_order_picking': True})
self.write({'state': 'confirm'})
def action_return_cancel(self):
"""Cancel the return"""
self.write({'state': 'cancel'})
if self.stock_picking_ids:
for rec in self.stock_picking_ids.sudo().filtered(lambda s: s.state not in ['done', 'cancel']):
rec.action_cancel()
def _get_report_base_filename(self):
"""seting the file name"""
self.ensure_one()
return 'Sale Return - %s' % (self.name)
def _compute_access_url(self):
"""access url"""
super(ReturnOrder, self)._compute_access_url()
for order in self:
order.access_url = '/my/return_orders/%s' % order.id
@api.depends('stock_picking_ids', 'state')
def _compute_delivery(self):
"""Function to compute picking and delivery counts"""
for rec in self:
rec.delivery_count = 0
rec.picking_count = 0
if rec.source_pick_ids:
rec.delivery_count = len(rec.source_pick_ids)
else:
rec.delivery_count = self.env[
'stock.picking'].sudo().search_count(
[('return_order_id', 'in', self.ids),
('return_order_picking', '=', False)])
if rec.stock_picking_ids:
rec.picking_count = len(rec.stock_picking_ids)
else:
rec.picking_count = self.env[
'stock.picking'].sudo().search_count(
[('return_order_pick_id', 'in', self.ids),
('return_order_picking', '=', True)])
def action_view_picking(self):
"""Function to view the stock picking transfers"""
action = self.env["ir.actions.actions"]._for_xml_id(
"stock.action_picking_tree_all")
pickings = self.mapped('stock_picking_ids')
if not self.stock_picking_ids:
pickings = self.env['stock.picking'].sudo().search(
[('return_order_pick_id', '=', self.id),
('return_order_picking', '=', True)])
if len(pickings) > 1:
action['domain'] = [('id', 'in', pickings.ids)]
elif pickings:
form_view = [(self.env.ref('stock.view_picking_form').id, 'form')]
if 'views' in action:
action['views'] = form_view + [(state, view) for state, view
in action['views'] if view != 'form']
else:
action['views'] = form_view
action['res_id'] = pickings.id
# Prepare the context.
picking_id = pickings.sudo().filtered(
lambda l: l.picking_type_id.code == 'outgoing')
if picking_id:
picking_id = picking_id[0]
else:
picking_id = pickings[0]
action['context'] = dict(self._context,
default_partner_id=self.partner_id.id,
default_picking_type_id=picking_id.
picking_type_id.id)
return action
def action_view_delivery(self):
"""Function to view the delivery transfers"""
action = self.env["ir.actions.actions"]._for_xml_id(
"stock.action_picking_tree_all")
pickings = self.mapped('source_pick_ids')
if not self.source_pick_ids:
pickings = self.env['stock.picking'].sudo().search(
[('return_order_id', '=', self.id),
('return_order_picking', '=', False)])
if len(pickings) > 1:
action['domain'] = [('id', 'in', pickings.ids)]
elif pickings:
form_view = [(self.env.ref('stock.view_picking_form').id, 'form')]
if 'views' in action:
action['views'] = form_view + [(state, view) for state, view in
action['views'] if
view != 'form']
else:
action['views'] = form_view
action['res_id'] = pickings.id
# Prepare the context.
picking_id = pickings.filtered(
lambda l: l.picking_type_id.code == 'outgoing')
if picking_id:
picking_id = picking_id[0]
else:
picking_id = pickings[0]
action['context'] = dict(self._context,
default_partner_id=self.partner_id.id,
default_picking_type_id=picking_id.
picking_type_id.id)
return action
@api.onchange('sale_order_id', 'source_pick_ids')
def _onchange_sale_order_id(self):
"""All the fields are updated according to the sale order"""
delivery = None
if self.sale_order_id:
self.partner_id = self.sale_order_id.partner_id
delivery = self.env['stock.picking'].sudo().search(
[('origin', '=', self.sale_order_id.name)])
if self.source_pick_ids:
delivery = self.source_pick_ids
if delivery:
product_ids = delivery.move_ids_without_package.mapped(
'product_id').ids
delivery = delivery.ids
else:
product_ids = self.sale_order_id.order_line.mapped('product_id').ids
return {'domain': {'source_pick_ids': [('id', 'in', delivery)],
'product_id': [('id', 'in', product_ids)]}}
@api.onchange('product_id')
def _onchange_product_id(self):
"""Update the received quantity based on the selected product and source
pick."""
if self.product_id and self.source_pick_ids:
moves = self.source_pick_ids.mapped(
'move_ids_without_package').sudo().filtered(
lambda p: p.product_id == self.product_id)
if moves:
self.received_qty = sum(moves.mapped('quantity_done'))

52
website_multi_product_return_management/models/stock_picking.py

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import fields, models
class StockPicking(models.Model):
"""Inheriting stock_picking model for validating the return order"""
_inherit = 'stock.picking'
return_order_id = fields.Many2one('sale.return',
string='Return order',
help="Shows the return order of current"
" transfer")
return_order_pick_id = fields.Many2one('sale.return',
string='Return order Pick',
help="Shows the return order picking"
" of current return order")
return_order_picking = fields.Boolean(string='Return order picking',
help="Helps to identify delivery and"
" return picking, if true the "
"transfer is return picking"
" else delivery")
def button_validate(self):
"""Validating the stock picking and update the return order"""
res = super(StockPicking, self).button_validate()
for rec in self:
if rec.return_order_pick_id:
if any(line.state != 'done' for line in
rec.return_order_pick_id.stock_picking_ids):
return res
else:
rec.return_order_pick_id.write({'state': 'done'})
return res

37
website_multi_product_return_management/models/stock_return_picking.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Bhagyadev K P (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
from odoo import models
class StockReturnPicking(models.TransientModel):
"""Inheriting stock_return_picking model for creating returns"""
_inherit = 'stock.return.picking'
def _create_returns(self):
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

14
website_multi_product_return_management/report/sale_return_reports.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Return order report-->
<record id="report_sale_returns" model="ir.actions.report">
<field name="name">Sale Return</field>
<field name="model">sale.return</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">website_multi_product_return_management.report_salereturn</field>
<field name="report_file">website_multi_product_return_management.report_salereturn</field>
<field name="print_report_name">'Sale Retun - %s' % object.name</field>
<field name="binding_model_id" ref="model_sale_return"/>
<field name="binding_type">report</field>
</record>
</odoo>

78
website_multi_product_return_management/report/sale_return_templates.xml

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Return order report template in html_container-->
<template id="report_salereturn">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="website_multi_product_return_management.report_sale_return"
t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
<!-- Return order report template-->
<template id="report_sale_return">
<t t-call="web.external_layout">
<t t-set="doc"
t-value="doc.with_context(lang=doc.partner_id.lang)"/>
<div class="page">
<div class="oe_structure"/>
<h2 class="mt16">
<span>Return Order #</span>
<span t-field="doc.name"/>
</h2>
<div class="row mt32 mb32" id="informations">
<div t-if="doc.partner_id"
class="col-auto col-3 mw-100 mb-2">
<strong>Customer:</strong>
<p class="m-0" t-field="doc.partner_id"/>
</div>
<div t-if="doc.sale_order_id"
class="col-auto col-3 mw-100 mb-2">
<strong>Sale Order:</strong>
<p class="m-0" t-field="doc.sale_order_id"/>
</div>
<div t-if="doc.create_date"
class="col-auto col-3 mw-100 mb-2">
<strong>Creation Date:</strong>
<p class="m-0" t-field="doc.create_date"
t-options='{"widget": "date"}'/>
</div>
<div t-if="doc.user_id"
class="col-auto col-3 mw-100 mb-2"
name="expiration_date">
<strong>Responsible:</strong>
<p class="m-0" t-field="doc.user_id"/>
</div>
</div>
<table class="table table-sm o_main_table">
<!-- In case we want to repeat the header, remove "display: table-row-group" -->
<thead style="display: table-row-group">
<tr>
<th name="th_description" class="text-left">
Product
</th>
<th name="th_quantity" class="text-left">Quantity
</th>
<th name="th_quantity" class="text-left">Reason</th>
</tr>
</thead>
<tbody class="sale_tbody">
<tr t-foreach="doc.return_line_ids" t-as="line"
t-att-class="'bg-200 font-weight-bold'">
<td name="td_product">
<span t-field="line.product_id"/>
</td>
<td name="td_quantity" class="text-left">
<span t-esc="line.received_qty"/>
<span t-field="line.product_id.uom_id"/>
</td>
<td name="td_quantity" class="text-left">
<span t-field="line.reason"/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</template>
</odoo>

3
website_multi_product_return_management/security/ir.model.access.csv

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sale_return_user,access.sale.return.user,model_sale_return,base.group_user,1,1,1,1
access_sale_return_line_user,access.sale.return.line.user,model_return_order_line,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sale_return_user access.sale.return.user model_sale_return base.group_user 1 1 1 1
3 access_sale_return_line_user access.sale.return.line.user model_return_order_line base.group_user 1 1 1 1

BIN
website_multi_product_return_management/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
website_multi_product_return_management/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
website_multi_product_return_management/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
website_multi_product_return_management/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
website_multi_product_return_management/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
website_multi_product_return_management/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
website_multi_product_return_management/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
website_multi_product_return_management/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_multi_product_return_management/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_multi_product_return_management/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
website_multi_product_return_management/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
website_multi_product_return_management/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
website_multi_product_return_management/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
website_multi_product_return_management/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
website_multi_product_return_management/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
website_multi_product_return_management/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
website_multi_product_return_management/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_multi_product_return_management/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
website_multi_product_return_management/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
website_multi_product_return_management/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
website_multi_product_return_management/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
website_multi_product_return_management/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
website_multi_product_return_management/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
website_multi_product_return_management/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
website_multi_product_return_management/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
website_multi_product_return_management/static/description/assets/modules/4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
website_multi_product_return_management/static/description/assets/modules/5.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
website_multi_product_return_management/static/description/assets/modules/6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
website_multi_product_return_management/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

BIN
website_multi_product_return_management/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
website_multi_product_return_management/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

653
website_multi_product_return_management/static/description/index.html

@ -0,0 +1,653 @@
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42"
style="width: 42px; height: 42px;"/>
<div>
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.sh
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Multi Product Return From Website</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Manage Sale Order return from Website
</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Explore This Module
</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">
Learn more about this module
</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">
View features of this module
</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">
View screenshots for this module
</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Overview
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
This module allows to create and manage sale order return from website.
The logged user can create multiple product return from website. The
authorize persons can manage the return orders. And allow the portal
users can view their return orders from the account portal view.
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Features
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center"
style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create Return Orders From Website</span>
</div>
<div class="d-flex align-items-center"
style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Portal Return Order View</span>
</div>
<div class="d-flex align-items-center"
style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Link Return With Sale Order</span>
</div>
<div class="d-flex align-items-center"
style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Link Return Order With Partner</span>
</div>
<div class="d-flex align-items-center"
style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Return Order print</span>
</div>
</div>
</div>
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Button on Order Page on Portal.</h3>
<img src="assets/screenshots/1.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Product Screen.</h3>
<img src="assets/screenshots/2.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Orders Portal View.</h3>
<img src="assets/screenshots/3.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Orders tree view in Portal.</h3>
<img src="assets/screenshots/4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Orders detailed view in Portal.</h3>
<img src="assets/screenshots/5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
RMA Return Orders - Backend</h3>
<img src="assets/screenshots/6.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Orders form view in backend.</h3>
<img src="assets/screenshots/7.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Delivery Order Tab and Smart button</h3>
<img src="assets/screenshots/8.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Process on DO picking.</h3>
<img src="assets/screenshots/9.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Delivery Order Return Button.</h3>
<img src="assets/screenshots/10.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Delivery Order Return Wizard(Odoo Standard).</h3>
<img src="assets/screenshots/11.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Picking Order Tab and Smart button.</h3>
<img src="assets/screenshots/12.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Smart Button on Customer Form.</h3>
<img src="assets/screenshots/13.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Smart Button on Sale Order Form.</h3>
<img src="assets/screenshots/14.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Return Orders - Report Sample.</h3>
<img src="assets/screenshots/15.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding:30px">
<div class="carousel-item" style="min-height:198.656px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/index_and_follow/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius:0px"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/website_product_attachments/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius:0px"
src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/odoo_website_helpdesk_dashboard/#"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius:0px"
src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height:198.656px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/education_student_portal/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius:0px"
src="assets/modules/4.jpg">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/featured_brand_snippet/#"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius:0px"
src="assets/modules/5.jpg">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/website_hide_button/#"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius:0px"
src="assets/modules/6.jpg">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Customization
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Implementation
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Support
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire Odoo Developer
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Integration
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Migration
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Consultancy
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Implementation
</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Licensing Consultancy
</h6>
</div>
</div>
</div>
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure and sell your products
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy configuration and convivial experience
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for educational management
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and schedule your operations
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile friendly, awe-inspiring product pages
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of services and invoice
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or restaurant methodically
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An all-inclusive hotel management application
</p>
</div>
</div>
</div>
</div>
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48"
style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help?
Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com
</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52"
style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
+91 86068 27707
</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

59
website_multi_product_return_management/static/src/js/sale_return.js

@ -0,0 +1,59 @@
odoo.define('website_multi_product_return_management.return', function (require) {
"use strict";
var publicWidget = require('web.public.widget');
var ajax = require('web.ajax');
// Modal hiding and showing in button click
$("#hidden_box_btn").on('click', function () {
$('#hidden_box').modal('show');
})
$("#close-button").on('click', function () {
$('#hidden_box').modal('hide');
})
// Adding return quantity and it's details
$(".js_add_json").on('click', function (ev) {
var $link = $(ev.currentTarget);
var $input = $link.closest('.input-group').find("input");
var min = parseFloat($input.data("min") || 0);
var max = parseFloat($input.data("max") || Infinity);
var previousQty = parseFloat($input.val() || 0, 10);
var quantity = ($link.has(".fa-minus").length ? -1 : 1) + previousQty;
var newQty = quantity > min ? (quantity < max ? quantity : max) : min;
if (newQty !== previousQty) {
$input.val(newQty).trigger('change');
}
return false;
})
// Form submit function
$('#sale_return_form').on('submit', function(submission) {
var val = []
submission.preventDefault();
$("tr.order_line").each(function() {
var qty = parseFloat($(this).find(".quantity").val() || 0);
if (qty !== 0){
val.push({ 'order_id' : $(this).find(".quantity").data("order-id"),
'line_id' : $(this).find(".quantity").data("line-id"),
'deli_qty' : $(this).find(".quantity").data("delivered_qty"),
'quantity' : $(this).find(".quantity").val(),
'product_id' : $(this).find(".quantity").data('product-id'),
'reason' : $(this).find("#return_reason").val()});
}
});
if (val.length !== 0){
ajax.jsonRpc('/sale_return', 'call', {
'vals':val,
}).then(function(result){
if (result == true){
window.location.href = '/my/request-thank-you';
}
else{
alert("Retry again");
}
});
}
else{
alert("Please specify at least one return quantity");
submission.preventDefault();
}
});
});

19
website_multi_product_return_management/views/res_partner_views.xml

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Inheriting res partner form view to add return orders button-->
<record id="view_partner_form" model="ir.ui.view">
<field name="name">res.partner.view.form.inherit.website.multi.product.return.management</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field eval="1" name="priority"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_open_returns" type="object"
class="oe_stat_button" icon="fa-truck"
attrs="{'invisible': [('return_order_count','=', 0)]}">
<field name="return_order_count" widget="statinfo"/>
</button>
</xpath>
</field>
</record>
</odoo>

18
website_multi_product_return_management/views/sale_order_views.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Inheriting sale order form view to add return orders button-->
<record id="view_order_form" model="ir.ui.view">
<field name="name">sale.order.view.form.inherit.website.multi.product.return.management</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_open_returns" type="object"
class="oe_stat_button" icon="fa-truck"
attrs="{'invisible': [('return_order_count','=', 0)]}">
<field name="return_order_count" widget="statinfo"/>
</button>
</xpath>
</field>
</record>
</odoo>

123
website_multi_product_return_management/views/sale_return_views.xml

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Sale return form view-->
<record id="sale_return_view_form" model="ir.ui.view">
<field name="name">sale.return.view.form</field>
<field name="model">sale.return</field>
<field name="priority">100</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_return_confirm" string="Confirm" class="oe_highlight"
type="object" states="draft"/>
<button name="action_return_cancel" string="Cancel" type="object" states="draft,confirm"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,done"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_picking" type="object" class="oe_stat_button"
icon="fa-pencil-square-o" attrs="{'invisible': [('picking_count', '=', 0)]}">
<field name="picking_count" widget="statinfo" string="Return Picking"/>
</button>
<button name="action_view_delivery" type="object" class="oe_stat_button"
icon="fa-pencil-square-o" attrs="{'invisible': [('delivery_count', '=', 0)]}">
<field name="delivery_count" widget="statinfo" string="Delivery order"/>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name"/>
</h1>
</div>
<group>
<group>
<field name="sale_order_id"/>
<field name="partner_id"/>
</group>
<group>
<field name="create_date"/>
<field name="user_id"/>
<field name="stock_picking_ids" invisible="1"/>
</group>
</group>
<notebook>
<page string="Return Lines" name="order_line">
<field name="return_line_ids" context="{'order_id':sale_order_id}">
<tree editable="bottom">
<field name="product_id" />
<field name="product_tmpl_id" invisible="1"/>
<field name="quantity" readonly="1" force_save="1"/>
<field name="received_qty"/>
<field name="reason"/>
<field name="to_refund" optional="hide"/>
</tree>
</field>
</page>
<page string="Delivery Order" name="delivery_order">
<field name="source_pick_ids"/>
</page>
<page string="Return Picking" name="return_picking">
<field name="stock_picking_ids"/>
</page>
<page string="Other" name="other_info">
<separator colspan="4" string="Other Details"/>
<field name="note" colspan="4" nolabel="1"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- sale return tree view-->
<record id="sale_return_view_tree" model="ir.ui.view">
<field name="name">sale.return.view.tree</field>
<field name="model">sale.return</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="sale_order_id"/>
<field name="partner_id"/>
<field name="create_date"/>
<field name="user_id"/>
<field name="state"/>
</tree>
</field>
</record>
<!-- sale return search view-->
<record id="sale_return_view_search" model="ir.ui.view">
<field name="name">sale.return.view.search</field>
<field name="model">sale.return</field>
<field name="arch" type="xml">
<search>
<field name="sale_order_id" string="Sale order"/>
<field name="partner_id" string="Customer"/>
<filter string="Done" name="done" domain="[('state', '=', 'done')]" help="Done order"/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
<separator/>
<group expand="0" string="Group By">
<filter string="Status" name="status" domain="[]" context="{'group_by':'state'}"/>
<filter string="Sale Order" name="order" context="{'group_by':'sale_order_id'}"/>
<filter string="Customer" name="customer" domain="[]" context="{'group_by':'partner_id'}"/>
</group>
</search>
</field>
</record>
<!-- sale return action-->
<record id="sale_return_action" model="ir.actions.act_window">
<field name="name">Sale Return</field>
<field name="res_model">sale.return</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create The First Return
</p>
</field>
</record>
<!-- Return orders menu-->
<menuitem id="sale_return_menu"
parent="sale.sale_menu_root"
name="Return Orders"
action="website_multi_product_return_management.sale_return_action"/>
</odoo>

16
website_multi_product_return_management/views/stock_picking_views.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Inheriting stock picking form view-->
<record id="view_picking_form" model="ir.ui.view">
<field name="name">stock.picking.view.form.inherit.website.multi.product.return.management</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<field name="origin" position="after">
<field name="return_order_id" attrs="{'invisible': [('return_order_id','=', False)]}"/>
<field name="return_order_pick_id" attrs="{'invisible': [('return_order_pick_id','=', False)]}"/>
<field name="return_order_picking" invisible="1"/>
</field>
</field>
</record>
</odoo>

343
website_multi_product_return_management/views/website_portal_templates.xml

@ -0,0 +1,343 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Product return wizard view-->
<template id="sale_order_portal_content_return"
name="Sales Order Portal Content"
inherit_id="sale.sale_order_portal_content">
<xpath expr="//div[@id='introduction']/h2" position="replace">
<form id="sale_return_form">
<div id="hidden_box" class="modal fade">
<div class="modal-dialog modal-content"
style="border:solid 1px #604e5b; min-height:500px;max-width: 800px;">
<div class="modal-header">
<h5 class="modal-title">
<b>Return Products</b>
</h5>
</div>
<div class="modal-body" id="pop_html">
<form>
<table t-att-data-order-id="sale_order.id"
t-att-data-token="sale_order.access_token"
class="table table-sm"
id="sales_return_order_table">
<thead class="bg-100">
<tr>
<th class="text-left">Products</th>
<th class="text-right">Quantity</th>
<th class="text-right">Return
Quantity
</th>
<th class="text-right"
style="width:25px;">Reason
</th>
</tr>
</thead>
<tbody class="sale_tbody">
<tr t-foreach="sale_order.order_line.filtered(lambda x:x.product_id.type!='service' and not x.display_type)"
t-as="line" class="order_line">
<t t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<td id="product_name">
<span t-field="line.name"/>
</td>
<td class="text-right">
<div id="quote_qty">
<span t-field="line.product_uom_qty"/>
<span t-field="line.product_uom"/>
</div>
</td>
<td>
<div class="css_quantity input-group">
<div class="input-group-prepend">
<a t-attf-href="#"
class="btn btn-link js_add_json d-none d-md-inline-block"
aria-label="Remove one"
title="Remove one">
<i class="fa fa-minus"></i>
</a>
</div>
<input type="text"
class="form-control quantity"
style="width: 50px;height: 50px;text-align: center;"
t-att-data-min="0"
t-att-data-max="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
t-att-data-line-id="line.id"
t-att-data-order-id="sale_order.id"
t-att-data-product-id="line.product_id.id"
t-att-data-delivered_qty="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
readonly="1"/>
<div class="input-group-append">
<a t-attf-href="#"
class="btn btn-link float_left d-none d-md-inline-block js_add_json"
aria-label="Add one"
title="Add one">
<i class="fa fa-plus"></i>
</a>
</div>
</div>
</td>
<td style="width:20px;">
<textarea id="return_reason"
name="reason"
placeholder="Reason"/>
</td>
</t>
</tr>
</tbody>
</table>
</form>
</div>
<div class="modal-footer">
<button id='submit'
class="btn btn-secondary flex-grow-1 mb-1">
Submit
</button>
<button type="button" class="btn btn-secondary"
id="close-button"
data-dismiss="modal">Close
</button>
</div>
</div>
</div>
<div class="row">
<div class="col-10">
<h2 class="my-0">
<t t-esc="sale_order.type_name"/>
<em t-esc="sale_order.name"/>
</h2>
</div>
<div class="col-2">
<span class="btn-group flex-grow-1 mb-1 float-right">
<t t-if="sale_order.state in ['sale','done'] and sum(sale_order.order_line.mapped('qty_delivered')) > 0">
<a class="btn btn-secondary btn-block"
style="color: #FFFFFF;"
id="hidden_box_btn">
Return
</a>
</t>
</span>
</div>
</div>
</form>
</xpath>
</template>
<template id="portal_my_home_menu_sale_return"
name="Portal layout : Return Order menu entry"
inherit_id="portal.portal_breadcrumbs" priority="10">
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
<li t-if="page_name == 'Sale_Return' or sale_return"
t-attf-class="breadcrumb-item #{'active ' if not orders else ''}">
<a t-if="orders"
t-attf-href="/my/return_orders?{{ keep_query() }}">Return
orders
</a>
<t t-else="">Return Order</t>
</li>
</xpath>
</template>
<template id="portal_my_home_sale_return" name="Show Return Order"
customize_show="True"
inherit_id="portal.portal_my_home" priority="25">
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
<t t-call="portal.portal_docs_entry">
<t t-set="title">Return Orders</t>
<t t-set="url" t-value="'/my/return_orders'"/>
<t t-set="placeholder_count" t-value="'return_count'"/>
</t>
</xpath>
</template>
<template id="portal_my_returns" name="Portal: My Sale Return">
<t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/>
<t t-call="portal.portal_searchbar">
<t t-set="title">Sales Return</t>
</t>
<t t-if="not orders">
<p>There are currently no return order for your account.</p>
</t>
<t t-if="orders" t-call="portal.portal_table">
<thead>
<tr class="active">
<th>Sale Return #</th>
<th class="text-right">Create Date</th>
<th class="text-right">Order</th>
<th class="text-right">State</th>
</tr>
</thead>
<tbody>
<t t-foreach="orders" t-as="order">
<tr>
<td>
<a t-att-href="order.get_portal_url()">
<t t-esc="order.name"/>
</a>
</td>
<td class="text-right">
<span t-field="order.create_date"/>
</td>
<td class="text-right">
<span t-field="order.sale_order_id"/>
</td>
<td class="text-right">
<t t-if="order.state == 'draft'">
<span class="badge bg-warning"><i
class="fa fa-fw fa-file-text"/>Draft
</span>
</t>
<t t-if="order.state == 'done'">
<span class="badge bg-success "><i
class="fa fa-fw fa-file-text"/>Done
</span>
</t>
<t t-if="order.state == 'confirm'">
<span class="badge bg-info">
<i
class="fa fa-fw fa-file-text"/>
Confirmed
</span>
</t>
<t t-if="order.state == 'cancel'">
<span class="badge bg-dark">
<i class="fa fa-fw fa-remove"/>
Cancelled
</span>
</t>
</td>
</tr>
</t>
</tbody>
</t>
</t>
</template>
<template id="portal_sale_return_page" name="Portal: My Sale Return">
<t t-call="portal.portal_layout">
<t t-set="sale_return" t-value="orders"/>
<div id="optional_placeholder"></div>
<div class="container">
<div class="row mt16 o_portal_purchase_sidebar">
<!-- Sidebar -->
<t t-call="portal.portal_record_sidebar">
<t t-set="classes"
t-value="'col-lg-auto d-print-none'"/>
<t t-set="title">
<h2 class="mb-0">
<b t-field="sale_return.name"
data-id="return_name"/>
</h2>
</t>
<t t-set="entries">
<ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column">
<li class="list-group-item flex-grow-1">
<div class="o_download_pdf btn-toolbar flex-sm-nowrap">
<div class="btn-group flex-grow-1 mr-1 mb-1">
<a class="btn btn-secondary btn-block o_download_btn"
t-att-href="sale_return.get_portal_url(report_type='pdf', download=True)"
title="Download">
<i class="fa fa-download"/>
Download
</a>
</div>
<div class="btn-group flex-grow-1 mb-1">
<a class="btn btn-secondary btn-block o_print_btn o_portal_invoice_print"
t-att-href="sale_return.get_portal_url(report_type='pdf')"
id="print_invoice_report"
title="Print" target="_blank">
<i
class="fa fa-print"/>
Print
</a>
</div>
</div>
</li>
<li t-if="sale_return.user_id"
class="list-group-item flex-grow-1">
<div class="small mb-1">
<strong class="text-muted">
Representative
</strong>
</div>
<div class="row flex-nowrap">
<div class="col flex-grow-0 pr-2">
</div>
<div class="col pl-0"
style="min-width: 150px">
<span t-field="sale_return.user_id"
t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
<a href="#discussion" class="small">
<i class="fa fa-comment"></i>
Send
message
</a>
</div>
</div>
</li>
</ul>
</t>
</t>
<div class=" col-lg col-12 justify-content-end w-100">
<div class="card pb-5">
<div class="card-header bg-white pb-1">
<div class="row">
<div class="col-lg-12">
<h2 class="font-weight-normal">
<t t-if="orders.state in ['draft']">
Draft Return
</t>
<t t-else="1">
Sale Return
</t>
<span class="font-italic"
t-esc="orders.name"/>
</h2>
</div>
</div>
</div>
<div class="card-body">
<div class="mb-4">
<strong>Creation Date:</strong>
<span t-field="orders.create_date"
t-options='{"widget": "date"}'/>
<br/>
<div t-att-class="'d-inline' if orders.sale_order_id else 'd-none'">
<strong>Sale Order:</strong>
<span class="ml-1"
t-field="orders.sale_order_id"/>
</div>
</div>
<h3 class="font-weight-normal">Returns</h3>
<table class="table table-sm">
<thead class="bg-100">
<tr>
<th>Products</th>
<th class="text-right">Quantity</th>
<th class="text-right">Reason</th>
</tr>
</thead>
<tbody>
<tr t-foreach="orders.return_line_ids"
t-as="line">
<td>
<span t-esc="line.product_id.name"/>
</td>
<td class="text-right">
<span t-esc="line.received_qty"/>
</td>
<td class="text-right">
<span t-esc="line.reason"/>
</td>
</tr>
</tbody>
</table>
<div class="row"/>
</div>
</div>
</div>
</div>
</div>
<div class="oe_structure mb32"/>
</t>
</template>
</odoo>

29
website_multi_product_return_management/views/website_thankyou_template.xml

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Thank you page template when return order placed.-->
<template id="customers_request_thank_page" name="Customer Request Thank">
<t t-call="website.layout">
<div class="oe_structure">
<div class="contain">
<div id="wrap">
<div class="oe_structure" id="oe_structure_website_form_contact_us_thanks_1"/>
<div class="container pt-3">
<h1>Thanks!</h1>
<div class="row">
<div class="col-lg-12">
<div class="alert alert-success" role="status">
Your order for return has been sent successfully.
</div>
<p>
We will get back to you shortly.
</p>
</div>
</div>
</div>
<div class="oe_structure" id="oe_structure_website_form_contact_us_thanks_2"/>
</div>
</div>
</div>
</t>
</template>
</odoo>
Loading…
Cancel
Save