diff --git a/website_multi_product_return_management/README.rst b/website_multi_product_return_management/README.rst new file mode 100644 index 000000000..3b00a049b --- /dev/null +++ b/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 `__ + +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 `__ + +Further information +=================== +HTML Description: ``__ diff --git a/website_multi_product_return_management/__init__.py b/website_multi_product_return_management/__init__.py new file mode 100644 index 000000000..5b3278a7f --- /dev/null +++ b/website_multi_product_return_management/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +from . import models +from . import controllers diff --git a/website_multi_product_return_management/__manifest__.py b/website_multi_product_return_management/__manifest__.py new file mode 100644 index 000000000..fa18f7c25 --- /dev/null +++ b/website_multi_product_return_management/__manifest__.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# 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 . +################################################################################ +{ + '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, +} diff --git a/website_multi_product_return_management/controllers/__init__.py b/website_multi_product_return_management/controllers/__init__.py new file mode 100644 index 000000000..73a9c53ec --- /dev/null +++ b/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(). +# 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 . +################################################################################ +from . import website_multi_product_return_management +from . import portal diff --git a/website_multi_product_return_management/controllers/portal.py b/website_multi_product_return_management/controllers/portal.py new file mode 100644 index 000000000..fd9bd7b6e --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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/'], + 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/'], 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) diff --git a/website_multi_product_return_management/controllers/website_multi_product_return_management.py b/website_multi_product_return_management/controllers/website_multi_product_return_management.py new file mode 100644 index 000000000..e4ecd366a --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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') diff --git a/website_multi_product_return_management/data/ir_sequence_data.xml b/website_multi_product_return_management/data/ir_sequence_data.xml new file mode 100644 index 000000000..b50b2d6dc --- /dev/null +++ b/website_multi_product_return_management/data/ir_sequence_data.xml @@ -0,0 +1,13 @@ + + + + + + Sale Return + sale.return + RET + 5 + + + + diff --git a/website_multi_product_return_management/doc/RELEASE_NOTES.md b/website_multi_product_return_management/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..a027eae14 --- /dev/null +++ b/website_multi_product_return_management/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 05.01.2024 +#### Version 16.0.1.0.0 +##### ADD +- Initial Commit for Multi Product Return From Website diff --git a/website_multi_product_return_management/models/__init__.py b/website_multi_product_return_management/models/__init__.py new file mode 100644 index 000000000..d0160c925 --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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 diff --git a/website_multi_product_return_management/models/res_partner.py b/website_multi_product_return_management/models/res_partner.py new file mode 100644 index 000000000..9c4d79a1b --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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 diff --git a/website_multi_product_return_management/models/return_order_line.py b/website_multi_product_return_management/models/return_order_line.py new file mode 100644 index 000000000..4dd868da1 --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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)]}} diff --git a/website_multi_product_return_management/models/sale_order.py b/website_multi_product_return_management/models/sale_order.py new file mode 100644 index 000000000..d6d4ff16b --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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 diff --git a/website_multi_product_return_management/models/sale_return.py b/website_multi_product_return_management/models/sale_return.py new file mode 100644 index 000000000..60f248ecc --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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')) diff --git a/website_multi_product_return_management/models/stock_picking.py b/website_multi_product_return_management/models/stock_picking.py new file mode 100644 index 000000000..14da51fdf --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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 diff --git a/website_multi_product_return_management/models/stock_return_picking.py b/website_multi_product_return_management/models/stock_return_picking.py new file mode 100644 index 000000000..632d55aef --- /dev/null +++ b/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(). +# 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 . +################################################################################ +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 diff --git a/website_multi_product_return_management/report/sale_return_reports.xml b/website_multi_product_return_management/report/sale_return_reports.xml new file mode 100644 index 000000000..c7ce6e7e6 --- /dev/null +++ b/website_multi_product_return_management/report/sale_return_reports.xml @@ -0,0 +1,14 @@ + + + + + Sale Return + sale.return + qweb-pdf + website_multi_product_return_management.report_salereturn + website_multi_product_return_management.report_salereturn + 'Sale Retun - %s' % object.name + + report + + diff --git a/website_multi_product_return_management/report/sale_return_templates.xml b/website_multi_product_return_management/report/sale_return_templates.xml new file mode 100644 index 000000000..a246c70f8 --- /dev/null +++ b/website_multi_product_return_management/report/sale_return_templates.xml @@ -0,0 +1,78 @@ + + + + + + + diff --git a/website_multi_product_return_management/security/ir.model.access.csv b/website_multi_product_return_management/security/ir.model.access.csv new file mode 100644 index 000000000..03c1be82e --- /dev/null +++ b/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 diff --git a/website_multi_product_return_management/static/description/assets/icons/check.png b/website_multi_product_return_management/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/check.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/chevron.png b/website_multi_product_return_management/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/chevron.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/cogs.png b/website_multi_product_return_management/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/cogs.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/consultation.png b/website_multi_product_return_management/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/consultation.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/ecom-black.png b/website_multi_product_return_management/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/ecom-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/education-black.png b/website_multi_product_return_management/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/education-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/hotel-black.png b/website_multi_product_return_management/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/hotel-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/license.png b/website_multi_product_return_management/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/license.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/lifebuoy.png b/website_multi_product_return_management/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/lifebuoy.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/manufacturing-black.png b/website_multi_product_return_management/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/manufacturing-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/pos-black.png b/website_multi_product_return_management/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/pos-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/puzzle.png b/website_multi_product_return_management/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/puzzle.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/restaurant-black.png b/website_multi_product_return_management/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/restaurant-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/service-black.png b/website_multi_product_return_management/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/service-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/trading-black.png b/website_multi_product_return_management/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/trading-black.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/training.png b/website_multi_product_return_management/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/training.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/update.png b/website_multi_product_return_management/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/update.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/user.png b/website_multi_product_return_management/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/user.png differ diff --git a/website_multi_product_return_management/static/description/assets/icons/wrench.png b/website_multi_product_return_management/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/icons/wrench.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/categories.png b/website_multi_product_return_management/static/description/assets/misc/categories.png new file mode 100644 index 000000000..bedf1e0b1 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/categories.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/check-box.png b/website_multi_product_return_management/static/description/assets/misc/check-box.png new file mode 100644 index 000000000..42caf24b9 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/check-box.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/compass.png b/website_multi_product_return_management/static/description/assets/misc/compass.png new file mode 100644 index 000000000..d5fed8faa Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/compass.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/corporate.png b/website_multi_product_return_management/static/description/assets/misc/corporate.png new file mode 100644 index 000000000..2eb13edbf Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/corporate.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/customer-support.png b/website_multi_product_return_management/static/description/assets/misc/customer-support.png new file mode 100644 index 000000000..79efc72ed Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/customer-support.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/cybrosys-logo.png b/website_multi_product_return_management/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 000000000..cc3cc0ccf Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/cybrosys-logo.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/features.png b/website_multi_product_return_management/static/description/assets/misc/features.png new file mode 100644 index 000000000..b41769f77 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/features.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/logo.png b/website_multi_product_return_management/static/description/assets/misc/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/logo.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/pictures.png b/website_multi_product_return_management/static/description/assets/misc/pictures.png new file mode 100644 index 000000000..56d255fe9 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/pictures.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/pie-chart.png b/website_multi_product_return_management/static/description/assets/misc/pie-chart.png new file mode 100644 index 000000000..426e05244 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/pie-chart.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/right-arrow.png b/website_multi_product_return_management/static/description/assets/misc/right-arrow.png new file mode 100644 index 000000000..730984a06 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/right-arrow.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/star.png b/website_multi_product_return_management/static/description/assets/misc/star.png new file mode 100644 index 000000000..2eb9ab29f Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/star.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/support.png b/website_multi_product_return_management/static/description/assets/misc/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/support.png differ diff --git a/website_multi_product_return_management/static/description/assets/misc/whatsapp.png b/website_multi_product_return_management/static/description/assets/misc/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/misc/whatsapp.png differ diff --git a/website_multi_product_return_management/static/description/assets/modules/1.png b/website_multi_product_return_management/static/description/assets/modules/1.png new file mode 100644 index 000000000..dda9b96e1 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/modules/1.png differ diff --git a/website_multi_product_return_management/static/description/assets/modules/2.png b/website_multi_product_return_management/static/description/assets/modules/2.png new file mode 100644 index 000000000..df65629bf Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/modules/2.png differ diff --git a/website_multi_product_return_management/static/description/assets/modules/3.png b/website_multi_product_return_management/static/description/assets/modules/3.png new file mode 100644 index 000000000..fa478cd14 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/modules/3.png differ diff --git a/website_multi_product_return_management/static/description/assets/modules/4.jpg b/website_multi_product_return_management/static/description/assets/modules/4.jpg new file mode 100644 index 000000000..793b14f11 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/modules/4.jpg differ diff --git a/website_multi_product_return_management/static/description/assets/modules/5.jpg b/website_multi_product_return_management/static/description/assets/modules/5.jpg new file mode 100644 index 000000000..acf97a878 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/modules/5.jpg differ diff --git a/website_multi_product_return_management/static/description/assets/modules/6.jpg b/website_multi_product_return_management/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..291635d04 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/modules/6.jpg differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/1.png b/website_multi_product_return_management/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..02a169f09 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/1.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/10.png b/website_multi_product_return_management/static/description/assets/screenshots/10.png new file mode 100644 index 000000000..9ed829cf1 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/10.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/11.png b/website_multi_product_return_management/static/description/assets/screenshots/11.png new file mode 100644 index 000000000..842bb7a85 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/11.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/12.png b/website_multi_product_return_management/static/description/assets/screenshots/12.png new file mode 100644 index 000000000..a33b058fd Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/12.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/13.png b/website_multi_product_return_management/static/description/assets/screenshots/13.png new file mode 100644 index 000000000..a37d85336 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/13.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/14.png b/website_multi_product_return_management/static/description/assets/screenshots/14.png new file mode 100644 index 000000000..6cd88feb1 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/14.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/15.png b/website_multi_product_return_management/static/description/assets/screenshots/15.png new file mode 100644 index 000000000..d5a87dc03 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/15.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/2.png b/website_multi_product_return_management/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..f41b85722 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/2.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/3.png b/website_multi_product_return_management/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..f18fa6bd0 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/3.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/4.png b/website_multi_product_return_management/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..951196bcf Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/4.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/5.png b/website_multi_product_return_management/static/description/assets/screenshots/5.png new file mode 100644 index 000000000..41e96e5dc Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/5.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/6.png b/website_multi_product_return_management/static/description/assets/screenshots/6.png new file mode 100644 index 000000000..f2decd24d Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/6.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/7.png b/website_multi_product_return_management/static/description/assets/screenshots/7.png new file mode 100644 index 000000000..fde6e285a Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/7.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/8.png b/website_multi_product_return_management/static/description/assets/screenshots/8.png new file mode 100644 index 000000000..7faae1eff Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/8.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/9.png b/website_multi_product_return_management/static/description/assets/screenshots/9.png new file mode 100644 index 000000000..dc04aae11 Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/9.png differ diff --git a/website_multi_product_return_management/static/description/assets/screenshots/hero.gif b/website_multi_product_return_management/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..bdb78a26e Binary files /dev/null and b/website_multi_product_return_management/static/description/assets/screenshots/hero.gif differ diff --git a/website_multi_product_return_management/static/description/banner.jpg b/website_multi_product_return_management/static/description/banner.jpg new file mode 100644 index 000000000..02416e116 Binary files /dev/null and b/website_multi_product_return_management/static/description/banner.jpg differ diff --git a/website_multi_product_return_management/static/description/icon.png b/website_multi_product_return_management/static/description/icon.png new file mode 100644 index 000000000..5cb9d3219 Binary files /dev/null and b/website_multi_product_return_management/static/description/icon.png differ diff --git a/website_multi_product_return_management/static/description/index.html b/website_multi_product_return_management/static/description/index.html new file mode 100644 index 000000000..097a272a4 --- /dev/null +++ b/website_multi_product_return_management/static/description/index.html @@ -0,0 +1,653 @@ +
+ +
+ +
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+ + +

