Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
66bd812
[IMP] rename module sale_order_min_qty to sale_restricted_qty
mourad-ehm Jun 18, 2020
4e89333
[FIX] Update Readme & "use_parent" value to manual_force_sale_min_qty…
mourad-ehm Jun 18, 2020
e256c3d
[IMP] views & fix is_qty_less_min_qty & is_qty_bigger_max_qty
mourad-ehm Jun 19, 2020
165840f
[IMP] add _get_sale_restricted_qty on sale to make qty overridable by…
mourad-ehm Jun 19, 2020
32bf0f9
[FIX] _compute_sale_restricted_qty
mourad-ehm Jun 23, 2020
4f098fb
[FIX] restricted_qty UserError Message
mourad-ehm Jun 26, 2020
a36caea
[FIX] openupgradelib requirements.txt
mourad-ehm Jun 29, 2020
fa7396f
[REF] refactor code to make it simplier and inheritable
sebastienbeau Sep 29, 2020
d298b47
[FIX] _compute_is_qty_less bigger multiple qty
mourad-ehm Dec 3, 2020
9612d09
Added translation using Weblate (Italian)
SicurSam Oct 4, 2021
357fe6e
[14.0][MIG] sale_restricted_qty: Migration to 14.0
AshishHirapara Mar 25, 2022
eaf0b30
Translated using Weblate (Italian)
francesco-ooops Apr 8, 2022
8195430
[IMP] sale_restricted_qty: show sale_min sale_max optionally
ilyasProgrammer Oct 27, 2022
ca5dd84
[IMP] sale_restricted_qty: Change dp.get_precision digits
victoralmau Dec 1, 2022
e04e53e
Translated using Weblate (Italian)
francesco-ooops Jan 3, 2023
fcb45d1
Added translation using Weblate (French)
Jun 11, 2023
10a7362
[MIG] sale_restricted_qty: Migration to 16.0
SirAionTech Oct 3, 2023
25bc08d
[UPD] Update sale_restricted_qty.pot
May 18, 2024
d2adf5b
Update translation files
weblate May 19, 2024
7cbc948
Translated using Weblate (Italian)
mymage May 22, 2024
5bd8f10
[IMP] sale_restricted_qty: pre-commit auto fixes
samirGuesmi Mar 3, 2025
a4b4673
[MIG] sale_restricted_qty: Migration to 18.0
samirGuesmi Mar 3, 2025
c5e7fe0
[IMP] sale_restricted_qty: Apply improvements from 17.0 branch to 18.0
bosd Oct 21, 2025
14a924b
[REF] sale_restricted_qty: Merge duplicated model inheritance
bosd Oct 21, 2025
cf4b9e0
[ADD] sale_restricted_qty: Auto-populate quantity with minimum when e…
bosd Oct 21, 2025
0222f0c
[FIX] sale_restricted_qty: Fix auto-populate tests and improve implem…
bosd Oct 22, 2025
5306563
[IMP] sale_restricted_qty: usability and doc improvements
Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions sale_restricted_qty/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
=====================================================
Sale order restricted quantity: min, max, multiple-of
=====================================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1c96b9ab4a5f52f04233a4d0d47e6c5b19d7871794cec15c15d9a8821109c2dc
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/sale-workflow/tree/18.0/sale_restricted_qty
:alt: OCA/sale-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/sale-workflow-18-0/sale-workflow-18-0-sale_restricted_qty
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=18.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows to set mininal, maximal, and multiple-of quantity
constraints on product categories and products, and to check and
optionally enforce these constraints on sale orders (either as strict
blocking or soft warnings).

**Table of contents**

.. contents::
:local:

Usage
=====

To set quantity constraints on a product: navigate to **Sales > Products
> Products**, open the product, and on the **Sales** tab in the **Qty
Constraints** section set corresponding values in the *Min Qty*, *Max
Qty*, or *Multiple-Of Qty* fields.

**Constraint Types:**

- **Min Qty**: Minimum quantity required for a sale.
- **Max Qty**: Maximum quantity allowed for a sale.
- **Multiple-Of Qty**: Quantity must be a multiple of this value.

**Enforcement Levels (Restrict):** For each constraint, you can choose
the enforcement level:

- **Blocking**: Strictly enforces the rule. The user cannot confirm the
line with an invalid quantity.
- **Warning**: Displays a warning (yellow/orange indication) but allows
the user to proceed.

- *Use Case*: Use **Warning** when you want to allow flexibility, such
as selling **samples** (below min qty) or clearing out **leftover
stock** (remainder not matching multiple-of qty).

**Auto-Suggest:** When you select a product in a Sales Order line, if a
Minimum Quantity is strictly enforced (**Blocking**) and the current
quantity is not set (or is 0/1), the system will automatically populate
the quantity with the Minimum Quantity.

To set quantity constraints on a product variant: navigate to **Sales >
Products > Product Variants**, open the product variant, and on the
**Sales** tab in the **Qty Constraints** section set corresponding
values.

To set quantity constraints on a product category: navigate to **Sales >
Configuration > Product Categories**, open the product category, and in
the **Sales Qty Constraints** section set corresponding values.

