diff --git a/sales_stock_reservation/README.rst b/sales_stock_reservation/README.rst new file mode 100755 index 000000000..218513606 --- /dev/null +++ b/sales_stock_reservation/README.rst @@ -0,0 +1,45 @@ +.. 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 + +Product Stock Reservation +========================== +Allow sales users to create a product stock reservation from the sales quotation form. + +Configuration +============= +* No additional configurations needed + +License +------- +GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) +(https://www.gnu.org/licenses/agpl.html) + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +* Developer: (V15) Akhil Ashok, 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/sales_stock_reservation/__init__.py b/sales_stock_reservation/__init__.py new file mode 100644 index 000000000..98f9cfb7e --- /dev/null +++ b/sales_stock_reservation/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Akhil Ashok @cybrosys(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 wizard diff --git a/sales_stock_reservation/__manifest__.py b/sales_stock_reservation/__manifest__.py new file mode 100644 index 000000000..aa4c8e23c --- /dev/null +++ b/sales_stock_reservation/__manifest__.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Akhil Ashok @cybrosys(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': 'Product Stock Reservation', + 'version': "15.0.1.0.0", + 'category': 'Sales,Warehouse', + 'summary': """ Reserve Product for Sales Order.""", + 'description': """This module allow sales users to create a product stock + reservation from the sales quotation form.""", + 'author': "Cybrosys Techno Solutions", + 'company': "Cybrosys Techno Solutions", + 'maintainer': "Cybrosys Techno Solutions", + 'website': "https://www.cybrosys.com", + 'depends': ['sale_management', 'stock', 'mail'], + 'data': [ + 'security/ir.model.access.csv', + 'views/sale_order_views.xml', + 'views/res_config_settings_views.xml', + 'wizard/sale_stock_reservation_views.xml', + 'data/stock_location_data.xml', + 'data/ir_sequence_data.xml', + ], + 'images': ['static/description/banner.png'], + 'license': "AGPL-3", + 'installable': True, + 'auto_install': False, + 'application': False +} diff --git a/sales_stock_reservation/data/ir_sequence_data.xml b/sales_stock_reservation/data/ir_sequence_data.xml new file mode 100644 index 000000000..cb87a534d --- /dev/null +++ b/sales_stock_reservation/data/ir_sequence_data.xml @@ -0,0 +1,13 @@ + + + + + + Sock Reserved Sequence + stock.reserved + STOCK/RES/ + 3 + + + + diff --git a/sales_stock_reservation/data/stock_location_data.xml b/sales_stock_reservation/data/stock_location_data.xml new file mode 100644 index 000000000..4677c6229 --- /dev/null +++ b/sales_stock_reservation/data/stock_location_data.xml @@ -0,0 +1,10 @@ + + + + + + Stock Reservation Location + + + + diff --git a/sales_stock_reservation/doc/RELEASE_NOTES.md b/sales_stock_reservation/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..a31bfcf5b --- /dev/null +++ b/sales_stock_reservation/doc/RELEASE_NOTES.md @@ -0,0 +1,7 @@ +## Module + +#### 27.12.2023 +#### Version 15.0.1.0.0 +##### ADD + +- Initial commit for Product Stock Reservation diff --git a/sales_stock_reservation/models/__init__.py b/sales_stock_reservation/models/__init__.py new file mode 100644 index 000000000..e2ab06022 --- /dev/null +++ b/sales_stock_reservation/models/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Akhil Ashok @cybrosys(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_order +from . import stock_reserved +from . import res_config_settings diff --git a/sales_stock_reservation/models/res_config_settings.py b/sales_stock_reservation/models/res_config_settings.py new file mode 100644 index 000000000..6598045b9 --- /dev/null +++ b/sales_stock_reservation/models/res_config_settings.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Akhil Ashok @cybrosys(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 ResConfigSettings(models.TransientModel): + """ + Inherits the Res Config Settings model to add two many-to-one fields for + selecting source and destination locations. These fields are used to + configure the source and destination locations for stock reservations. + """ + _inherit = 'res.config.settings' + + source_location_id = fields.Many2one("stock.location", + String="Source Location", + config_parameter= + 'sales_stock_reservation.source_location_id', + help= + 'This is a Many2one field that refers ' + 'to the location from' + 'which the products will be sourced.') + destination_location_id = fields.Many2one("stock.location", + String="Destination Location", + config_parameter= + 'sales_stock_reservation.destination_location_id', + help= + 'This is a Many2one field that ' + 'refers to the location to which ' + 'the products will be delivered.') diff --git a/sales_stock_reservation/models/sale_order.py b/sales_stock_reservation/models/sale_order.py new file mode 100644 index 000000000..a021e27e4 --- /dev/null +++ b/sales_stock_reservation/models/sale_order.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Akhil Ashok @cybrosys(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): + """ + Inherits the Sale Order model to add the ability to apply stock + reservation for products in draft state. This model also adds a state for + tracking the reservation status and a one-to-many relationship to the + Stock Reserved model for storing the details of the reserved stock. + """ + _inherit = "sale.order" + + apply_stock_reservation = fields.Boolean(string="Apply stock reservation", + help="Apply stock reservation in " + "draft") + state_reservation = fields.Selection([ + ('reserved', 'Reserved'), ('cancel', 'Cancelled')], + help="Condition for visibility of buttons") + reserved_stock_ids = fields.One2many("stock.reserved", "sale_order_id", + string="Reserved Stock", + help="Stock reserved details") + + def action_create_stock_reservation(self): + """ + This function creates a stock reservation based on the current sale + order's order lines. + If the sale order has order lines, the function creates a list of + tuples representing the order lines,which are used to set default + values for the stock reservation. Each tuple contains three elements: + (0, 0, {...}), where the dictionary contains values for the following + fields of the stock reservation: + + - order_line_name: a string representing the name of the sale order + and the order line, concatenated + - product_id: the ID of the product being reserved + - quantity: the quantity being reserved, in the unit of measure + specified by the order line + - unit_of_measure_id: the ID of the unit of measure being used for the + reservation + - reserve_quantity: the quantity being reserved, in the unit of + measure specified by the product + + If the sale order does not have any order lines, an empty list + created. + + The function then returns a dictionary representing an action to + create a new stock reservation. + The dictionary has the following keys: + + - name: a string representing the name of the action + - type: a string representing the type of the action (in this case, + 'ir.actions.act_window') + - view_type: a string representing the type of view to use + (in this case, 'form') + - view_mode: a string representing the mode of the view + (in this case, 'form') + - res_model: a string representing the name of the model being used + (in this case,'sale.stock.reservation') + - context: a dictionary representing the context to use when creating + the stock reservation + - default_sale_order_id: the ID of the sale order being used as the + basis for the reservation + - default_stock_reservation_ids: the list of tuples representing the + order lines (or an empty list) + - view_id: the ID of the view to use (retrieved using self.env.ref()) + - target: a string representing the target for the action + (in this case, 'new') + + :return: a dictionary representing the action to create a new stock + reservation + """ + line_vals = [(0, 0, { + 'order_line_name': f"{self.name}-{line.name}", + 'product_id': line.product_id.id, + 'quantity': line.product_uom_qty, + 'unit_of_measure_id': line.product_uom.id, + 'reserve_quantity': line.product_uom_qty + }) for line in self.order_line] if self.order_line else [] + return { + 'name': "Stock Reservation", + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'sale.stock.reservation', + 'context': {'default_sale_order_id': self.id, + 'default_stock_reservation_ids': line_vals}, + 'view_id': self.env.ref( + 'sales_stock_reservation.sale_stock_reservation_view_form').id, + 'target': 'new', + } + + def action_cancel_reservation(self): + """ + This function cancels a stock reservation by setting its state to + 'cancel', cancelling the moves associated with the reservation's + reserved stock,and setting the status of the reserved stock to + 'cancelled'. + + The function first sets the `state_reservation` field of the current + object to 'cancel'. + + It then retrieves the `move_id` field of each reserved stock associated + with the reservation using `mapped()`,and calls the `_action_cancel()` + method on the resulting recordset to cancel the moves. + + After cancelling the moves, the function sets the `status` field of each + reserved stock associated with the reservation to 'cancelled' using + `mapped()`. + + Finally, the function returns True to indicate that the cancellation + was successful. + + :return: True if the reservation was successfully cancelled, False + otherwise + """ + self.state_reservation = 'cancel' + self.reserved_stock_ids.mapped('move_id')._action_cancel() + self.mapped("reserved_stock_ids").status = 'cancelled' + return True + + def action_confirm(self): + """ + This function confirms a sale order by calling the parent + `action_confirm()` method and then cancelling any associated stock + reservation. + The function first calls the `super()` method to confirm the sale order + using the parent implementation. + It then calls the `cancel_reservation()` method to cancel any existing + stock reservation associated with the sale order. + Finally, the function returns the result of the `super()` method call to + indicate whether the sale order was successfully confirmed. + + :return: the result of the parent `action_confirm()` method call + """ + res = super().action_confirm() + self.action_cancel_reservation() + return res diff --git a/sales_stock_reservation/models/stock_reserved.py b/sales_stock_reservation/models/stock_reserved.py new file mode 100644 index 000000000..51c96ee64 --- /dev/null +++ b/sales_stock_reservation/models/stock_reserved.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Akhil Ashok @cybrosys(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 StockReserved(models.Model): + """ + This model stores details of product reservations made in sale orders. + """ + _name = "stock.reserved" + _description = "Reserved stock details" + + name = fields.Char(string="Name", readonly="True", help="Name") + order_line_name = fields.Char(string="Order Line", readonly="True", + help="Name of order line") + product_id = fields.Many2one("product.product", string="Product", + readonly="True", help="Product reserved") + status = fields.Selection( + [('reserved', 'Reserved'), ('cancelled', 'Cancelled')], + string="Status", readonly="True", help="Status of reservation") + reserved_quantity = fields.Float(string="Reserved Quantity", + readonly="True", + help="Quantity Reserved") + sale_order_id = fields.Many2one("sale.order", string="Sale Order", + readonly="True", + help="Sale order") + move_id = fields.Many2one("stock.move", string="Move Id", readonly="True", + help="Stock move details") + + @api.model + def create(self, vals_list): + """ + Create a new record for the model and generate a sequence for the name + field if it is not provided. + :return: the result of the parent `create()` method call + """ + if vals_list.get('name', _('New')) == _('New'): + vals_list['name'] = self.env['ir.sequence'].next_by_code( + 'stock.reserved' + ) or _('New') + res = super().create(vals_list) + return res diff --git a/sales_stock_reservation/security/ir.model.access.csv b/sales_stock_reservation/security/ir.model.access.csv new file mode 100644 index 000000000..05a65efff --- /dev/null +++ b/sales_stock_reservation/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_reservation_sale_user,access.stock.reservation.sale.user,model_sale_stock_reservation,base.group_user,1,1,1,1 +access_stock_reservation_user,access.stock.reservation.user,model_stock_reservation,base.group_user,1,1,1,1 +access_stock_reserved_user,access.stock.reserved.user,model_stock_reserved,base.group_user,1,1,1,1 diff --git a/sales_stock_reservation/static/description/assets/icons/check.png b/sales_stock_reservation/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/check.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/chevron.png b/sales_stock_reservation/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/chevron.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/cogs.png b/sales_stock_reservation/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/cogs.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/consultation.png b/sales_stock_reservation/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/consultation.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/ecom-black.png b/sales_stock_reservation/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/ecom-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/education-black.png b/sales_stock_reservation/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/education-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/hotel-black.png b/sales_stock_reservation/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/hotel-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/license.png b/sales_stock_reservation/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/license.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/lifebuoy.png b/sales_stock_reservation/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/lifebuoy.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/logo.png b/sales_stock_reservation/static/description/assets/icons/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/logo.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/manufacturing-black.png b/sales_stock_reservation/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/manufacturing-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/pos-black.png b/sales_stock_reservation/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/pos-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/puzzle.png b/sales_stock_reservation/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/puzzle.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/restaurant-black.png b/sales_stock_reservation/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/restaurant-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/service-black.png b/sales_stock_reservation/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/service-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/trading-black.png b/sales_stock_reservation/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/trading-black.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/training.png b/sales_stock_reservation/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/training.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/update.png b/sales_stock_reservation/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/update.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/user.png b/sales_stock_reservation/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/user.png differ diff --git a/sales_stock_reservation/static/description/assets/icons/wrench.png b/sales_stock_reservation/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/sales_stock_reservation/static/description/assets/icons/wrench.png differ diff --git a/sales_stock_reservation/static/description/assets/modules/budget_image.png b/sales_stock_reservation/static/description/assets/modules/budget_image.png new file mode 100644 index 000000000..b50130c7d Binary files /dev/null and b/sales_stock_reservation/static/description/assets/modules/budget_image.png differ diff --git a/sales_stock_reservation/static/description/assets/modules/credit_image.png b/sales_stock_reservation/static/description/assets/modules/credit_image.png new file mode 100644 index 000000000..3ad04ecfd Binary files /dev/null and b/sales_stock_reservation/static/description/assets/modules/credit_image.png differ diff --git a/sales_stock_reservation/static/description/assets/modules/employee_image.png b/sales_stock_reservation/static/description/assets/modules/employee_image.png new file mode 100644 index 000000000..30ad58232 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/modules/employee_image.png differ diff --git a/sales_stock_reservation/static/description/assets/modules/export_image.png b/sales_stock_reservation/static/description/assets/modules/export_image.png new file mode 100644 index 000000000..492980ad0 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/modules/export_image.png differ diff --git a/sales_stock_reservation/static/description/assets/modules/gantt_image.png b/sales_stock_reservation/static/description/assets/modules/gantt_image.png new file mode 100644 index 000000000..1ae7cfe3b Binary files /dev/null and b/sales_stock_reservation/static/description/assets/modules/gantt_image.png differ diff --git a/sales_stock_reservation/static/description/assets/modules/quotation_image.png b/sales_stock_reservation/static/description/assets/modules/quotation_image.png new file mode 100644 index 000000000..499b1a72f Binary files /dev/null and b/sales_stock_reservation/static/description/assets/modules/quotation_image.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/hero.gif b/sales_stock_reservation/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..27330f4b0 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/hero.gif differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr1.png b/sales_stock_reservation/static/description/assets/screenshots/sr1.png new file mode 100644 index 000000000..bba34ebfc Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr1.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr10.png b/sales_stock_reservation/static/description/assets/screenshots/sr10.png new file mode 100644 index 000000000..a5ee3ad81 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr10.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr2.png b/sales_stock_reservation/static/description/assets/screenshots/sr2.png new file mode 100644 index 000000000..52ca075c8 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr2.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr3.png b/sales_stock_reservation/static/description/assets/screenshots/sr3.png new file mode 100644 index 000000000..8d8c285bf Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr3.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr4.png b/sales_stock_reservation/static/description/assets/screenshots/sr4.png new file mode 100644 index 000000000..30d9a57f6 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr4.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr5.png b/sales_stock_reservation/static/description/assets/screenshots/sr5.png new file mode 100644 index 000000000..91002646f Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr5.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr6.png b/sales_stock_reservation/static/description/assets/screenshots/sr6.png new file mode 100644 index 000000000..2e5df5864 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr6.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr7.png b/sales_stock_reservation/static/description/assets/screenshots/sr7.png new file mode 100644 index 000000000..00f95ae12 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr7.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr8.png b/sales_stock_reservation/static/description/assets/screenshots/sr8.png new file mode 100644 index 000000000..61ae5a395 Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr8.png differ diff --git a/sales_stock_reservation/static/description/assets/screenshots/sr9.png b/sales_stock_reservation/static/description/assets/screenshots/sr9.png new file mode 100644 index 000000000..a8e310eff Binary files /dev/null and b/sales_stock_reservation/static/description/assets/screenshots/sr9.png differ diff --git a/sales_stock_reservation/static/description/banner.png b/sales_stock_reservation/static/description/banner.png new file mode 100644 index 000000000..300f13c22 Binary files /dev/null and b/sales_stock_reservation/static/description/banner.png differ diff --git a/sales_stock_reservation/static/description/icon.png b/sales_stock_reservation/static/description/icon.png new file mode 100644 index 000000000..85503ac7b Binary files /dev/null and b/sales_stock_reservation/static/description/icon.png differ diff --git a/sales_stock_reservation/static/description/index.html b/sales_stock_reservation/static/description/index.html new file mode 100644 index 000000000..8b2a14a12 --- /dev/null +++ b/sales_stock_reservation/static/description/index.html @@ -0,0 +1,659 @@ +
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+
+
+
+
+
+

+ Product Stock Reservation

+

+ This module helps users to create a product stock reservation from the sales quotation form. +

+ +
+
+ +
+
+

+ Overview +

+
+
+

+ In the Stock Reservation App, Allow sales users to create a product stock reservation from the sales quotation form. + Allow sales users to unreserve stock also once the customer confirms the order. + Email notification to stock users during reservation from sales quote state. +

+
+
+
+
+

+ Features +

+
+
+
+ +
+
+

+ Allow sales users to create a product stock reservation from the sales quotation form.

+
+
+
+
+ +
+
+

+ Allow sales users to cancel reservation stock.

+
+
+
+
+ +
+
+

+ Email notification to stock users during reservation from sales quotation state.

+
+
+
+
+ +
+
+

+ Allow users to choose how much quantity of product from quotation they want to reserve on wizard.

+
+
+
+
+
+

+ Screenshots +

+
+
+

+ Configuration

+

+ Under "Inventory" > "Configurations" > "Settings" user have to select source location and destination location to reserve stock. +

+ +
+
+

+ Product Quantity Before Reserve Stock

+

+ User can see product on hand quantity before reserve stock. +

+ +
+
+

+ Reserve Stock

+

+ User can reserve stock by clicking on "Reserve Stock" button on sale order which is visible only if "Apply Stock Reservation" is checked. +

+ +
+
+

+ Stock Reservation Wizard

+

+ + New wizard will open on clicking of "Reserve Stock" button, + here user can see default sale order line details and select "Notify User" to get email and enter "Reserve" to reserve stock. +

+ +
+
+

+ Reserved Stock

+

+ User can view created reserved stock from "Reserved Stock" page in sale order. +

+ +
+
+

+ Product Quantity After Reserved Stock +

+

+ You can view updated product quantities after reservation from sales orders. +

+ +
+
+

+ Email Notification to Users +

+

+ Email notification to stock users selected on the wizard. +

+ +
+ +
+

+ Cancel Stock Reservation Button Flow +

+

+ Cancel Stock Reservation Button: When click to Cancel Stock Reservation Button will release a product that is already reserved at the time of quotation. +

+ + +
+ +
+

+ Product Forecasted Quantity after Release +

+

+ Quantities are released in stock after the release reservation. +

+ +
+ +
+
+

Suggested 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

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

Need Help?

+
+
+
+ + +
+ +
+ +
+ +
+ WhatsApp +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ + +
+
diff --git a/sales_stock_reservation/views/res_config_settings_views.xml b/sales_stock_reservation/views/res_config_settings_views.xml new file mode 100644 index 000000000..cf4fd7aca --- /dev/null +++ b/sales_stock_reservation/views/res_config_settings_views.xml @@ -0,0 +1,57 @@ + + + + + + res.config.settings.view.form.inherit.sales.stock.reservation + + res.config.settings + + + + +

Stock Reserve Location

+
+
+
+
+
+
+
+
+
+
+
+
+ + + + diff --git a/sales_stock_reservation/views/sale_order_views.xml b/sales_stock_reservation/views/sale_order_views.xml new file mode 100644 index 000000000..0c43a4416 --- /dev/null +++ b/sales_stock_reservation/views/sale_order_views.xml @@ -0,0 +1,43 @@ + + + + + sale.order.view.form.inherit.sales.stock.reservation + sale.order + + + + + + + +