+ Multi Product Return From Website

+

+ Manage Sale Order return from Website +

+ + +
+ +
+
+ +
+

+ Explore This Module +

+
+ + + +
+
+ +
+

+ Overview +

+
+
+
+ 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. +
+
+ + +
+
+ +
+

+ Features +

+
+
+
+
+ + Create Return Orders From Website +
+
+ + Portal Return Order View +
+
+ + Link Return With Sale Order +
+
+ + Link Return Order With Partner +
+
+ + Return Order print +
+
+
+ + +
+
+ +
+

+ Screenshots +

+
+
+
+
+

+ Return Button on Order Page on Portal.

+ +
+
+

+ Return Product Screen.

+ +
+ +
+

+ Return Orders Portal View.

+ +
+
+

+ Return Orders tree view in Portal.

+ +
+
+

+ Return Orders detailed view in Portal.

+ +
+ +
+

+ RMA Return Orders - Backend

+ +
+
+

+ Return Orders form view in backend.

+ +
+
+

+ Delivery Order Tab and Smart button

+ +
+
+

+ Return Process on DO picking.

+ +
+
+

+ Delivery Order Return Button.

+ +
+
+

+ Delivery Order Return Wizard(Odoo Standard).

+ +
+
+

+ Return Picking Order Tab and Smart button.