The settings are inherited from the product category to the product, and
from the product to the product variant. To override the inherited
settings, check the checkbox next to the corresponding value and set the
value in the product or product variant.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/sale-workflow/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_restricted_qty%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Akretion

Contributors
------------

- Mourad EL HADJ MIMOUN <mourad.elhadj.mimoune@akretion.com>
- `Ooops <https://www.ooops404.com/>`__:

- Ashish Hirpara <https://ashish-hirpara.com>

- `Aion Tech <https://aiontech.company/>`__:

- Simone Rubino <simone.rubino@aion-tech.it>

- `CorporateHub <https://corporatehub.eu/>`__

- Alexey Pelykh <alexey.pelykh@corphub.eu>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

.. |maintainer-ashishhirapara| image:: https://github.com/ashishhirapara.png?size=40px
:target: https://github.com/ashishhirapara
:alt: ashishhirapara

Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-ashishhirapara|

This module is part of the `OCA/sale-workflow <https://github.com/OCA/sale-workflow/tree/18.0/sale_restricted_qty>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions sale_restricted_qty/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
22 changes: 22 additions & 0 deletions sale_restricted_qty/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2019 Akretion (<http://www.akretion.com>)
# Copyright 2023 Simone Rubino - Aion Tech
# Copyright 2024 CorporateHub
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Sale order restricted quantity: min, max, multiple-of",
"version": "18.0.1.0.0",
"category": "Sales Management",
"author": "Akretion, Odoo Community Association (OCA)",
"contributors": ["Ashish Hirpara"],
"maintainers": ["ashishhirapara"],
"website": "https://github.com/OCA/sale-workflow",
"license": "AGPL-3",
"depends": ["sale_management"],
"data": [
"views/product_category_views.xml",
"views/product_template_views.xml",
"views/sale_order_views.xml",
],
"installable": True,
}
134 changes: 134 additions & 0 deletions sale_restricted_qty/i18n/de.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_restricted_qty
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-03 12:00+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. module: sale_restricted_qty
msgid "%(order_name)s - Product \"%(product_name)s\": %(failed_constraints)s"
msgstr "%(order_name)s - Produkt \"%(product_name)s\": %(failed_constraints)s"

#. module: sale_restricted_qty
msgid "Blocking"
msgstr "Sperrend"

#. module: sale_restricted_qty
msgid "Check quantity for these products:\n"
msgstr "Prüfen Sie die Menge für diese Produkte:\n"

#. module: sale_restricted_qty
msgid ""
"Decide if the maximum quantity constraint is strictly enforced (Blocking) or if it only triggers a warning (Warning).\n"
"Use 'Warning' if you want to allow large orders that exceed strict policies under special conditions."
msgstr ""

#. module: sale_restricted_qty
msgid ""
"Decide if the minimum quantity constraint is strictly enforced (Blocking) or if it only triggers a warning (Warning).\n"
"Use 'Warning' if you want to allow exceptions like selling samples or leftover stock."
msgstr ""

#. module: sale_restricted_qty
msgid ""
"Decide if the multiple-of quantity constraint is strictly enforced (Blocking) or if it only triggers a warning (Warning).\n"
"Use 'Warning' to allow selling non-standard quantities for special cases like clearing leftover stock."
msgstr ""

#. module: sale_restricted_qty
msgid "Max Qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Max Quantity Exceeded"
msgstr ""

#. module: sale_restricted_qty
msgid "Max Quantity Recommended"
msgstr ""

#. module: sale_restricted_qty
msgid "Min Qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Min Quantity Recommended"
msgstr ""

#. module: sale_restricted_qty
msgid "Min Quantity Required"
msgstr ""

#. module: sale_restricted_qty
msgid "Multiple Quantity Required"
msgstr ""

#. module: sale_restricted_qty
msgid "Multiple-Of Qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Restrict"
msgstr ""

#. module: sale_restricted_qty
msgid "Sale Max qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Sale Miltiple qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Sale Min qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Sale Restricted Qty"
msgstr ""

#. module: sale_restricted_qty
msgid "Sale restricted qty"
msgstr ""

#. module: sale_restricted_qty
msgid "The maximum quantity of product that can be sold."
msgstr ""

#. module: sale_restricted_qty
msgid "The minimum quantity of product that can be sold."
msgstr ""

#. module: sale_restricted_qty
msgid "The multiple-of quantity of product that can be sold."
msgstr ""

#. module: sale_restricted_qty
msgid "Value"
msgstr ""

#. module: sale_restricted_qty
msgid "Warning"
msgstr "Warnung"

#. module: sale_restricted_qty
msgid "maximal quantity is %(max_qty)s"
msgstr "Höchstmenge ist %(max_qty)s"

#. module: sale_restricted_qty
msgid "minimal quantity is %(min_qty)s"
msgstr "Mindestmenge ist %(min_qty)s"

#. module: sale_restricted_qty
msgid "quantity should be multiple of %(multiple_of_qty)s"
msgstr "Menge sollte ein Vielfaches von %(multiple_of_qty)s sein"
Loading
Loading