Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
72b263b
[IMP] rename module sale_order_min_qty to sale_restricted_qty
mourad-ehm Jun 18, 2020
57946ff
[FIX] Update Readme & "use_parent" value to manual_force_sale_min_qty…
mourad-ehm Jun 18, 2020
efe622b
[IMP] views & fix is_qty_less_min_qty & is_qty_bigger_max_qty
mourad-ehm Jun 19, 2020
e033dcd
[IMP] add _get_sale_restricted_qty on sale to make qty overridable by…
mourad-ehm Jun 19, 2020
7167b4d
[FIX] _compute_sale_restricted_qty
mourad-ehm Jun 23, 2020
35973aa
[FIX] restricted_qty UserError Message
mourad-ehm Jun 26, 2020
b0a29f4
[FIX] openupgradelib requirements.txt
mourad-ehm Jun 29, 2020
52e2278
[REF] refactor code to make it simplier and inheritable
sebastienbeau Sep 29, 2020
b435310
[FIX] _compute_is_qty_less bigger multiple qty
mourad-ehm Dec 3, 2020
7a8f6fd
Added translation using Weblate (Italian)
SicurSam Oct 4, 2021
ecca980
[14.0][MIG] sale_restricted_qty: Migration to 14.0
AshishHirapara Mar 25, 2022
9583a8c
Translated using Weblate (Italian)
francesco-ooops Apr 8, 2022
ce43831
[IMP] sale_restricted_qty: show sale_min sale_max optionally
ilyasProgrammer Oct 27, 2022
53afb2a
[IMP] sale_restricted_qty: Change dp.get_precision digits
victoralmau Dec 1, 2022
028f873
Translated using Weblate (Italian)
francesco-ooops Jan 3, 2023
fa9f65a
Added translation using Weblate (French)
Jun 11, 2023
e0200fd
Translated using Weblate (Italian)
mymage Apr 19, 2023
29dddd2
[MIG] sale_restricted_qty: Migration to 16.0
SirAionTech Oct 3, 2023
57b296f
[UPD] Update sale_restricted_qty.pot
May 18, 2024
99639d2
Update translation files
weblate May 19, 2024
5efc3d4
Translated using Weblate (Italian)
mymage May 22, 2024
384aa38
[MIG] sale_restricted_qty: pre-commit auto fixes
therbin200 Feb 13, 2026
7d5e345
[MIG] sale_restricted_qty: Migration to 19.0
therbin200 Feb 13, 2026
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
151 changes: 151 additions & 0 deletions sale_restricted_qty/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

=====================================================
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/license-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/19.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-19-0/sale-workflow-19-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=19.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:%2019.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>

- `Apik <https://apik.cloud/>`__

- Thomas HERBIN <the@apik.cloud>

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/19.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": "19.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