+ +
+
+

+ Smart Button on Customer Form.

+ +
+
+

+ Smart Button on Sale Order Form.

+ +
+
+

+ Return Orders - Report Sample.

+ +
+
+
+ + +
+
+ +
+

+ Related + Products +

+
+
+
+ +
+
+ + + +
+
+ +
+

+ Our Services +

+
+ +
+
+
+
+ +
+
+ Odoo Customization +
+
+
+
+ +
+
+ Odoo Implementation +
+
+ +
+
+ +
+
+ Odoo Support +
+
+
+
+ +
+
+ Hire Odoo Developer +
+
+
+
+ +
+
+ Odoo Integration +
+
+
+
+ +
+
+ Odoo Migration +
+
+
+
+ +
+
+ Odoo Consultancy +
+
+
+
+ +
+
+ Odoo Implementation +
+
+
+
+ +
+
+ Odoo Licensing Consultancy +
+
+
+
+ + +
+
+ +
+

+ Our Industries +

+
+
+
+
+
+ +
+ Trading +
+

+ Easily procure and sell your products +

+
+
+
+
+ +
+ POS +
+

+ Easy configuration and convivial experience +

+
+
+
+
+ +
+ Education +
+

+ A platform for educational management +

+
+
+
+
+ +
+ Manufacturing +
+

+ Plan, track and schedule your operations +

+
+
+
+
+ +
+ E-commerce & Website +
+

+ Mobile friendly, awe-inspiring product pages +

+
+
+
+
+ +
+ Service Management +
+

+ Keep track of services and invoice +

+
+
+
+
+ +
+ Restaurant +
+

+ Run your bar or restaurant methodically +

+
+
+
+
+ +
+ Hotel Management +
+

+ An all-inclusive hotel management application +

+
+
+
+
+ + +
+
+ +
+

+ Support +

+
+
+
+
+
+
+ +
+
+

Need Help?

+

Got questions or need help? + Get in touch.

+ +

+ odoo@cybrosys.com +

+
+
+
+
+
+
+
+ +
+
+

WhatsApp

+

Say hi to us on WhatsApp!

+ +

+ +91 86068 27707 +

+
+
+
+
+
+
+
+ +
+
+
+ diff --git a/website_multi_product_return_management/static/src/js/sale_return.js b/website_multi_product_return_management/static/src/js/sale_return.js new file mode 100644 index 000000000..7cb7262d7 --- /dev/null +++ b/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(); + } + }); +}); diff --git a/website_multi_product_return_management/views/res_partner_views.xml b/website_multi_product_return_management/views/res_partner_views.xml new file mode 100644 index 000000000..c1544c941 --- /dev/null +++ b/website_multi_product_return_management/views/res_partner_views.xml @@ -0,0 +1,19 @@ + + + + + res.partner.view.form.inherit.website.multi.product.return.management + res.partner + + + + + + + + + diff --git a/website_multi_product_return_management/views/sale_order_views.xml b/website_multi_product_return_management/views/sale_order_views.xml new file mode 100644 index 000000000..03216da5b --- /dev/null +++ b/website_multi_product_return_management/views/sale_order_views.xml @@ -0,0 +1,18 @@ + + + + + sale.order.view.form.inherit.website.multi.product.return.management + sale.order + + + + + + + + diff --git a/website_multi_product_return_management/views/sale_return_views.xml b/website_multi_product_return_management/views/sale_return_views.xml new file mode 100644 index 000000000..c290e0e47 --- /dev/null +++ b/website_multi_product_return_management/views/sale_return_views.xml @@ -0,0 +1,123 @@ + + + + + sale.return.view.form + sale.return + 100 + +
+
+
+ +
+ + +
+
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + sale.return.view.tree + sale.return + + + + + + + + + + + + + + sale.return.view.search + sale.return + + + + + + + + + + + + + + + + + + Sale Return + sale.return + tree,form + + +

Create The First Return +

+
+
+ + +
diff --git a/website_multi_product_return_management/views/stock_picking_views.xml b/website_multi_product_return_management/views/stock_picking_views.xml new file mode 100644 index 000000000..163ce6395 --- /dev/null +++ b/website_multi_product_return_management/views/stock_picking_views.xml @@ -0,0 +1,16 @@ + + + + + stock.picking.view.form.inherit.website.multi.product.return.management + stock.picking + + + + + + + + + + diff --git a/website_multi_product_return_management/views/website_portal_templates.xml b/website_multi_product_return_management/views/website_portal_templates.xml new file mode 100644 index 000000000..39a78e2ae --- /dev/null +++ b/website_multi_product_return_management/views/website_portal_templates.xml @@ -0,0 +1,343 @@ + + + +