first commit

This commit is contained in:
Suherdy Yacob 2026-01-12 16:43:00 +07:00
commit 727e0ad6af
43 changed files with 2504 additions and 0 deletions

180
README.rst Executable file
View File

@ -0,0 +1,180 @@
=======================
Stock Disallow Negative
=======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:13f62e491b453ad71831420b6e1b7d6c30a989c98c56dee76cb674305cc80263
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fstock--logistics--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_no_negative
:alt: OCA/stock-logistics-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-workflow-18-0/stock-logistics-workflow-18-0-stock_no_negative
: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/stock-logistics-workflow&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
By default, Odoo allows negative stock. The advantage of negative stock
is that, if some stock levels are wrong in the ERP, you will not be
blocked when validating the picking for a customer... so you will still
be able to ship the products on time (it's an example !). The problem is
that, after you forced the stock level to negative, you are supposed to
fix the stock level later via an inventory ; but this action is often
forgotten by users, so you end up with negative stock levels in your ERP
and it can stay like this forever (or at least until the next full
inventory).
If you disallow negative stock in Odoo with this module, you will be
blocked when trying to validate a stock operation that will set the
stock level of a product and/or location as negative. So you will have
to fix the wrong stock level of that product without delay, in order to
validate the stock operation in Odoo...you can't forget it anymore !
**Table of contents**
.. contents::
:local:
Configuration
=============
By default, the stockable products will not be allowed to have a
negative stock. If you want to make some exceptions for some products,
product categories or locations, you can activate the option *Allow
Negative Stock*:
For products:
1. Go to *Inventory / Master Data / Products* and in the tab *General
Information* activate this option.
For product categories:
1. Go to *Inventory / Configuration / Products / Product Categories* and
activate this option.
For individual locations:
1. Go to *Inventory / Configuration / Settings* and activate the option
*Storage Locations*.
2. Go to *Inventory / Configuration / Warehouse Management / Locations*
and activate the option the option *Allow Negative Stock* for the
locations you choose.
Usage
=====
When you validate a stock operation (a stock move, a picking, a
manufacturing order, etc.) that will set the stock level of a stockable
product as negative, you will be blocked by an error message. The
consumable products can still have a negative stock level.
Changelog
=========
16.0.1.0.0 (2022-10-22)
-----------------------
- [16.0][MIG] stock_no_negative
15.0.1.0.0 (2021-12-22)
-----------------------
- [15.0][MIG] stock_no_negative
14.0.1.0.0 (2020-12-14)
-----------------------
- [14.0][MIG] stock_no_negative
13.0.1.0.0 (2020-01-03)
-----------------------
- [13.0][MIG] stock_no_negative Remove all decorators @api.multi
11.0.1.1.0 (2018-12-13)
-----------------------
- Add the ability to allow negative stock for individual stock
locations.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-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/stock-logistics-workflow/issues/new?body=module:%20stock_no_negative%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
------------
- Alexis de Lattre <alexis.delattre@akretion.com>
- Vishnu Vanneri <vanneri.odoodev@gmail.com>
- Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
- `ForgeFlow S.L. <contact@forgeflow.com>`__:
- Jordi Ballester
- Joan Mateu
- `Tecnativa <https://www.tecnativa.com>`__:
- Pedro M. Baeza
- `Spacefoot <https://www.spacefoot.com>`__:
- Quentin Delcourte
- Vishnu Vanneri <vvanneri@ioppolo.com.au>
- `OERP Canada <https://www.oerp.ca/>`__:
- Foram Darji <fd@oerp.ca>
- `Dynapps <https://www.dynapps.eu/>`__:
- Bert Van Groenendael <bert.vangroenendael@dynapps.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.
This module is part of the `OCA/stock-logistics-workflow <https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_no_negative>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

5
__init__.py Executable file
View File

@ -0,0 +1,5 @@
# ?? 2015-2016 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import models

17
__manifest__.py Executable file
View File

@ -0,0 +1,17 @@
# ?? 2015-2016 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Stock Disallow Negative",
"version": "18.0.1.0.3",
"category": "Inventory, Logistic, Storage",
"license": "AGPL-3",
"summary": "Disallow negative stock levels by default",
"author": "Akretion,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-workflow",
"depends": ["stock"],
"data": ["views/product_product_views.xml", "views/stock_location_views.xml"],
"installable": True,
}

Binary file not shown.

Binary file not shown.

101
i18n/ar.po Executable file
View File

@ -0,0 +1,101 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:44+0000\n"
"PO-Revision-Date: 2023-11-21 14:44+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Permitir Stock Negativo"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Permitir niveles de stock negativos para los productos en stock adjuntos a "
"esta categoría. Las opciones no se aplican a los productos adjuntos a "
"subcategorías de esta categoría."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Permitir niveles de stock negativos para los productos en stock ubicados en "
"esta ubicación."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Si esta opción no está activa en este producto ni en su categoría de "
"producto y este producto es un producto almacenable, entonces la validación "
"de los movimientos de stock relacionados se bloqueará si el nivel de stock "
"se vuelve negativo con el movimiento de stock."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Ubicaciones de inventario"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Categoría de producto"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Quants"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"No se puede validar esta operación de stock porque el nivel de stock del "
"producto '%s'%s se volvería negativo (%s) en la ubicación de stock '%s' y no "
"se permite stock negativo para este producto y/o ubicación."
#~ msgid " lot {}"
#~ msgstr " lote {}"

99
i18n/de.po Executable file
View File

@ -0,0 +1,99 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:50+0000\n"
"PO-Revision-Date: 2023-11-21 14:50+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Negative Lagerbestände erlauben"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Negative Lagerbestände für lagerbare Produkte dieser Kategorie erlauben. "
"Diese Option gilt nicht für Produkte, die zu Unterkategorien dieser "
"Kategorie gehören."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Negative Lagerbestände für die lagerfähigen Produkte erlauben, die mit "
"diesem Ort verbunden sind."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Wenn diese Option weder für dieses Produkt noch für seine Produktkategorie "
"aktiviert ist und es sich bei diesem Produkt um ein lagerfähiges Produkt "
"handelt, dann wird die Validierung der damit verbundenen Lagerbewegungen "
"blockiert, wenn der Lagerbestand durch die Lagerbewegung negativ wird."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Lagerorte"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Produkt"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Produktkategorie"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Quanten"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"Diese Aktion kann nicht ausgeführt werden, da der Lagerbestand von "
"'{name}'{name_lot} im Lager '{complete_name}' negativ werden würde "
"({q_quantity}). Negative Lagerbestände sind für dieses Produkt oder in "
"diesem Lager nicht möglich."

103
i18n/es.po Executable file
View File

@ -0,0 +1,103 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:51+0000\n"
"PO-Revision-Date: 2025-03-11 02:06+0000\n"
"Last-Translator: MartinLG3 <martinlg369@gmail.com>\n"
"Language-Team: \n"
"Language: es\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"
"X-Generator: Weblate 5.10.2\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr " lote %(name)s"
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Permitir Stock Negativo"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Permitir niveles de stock negativos para los productos en stock adjuntos a "
"esta categoría. Las opciones no se aplican a los productos adjuntos a "
"subcategorías de esta categoría."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Permitir niveles de stock negativos para los productos en stock ubicados en "
"esta ubicación."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Si esta opción no está activa en este producto ni en su categoría de "
"producto y este producto es un producto almacenable, entonces la validación "
"de los movimientos de stock relacionados se bloqueará si el nivel de stock "
"se vuelve negativo con el movimiento de stock."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Ubicaciones de inventario"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Producto"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Categoría de producto"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Cants"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"No puede validar esta operación de stock porque el nivel de stock del "
"producto '{name}'{name_lot} sería negativo ({q_quantity}) en la ubicación de "
"stock '{complete_name}' y el stock negativo no está permitido para este "
"producto y/o ubicación."
#~ msgid " lot {}"
#~ msgstr " lote {}"

100
i18n/fr.po Executable file
View File

@ -0,0 +1,100 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:49+0000\n"
"PO-Revision-Date: 2024-04-23 06:38+0000\n"
"Last-Translator: \"Denis Roussel (ACSONE)\" <denis.roussel@acsone.eu>\n"
"Language-Team: \n"
"Language: fr\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"
"X-Generator: Weblate 4.17\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Autoriser le stock négatif"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Autorise les niveaux de stock négatif pour les articles stockables attachés "
"à cette catégorie. Cette option ne s'applique pas aux articles attachés à "
"des sous-catégories de cette catégorie."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Autorise les niveaux de stock négatif pour les articles stockables attachés "
"à cette catégorie. Cette option ne s'applique pas aux articles attachés à "
"des sous-catégories de cette catégorie."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Si cette option n'est pas activée sur cet article ni sur la catégorie à "
"laquelle il est rattaché et que cet article est un produit stockable, alors "
"la validation des mouvements de stock sera bloquée si le niveau de stock "
"devient négatif avec ce mouvement de stock."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Emplacements d'inventaire"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Catégorie d'article"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Quants"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"Impossible de valider cette opération car le niveau de stock de ce produit "
"{name}'{name_lot} deviendrait négatif({q_quantity}) dans l'emplacement du "
"stock '{complete_name}'. Un stock négatif n'est pas permis pour ce produit."

98
i18n/hr.po Executable file
View File

@ -0,0 +1,98 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:49+0000\n"
"PO-Revision-Date: 2023-11-21 14:49+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Dozvoli negativnu zalihu"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Dozvoli negativna stanja uskladištivih proizvoda pridruženih ovoj "
"kategoriji. Opcije ne se odnose na proizvode iz pordeđenih kategorija ovoj."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr "Dozvoli negativnu zalihu za uskladištive proizvode na ovoj lokaciji."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Ako ova opcija nije aktivna na ovom proizvodu niti na kategoriji, i ovo je "
"uskladištivi proizvod, tada će potvrđivanje skladišnih kretanja biti "
"blokirano ako tim kretanjem zaliha ulazi u minus."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Skladišne lokacije"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Proizvod"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Kategorija proizvoda"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Količine"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"Nije moguće potvrditi ovu skladišnu operaciju jer bi količine proizvoda "
"'{name}'{name_lot} na stanju postale negativne ({q_quantity}) na skladišnoj "
"lokaciji '{complete_name}' a negativna zaliha nije dozvoljena za taj "
"proizvod i/ili lokaciju."
#~ msgid " lot {}"
#~ msgstr " lote {}"

102
i18n/it.po Executable file
View File

@ -0,0 +1,102 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:50+0000\n"
"PO-Revision-Date: 2025-02-12 16:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: \n"
"Language: it\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"
"X-Generator: Weblate 5.6.2\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr " lotto %(name)s"
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Consenti giacenze negative"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Consente giacenze negative per prodotti stoccabili associati a questa "
"categoria. Questa opzione non si applica ai prodotti associati alle sotto "
"categorie della categoria."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Consente giacenze negative per prodottistoccabili associati a questa "
"ubicazione."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Se questa opzione non è attiva nè in questo prodotto nè nella sua categoria "
"e il prodotto è stoccabile, se la giacenza diventa negativa con il movimento "
"di magazzino allora la validazione del relativo movimento verrà bloccata ."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Ubicazioni di inventario"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Prodotto"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Categoria prodotto"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Quanti"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"Questa operazione di magazzino non può essere validata perché la giacenza "
"del prodotto '{name}'{name_lot} diventerebbe negativa ({q_quantity}) "
"nell'ubicazione '{complete_name}' e per questo prodotto e/o ubicazione non è "
"consentata la giacenza negativa."
#~ msgid " lot {}"
#~ msgstr " lotto {}"

84
i18n/nl.po Executable file
View File

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: nl\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: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and"
" that this product is a stockable product, then the validation of the "
"related stock moves will be blocked if the stock level becomes negative with"
" the stock move."
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr ""
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock"
" location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""

99
i18n/nl_NL.po Executable file
View File

@ -0,0 +1,99 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-04-14 22:24+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl_NL\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"
"X-Generator: Weblate 5.10.4\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr " lot %(name)s"
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Negatieve Voorraad Toestaan"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Staat negatieve voorraadniveaus toe voor de voorraadproducten die aan deze "
"categorie zijn gekoppeld. De optie is niet van toepassing op producten die "
"aan subcategorieën van deze categorie zijn gekoppeld."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Staat negatieve voorraadniveaus toe voor de voorraadproducten die aan deze "
"locatie zijn gekoppeld."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and"
" that this product is a stockable product, then the validation of the "
"related stock moves will be blocked if the stock level becomes negative with"
" the stock move."
msgstr ""
"Als deze optie niet actief is voor dit product of de productcategorie en dit "
"product een voorraadproduct is, dan wordt de validatie van de gerelateerde "
"voorraadmutaties geblokkeerd als het voorraadniveau negatief wordt met de "
"voorraadmutatie."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Voorraadlocaties"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Product"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Productcategorie"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Quantiteiten"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock"
" location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"U kunt deze voorraadhandeling niet valideren omdat het voorraadniveau van "
"het product '{name}'{name_lot} negatief zou worden ({q_quantity}) op de "
"voorraadlocatie '{complete_name}' en negatieve voorraad niet is toegestaan "
"voor dit product en/of locatie."

100
i18n/pt.po Executable file
View File

@ -0,0 +1,100 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-21 14:50+0000\n"
"PO-Revision-Date: 2025-08-26 11:24+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>\n"
"Language-Team: \n"
"Language: pt\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"
"X-Generator: Weblate 5.10.4\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr " lote %(name)s"
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Permitir Stock Negativo"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Permitir níveis de stock negativos para os produtos armazenáveis ligados a "
"esta categoria. As opções não se aplicam aos produtos vinculados a sub-"
"categorias desta categoria."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
"Permitir níveis de stock negativos para os produtos armazenáveis anexados a "
"este local."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and "
"that this product is a stockable product, then the validation of the related "
"stock moves will be blocked if the stock level becomes negative with the "
"stock move."
msgstr ""
"Se esta opção não estiver ativa neste produto nem na sua categoria e se este "
"for um produto armazenável, então a validação dos movimentos de stock "
"relacionados será bloqueada se o nível de stock se tornar negativo após o "
"movimento de stock."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Localizações de Inventário"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Produto"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Categoria do Artigo"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Quants"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock "
"location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"Não pode validar esta operação de stock porque o nível de stock do produto "
"'{name}'{name_lot} ficaria negativo ({q_quantity}) na localização de stock "
"'{complete_name}' e um stock negativo não é permitido para este produto e/ou "
"local."

84
i18n/pt_BR.po Executable file
View File

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: pt_BR\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: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and"
" that this product is a stockable product, then the validation of the "
"related stock moves will be blocked if the stock level becomes negative with"
" the stock move."
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr ""
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock"
" location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""

83
i18n/stock_no_negative.pot Executable file
View File

@ -0,0 +1,83 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and"
" that this product is a stockable product, then the validation of the "
"related stock moves will be blocked if the stock level becomes negative with"
" the stock move."
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr ""
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock"
" location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""

94
i18n/tr.po Executable file
View File

@ -0,0 +1,94 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-06-24 12:25+0000\n"
"Last-Translator: Betül Öğmen <betulo@eska.biz>\n"
"Language-Team: none\n"
"Language: tr\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"
"X-Generator: Weblate 5.10.4\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr "Stok Negatif Olabilir"
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
"Bu kategorideki stoklanabilir ürünlerin stokları negatif olabilir. Bu "
"seçenek alt kategorilere uygulanmaz."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr "Bu konumdaki stoklanabilir ürünlerin stokları negatif olabilir."
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and"
" that this product is a stockable product, then the validation of the "
"related stock moves will be blocked if the stock level becomes negative with"
" the stock move."
msgstr ""
"Eğer bu seçenek üründe veya ürünün kategorisinde etkinse ve ürün "
"stoklanabilir bir ürünse, stok seviyesini negatif yapacak seviye stok "
"hareketlerinin onaylanması engellenir."
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr "Stok Konumları"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr "Ürün"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr "Ürün Kategorisi"
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr "Stoklar"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock"
" location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""
"Bu stok hareketini onaylayamazsınız çünkü '{name}'{name_lot} ürünü stok "
"seviyesi negatif ({q_quantity}) olacak '{complete_name}' konumunda ve ürün "
"miktarı bu ürün ve/veya konum için negatif stok olamaz."

84
i18n/zh_CN.po Executable file
View File

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_no_negative
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid " lot %(name)s"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,field_description:stock_no_negative.field_product_category__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_product_template__allow_negative_stock
#: model:ir.model.fields,field_description:stock_no_negative.field_stock_location__allow_negative_stock
msgid "Allow Negative Stock"
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_category__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"category. The options doesn't apply to products attached to sub-categories "
"of this category."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_stock_location__allow_negative_stock
msgid ""
"Allow negative stock levels for the stockable products attached to this "
"location."
msgstr ""
#. module: stock_no_negative
#: model:ir.model.fields,help:stock_no_negative.field_product_product__allow_negative_stock
#: model:ir.model.fields,help:stock_no_negative.field_product_template__allow_negative_stock
msgid ""
"If this option is not active on this product nor on its product category and"
" that this product is a stockable product, then the validation of the "
"related stock moves will be blocked if the stock level becomes negative with"
" the stock move."
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_location
msgid "Inventory Locations"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_template
msgid "Product"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_product_category
msgid "Product Category"
msgstr ""
#. module: stock_no_negative
#: model:ir.model,name:stock_no_negative.model_stock_quant
msgid "Quants"
msgstr ""
#. module: stock_no_negative
#. odoo-python
#: code:addons/stock_no_negative/models/stock_quant.py:0
msgid ""
"You cannot validate this stock operation because the stock level of the "
"product '{name}'{name_lot} would become negative ({q_quantity}) on the stock"
" location '{complete_name}' and negative stock is not allowed for this "
"product and/or location."
msgstr ""

7
models/__init__.py Executable file
View File

@ -0,0 +1,7 @@
# ?? 2015-2016 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import product
from . import stock_quant
from . import stock_location

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

26
models/product.py Executable file
View File

@ -0,0 +1,26 @@
# Copyright 2015-2016 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ProductCategory(models.Model):
_inherit = "product.category"
allow_negative_stock = fields.Boolean(
help="Allow negative stock levels for the stockable products "
"attached to this category. The options doesn't apply to products "
"attached to sub-categories of this category.",
)
class ProductTemplate(models.Model):
_inherit = "product.template"
allow_negative_stock = fields.Boolean(
help="If this option is not active on this product nor on its "
"product category and that this product is a stockable product, "
"then the validation of the related stock moves will be blocked if "
"the stock level becomes negative with the stock move.",
)

14
models/stock_location.py Executable file
View File

@ -0,0 +1,14 @@
# Copyright 2018 ForgeFlow (https://www.forgeflow.com)
# @author Jordi Ballester <jordi.ballester@forgeflow.com.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class StockLocation(models.Model):
_inherit = "stock.location"
allow_negative_stock = fields.Boolean(
help="Allow negative stock levels for the stockable products "
"attached to this location.",
)

67
models/stock_quant.py Executable file
View File

@ -0,0 +1,67 @@
# Copyright 2015-2017 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, models
from odoo.exceptions import ValidationError
from odoo.tools import config, float_compare
class StockQuant(models.Model):
_inherit = "stock.quant"
@api.constrains("product_id", "quantity")
def check_negative_qty(self):
# To provide an option to skip the check when necessary.
# e.g. mrp_subcontracting_skip_no_negative - passes the context
# for subcontracting receipts.
# Also allows negative stock for subcontracting locations as they
# are expected to have negative stock in certain Odoo 18 workflows.
if self.env.context.get("skip_negative_qty_check"):
return
p = self.env["decimal.precision"].precision_get("Product Unit of Measure")
check_negative_qty = (
config["test_enable"] and self.env.context.get("test_stock_no_negative")
) or not config["test_enable"]
if not check_negative_qty:
return
for quant in self:
disallowed_by_product = (
not quant.product_id.allow_negative_stock
and not quant.product_id.categ_id.allow_negative_stock
)
disallowed_by_location = not quant.location_id.allow_negative_stock
# Allow negative stock for subcontracting locations
# Check if mrp_subcontracting is installed and location has is_subcontracting_location field
is_subcontracting_location = False
if hasattr(quant.location_id, 'is_subcontracting_location'):
is_subcontracting_location = quant.location_id.is_subcontracting_location
if (
float_compare(quant.quantity, 0, precision_digits=p) == -1
and quant.product_id.is_storable
and quant.location_id.usage in ["internal", "transit"]
and disallowed_by_product
and disallowed_by_location
and not is_subcontracting_location
):
msg_add = ""
if quant.lot_id:
msg_add = _(" lot %(name)s", name=quant.lot_id.display_name)
raise ValidationError(
_(
"You cannot validate this stock operation because the "
"stock level of the product '{name}'{name_lot} would "
"become negative "
"({q_quantity}) on the stock location '{complete_name}' "
"and negative stock is "
"not allowed for this product and/or location."
).format(
name=quant.product_id.display_name,
name_lot=msg_add,
q_quantity=quant.quantity,
complete_name=quant.location_id.complete_name,
)
)

3
pyproject.toml Executable file
View File

@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

22
readme/CONFIGURE.md Executable file
View File

@ -0,0 +1,22 @@
By default, the stockable products will not be allowed to have a
negative stock. If you want to make some exceptions for some products,
product categories or locations, you can activate the option *Allow
Negative Stock*:
For products:
1. Go to *Inventory / Master Data / Products* and in the tab *General
Information* activate this option.
For product categories:
1. Go to *Inventory / Configuration / Products / Product Categories*
and activate this option.
For individual locations:
1. Go to *Inventory / Configuration / Settings* and activate the option
*Storage Locations*.
2. Go to *Inventory / Configuration / Warehouse Management / Locations*
and activate the option the option *Allow Negative Stock* for the
locations you choose.

23
readme/CONTRIBUTORS.md Executable file
View File

@ -0,0 +1,23 @@
- Alexis de Lattre \<<alexis.delattre@akretion.com>\>
- Vishnu Vanneri \<<vanneri.odoodev@gmail.com>\>
- Serpent Consulting Services Pvt. Ltd. \<<support@serpentcs.com>\>
- [ForgeFlow S.L.](contact@forgeflow.com):
- Jordi Ballester
- Joan Mateu
- [Tecnativa](https://www.tecnativa.com):
- Pedro M. Baeza
- [Spacefoot](https://www.spacefoot.com):
- Quentin Delcourte
- Vishnu Vanneri \<<vvanneri@ioppolo.com.au>\>
- [OERP Canada](https://www.oerp.ca/):
- Foram Darji \<<fd@oerp.ca>\>
- [Dynapps](https://www.dynapps.eu/):
- Bert Van Groenendael \<<bert.vangroenendael@dynapps.eu>\>

15
readme/DESCRIPTION.md Executable file
View File

@ -0,0 +1,15 @@
By default, Odoo allows negative stock. The advantage of negative stock
is that, if some stock levels are wrong in the ERP, you will not be
blocked when validating the picking for a customer... so you will still
be able to ship the products on time (it's an example !). The problem is
that, after you forced the stock level to negative, you are supposed to
fix the stock level later via an inventory ; but this action is often
forgotten by users, so you end up with negative stock levels in your ERP
and it can stay like this forever (or at least until the next full
inventory).
If you disallow negative stock in Odoo with this module, you will be
blocked when trying to validate a stock operation that will set the
stock level of a product and/or location as negative. So you will have
to fix the wrong stock level of that product without delay, in order to
validate the stock operation in Odoo...you can't forget it anymore !

24
readme/HISTORY.md Executable file
View File

@ -0,0 +1,24 @@
## 18.0.1.0.3 (2024-12-18)
- Allow negative stock for subcontracting locations to support Odoo 18 subcontracting workflows
## 16.0.1.0.0 (2022-10-22)
- \[16.0\]\[MIG\] stock_no_negative
## 15.0.1.0.0 (2021-12-22)
- \[15.0\]\[MIG\] stock_no_negative
## 14.0.1.0.0 (2020-12-14)
- \[14.0\]\[MIG\] stock_no_negative
## 13.0.1.0.0 (2020-01-03)
- \[13.0\]\[MIG\] stock_no_negative Remove all decorators @api.multi
## 11.0.1.1.0 (2018-12-13)
- Add the ability to allow negative stock for individual stock
locations.

4
readme/USAGE.md Executable file
View File

@ -0,0 +1,4 @@
When you validate a stock operation (a stock move, a picking, a
manufacturing order, etc.) that will set the stock level of a stockable
product as negative, you will be blocked by an error message. The
consumable products can still have a negative stock level.

BIN
static/description/icon.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

536
static/description/index.html Executable file
View File

@ -0,0 +1,536 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Stock Disallow Negative</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="stock-disallow-negative">
<h1 class="title">Stock Disallow Negative</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:13f62e491b453ad71831420b6e1b7d6c30a989c98c56dee76cb674305cc80263
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_no_negative"><img alt="OCA/stock-logistics-workflow" src="https://img.shields.io/badge/github-OCA%2Fstock--logistics--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/stock-logistics-workflow-18-0/stock-logistics-workflow-18-0-stock_no_negative"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>By default, Odoo allows negative stock. The advantage of negative stock
is that, if some stock levels are wrong in the ERP, you will not be
blocked when validating the picking for a customer… so you will still
be able to ship the products on time (its an example !). The problem is
that, after you forced the stock level to negative, you are supposed to
fix the stock level later via an inventory ; but this action is often
forgotten by users, so you end up with negative stock levels in your ERP
and it can stay like this forever (or at least until the next full
inventory).</p>
<p>If you disallow negative stock in Odoo with this module, you will be
blocked when trying to validate a stock operation that will set the
stock level of a product and/or location as negative. So you will have
to fix the wrong stock level of that product without delay, in order to
validate the stock operation in Odoo…you cant forget it anymore !</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="toc-entry-3">Changelog</a><ul>
<li><a class="reference internal" href="#section-1" id="toc-entry-4">16.0.1.0.0 (2022-10-22)</a></li>
<li><a class="reference internal" href="#section-2" id="toc-entry-5">15.0.1.0.0 (2021-12-22)</a></li>
<li><a class="reference internal" href="#section-3" id="toc-entry-6">14.0.1.0.0 (2020-12-14)</a></li>
<li><a class="reference internal" href="#section-4" id="toc-entry-7">13.0.1.0.0 (2020-01-03)</a></li>
<li><a class="reference internal" href="#section-5" id="toc-entry-8">11.0.1.1.0 (2018-12-13)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-9">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-10">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-11">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-12">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-13">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>By default, the stockable products will not be allowed to have a
negative stock. If you want to make some exceptions for some products,
product categories or locations, you can activate the option <em>Allow
Negative Stock</em>:</p>
<p>For products:</p>
<ol class="arabic simple">
<li>Go to <em>Inventory / Master Data / Products</em> and in the tab <em>General
Information</em> activate this option.</li>
</ol>
<p>For product categories:</p>
<ol class="arabic simple">
<li>Go to <em>Inventory / Configuration / Products / Product Categories</em> and
activate this option.</li>
</ol>
<p>For individual locations:</p>
<ol class="arabic simple">
<li>Go to <em>Inventory / Configuration / Settings</em> and activate the option
<em>Storage Locations</em>.</li>
<li>Go to <em>Inventory / Configuration / Warehouse Management / Locations</em>
and activate the option the option <em>Allow Negative Stock</em> for the
locations you choose.</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>When you validate a stock operation (a stock move, a picking, a
manufacturing order, etc.) that will set the stock level of a stockable
product as negative, you will be blocked by an error message. The
consumable products can still have a negative stock level.</p>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#toc-entry-3">Changelog</a></h1>
<div class="section" id="section-1">
<h2><a class="toc-backref" href="#toc-entry-4">16.0.1.0.0 (2022-10-22)</a></h2>
<ul class="simple">
<li>[16.0][MIG] stock_no_negative</li>
</ul>
</div>
<div class="section" id="section-2">
<h2><a class="toc-backref" href="#toc-entry-5">15.0.1.0.0 (2021-12-22)</a></h2>
<ul class="simple">
<li>[15.0][MIG] stock_no_negative</li>
</ul>
</div>
<div class="section" id="section-3">
<h2><a class="toc-backref" href="#toc-entry-6">14.0.1.0.0 (2020-12-14)</a></h2>
<ul class="simple">
<li>[14.0][MIG] stock_no_negative</li>
</ul>
</div>
<div class="section" id="section-4">
<h2><a class="toc-backref" href="#toc-entry-7">13.0.1.0.0 (2020-01-03)</a></h2>
<ul class="simple">
<li>[13.0][MIG] stock_no_negative Remove all decorators &#64;api.multi</li>
</ul>
</div>
<div class="section" id="section-5">
<h2><a class="toc-backref" href="#toc-entry-8">11.0.1.1.0 (2018-12-13)</a></h2>
<ul class="simple">
<li>Add the ability to allow negative stock for individual stock
locations.</li>
</ul>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-9">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_no_negative%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-10">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-11">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-12">Contributors</a></h2>
<ul class="simple">
<li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis.delattre&#64;akretion.com">alexis.delattre&#64;akretion.com</a>&gt;</li>
<li>Vishnu Vanneri &lt;<a class="reference external" href="mailto:vanneri.odoodev&#64;gmail.com">vanneri.odoodev&#64;gmail.com</a>&gt;</li>
<li>Serpent Consulting Services Pvt. Ltd. &lt;<a class="reference external" href="mailto:support&#64;serpentcs.com">support&#64;serpentcs.com</a>&gt;</li>
<li><a class="reference external" href="mailto:contact&#64;forgeflow.com">ForgeFlow S.L.</a>:<ul>
<li>Jordi Ballester</li>
<li>Joan Mateu</li>
</ul>
</li>
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Pedro M. Baeza</li>
</ul>
</li>
<li><a class="reference external" href="https://www.spacefoot.com">Spacefoot</a>:<ul>
<li>Quentin Delcourte</li>
</ul>
</li>
<li>Vishnu Vanneri &lt;<a class="reference external" href="mailto:vvanneri&#64;ioppolo.com.au">vvanneri&#64;ioppolo.com.au</a>&gt;</li>
<li><a class="reference external" href="https://www.oerp.ca/">OERP Canada</a>:<ul>
<li>Foram Darji &lt;<a class="reference external" href="mailto:fd&#64;oerp.ca">fd&#64;oerp.ca</a>&gt;</li>
</ul>
</li>
<li><a class="reference external" href="https://www.dynapps.eu/">Dynapps</a>:<ul>
<li>Bert Van Groenendael &lt;<a class="reference external" href="mailto:bert.vangroenendael&#64;dynapps.eu">bert.vangroenendael&#64;dynapps.eu</a>&gt;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-13">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_no_negative">OCA/stock-logistics-workflow</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

8
tests/__init__.py Executable file
View File

@ -0,0 +1,8 @@
# ?? 2015-2016 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# ?? 2016 ForgeFlow S.L.
# (http://www.forgeflow.com)
# ?? 2016 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_stock_no_negative

273
tests/test_stock_no_negative.py Executable file
View File

@ -0,0 +1,273 @@
# Copyright 2015-2016 Akretion (http://www.akretion.com) - Alexis de Lattre
# Copyright 2016 ForgeFlow (http://www.forgeflow.com)
# Copyright 2016 Serpent Consulting Services (<http://www.serpentcs.com>)
# Copyright 2018 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.exceptions import UserError, ValidationError
from odoo.tests.common import TransactionCase
class TestStockNoNegative(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.product_model = cls.env["product.product"]
cls.product_ctg_model = cls.env["product.category"]
cls.lot_model = cls.env["stock.lot"]
cls.picking_type_id = cls.env.ref("stock.picking_type_out")
cls.location_id = cls.env.ref("stock.stock_location_stock")
cls.location_dest_id = cls.env.ref("stock.stock_location_customers")
# Create product category
cls.product_ctg = cls._create_product_category(cls)
# Create a Product
cls.product = cls._create_product(cls, "test_product1")
# Create a Product With Lot
cls.product_with_lot = cls._create_product_with_lot(cls, "test_lot_product1")
# Create Lot
cls.lot1 = cls._create_lot(cls, "lot1")
cls._create_picking(cls)
cls._create_picking_with_lot(cls)
def _create_product_category(self):
product_ctg = self.product_ctg_model.create(
{"name": "test_product_ctg", "allow_negative_stock": False}
)
return product_ctg
def _create_product(self, name):
product = self.product_model.create(
{
"name": name,
"categ_id": self.product_ctg.id,
"is_storable": True,
"type": "consu",
"allow_negative_stock": False,
}
)
return product
def _create_product_with_lot(self, name):
product = self.product_model.create(
{
"name": name,
"categ_id": self.product_ctg.id,
"is_storable": True,
"type": "consu",
"tracking": "lot",
"allow_negative_stock": False,
}
)
return product
def _create_lot(self, name):
lot = self.lot_model.create(
{
"name": name,
"product_id": self.product_with_lot.id,
"company_id": self.env.company.id,
}
)
return lot
def _create_picking(self):
self.stock_picking = (
self.env["stock.picking"]
.with_context(test_stock_no_negative=True)
.create(
{
"picking_type_id": self.picking_type_id.id,
"move_type": "direct",
"location_id": self.location_id.id,
"location_dest_id": self.location_dest_id.id,
}
)
)
self.stock_move = self.env["stock.move"].create(
{
"name": "Test Move",
"product_id": self.product.id,
"product_uom_qty": 100.0,
"product_uom": self.product.uom_id.id,
"picking_id": self.stock_picking.id,
"state": "draft",
"location_id": self.location_id.id,
"location_dest_id": self.location_dest_id.id,
"quantity": 100.0,
}
)
def _create_picking_with_lot(self):
self.stock_picking_with_lot = (
self.env["stock.picking"]
.with_context(test_stock_no_negative=True)
.create(
{
"picking_type_id": self.picking_type_id.id,
"move_type": "direct",
"location_id": self.location_id.id,
"location_dest_id": self.location_dest_id.id,
}
)
)
self.stock_move_with_lot = self.env["stock.move"].create(
{
"name": "Test Move",
"product_id": self.product_with_lot.id,
"product_uom_qty": 100.0,
"product_uom": self.product_with_lot.uom_id.id,
"picking_id": self.stock_picking_with_lot.id,
"state": "draft",
"location_id": self.location_id.id,
"location_dest_id": self.location_dest_id.id,
}
)
def test_check_constrains(self):
"""Assert that constraint is raised when user
tries to validate the stock operation which would
make the stock level of the product negative"""
self.stock_picking.action_confirm()
with self.assertRaises(ValidationError):
self.stock_picking.button_validate()
def test_check_constrains_with_lot(self):
"""Assert that constraint is raised when user
tries to validate the stock operation which would
make the stock level of the product negative with
a product with lot"""
self.stock_picking_with_lot.action_confirm()
self.stock_move_line_with_lot = self.env["stock.move.line"].create(
{
"product_id": self.product_with_lot.id,
"quantity": 100.0,
"picking_id": self.stock_picking_with_lot.id,
"move_id": self.stock_move_with_lot.id,
"location_id": self.location_id.id,
"location_dest_id": self.location_dest_id.id,
"lot_id": self.lot1.id,
}
)
with self.assertRaises(ValidationError):
self.stock_picking_with_lot.button_validate()
def test_true_allow_negative_stock_product(self):
"""Assert that negative stock levels are allowed when
the allow_negative_stock is set active in the product"""
self.product.allow_negative_stock = True
self.stock_picking.action_confirm()
self.stock_picking.button_validate()
quant = self.env["stock.quant"].search(
[
("product_id", "=", self.product.id),
("location_id", "=", self.location_id.id),
]
)
self.assertEqual(quant.quantity, -100)
def test_true_allow_negative_stock_location(self):
"""Assert that negative stock levels are allowed when
the allow_negative_stock is set active in the product"""
self.product.allow_negative_stock = False
self.location_id.allow_negative_stock = True
self.stock_picking.action_confirm()
self.stock_picking.button_validate()
quant = self.env["stock.quant"].search(
[
("product_id", "=", self.product.id),
("location_id", "=", self.location_id.id),
]
)
self.assertEqual(quant.quantity, -100)
def test_true_allow_negative_stock_product_with_lot(self):
"""Assert that negative stock levels are allowed when
the allow_negative_stock is set active in the product with lot"""
self.product_with_lot.allow_negative_stock = True
self.stock_picking_with_lot.action_confirm()
with self.assertRaises(UserError):
self.stock_picking_with_lot.button_validate()
# create Detail Operations (move line with lot)
self.stock_move_line_with_lot = self.env["stock.move.line"].create(
{
"product_id": self.product_with_lot.id,
"quantity": 100.0,
"picking_id": self.stock_picking_with_lot.id,
"move_id": self.stock_move_with_lot.id,
"location_id": self.location_id.id,
"location_dest_id": self.location_dest_id.id,
"lot_id": self.lot1.id,
}
)
self.stock_picking_with_lot.button_validate()
quant = self.env["stock.quant"].search(
[
("product_id", "=", self.product_with_lot.id),
("location_id", "=", self.location_id.id),
("lot_id", "=", self.lot1.id),
]
)
self.assertEqual(quant.quantity, -100)
def test_allow_negative_stock_subcontracting_location(self):
"""Assert that negative stock levels are allowed in subcontracting locations
even when allow_negative_stock is False on product and location"""
# Skip test if mrp_subcontracting is not installed
if not hasattr(self.env['stock.location'], 'is_subcontracting_location'):
self.skipTest("mrp_subcontracting module not installed")
# Create a subcontracting location
subcontracting_location = self.env['stock.location'].create({
'name': 'Test Subcontracting Location',
'usage': 'internal',
'is_subcontracting_location': True,
'allow_negative_stock': False,
})
# Create picking from subcontracting location to customer
stock_picking_subcontract = (
self.env["stock.picking"]
.with_context(test_stock_no_negative=True)
.create(
{
"picking_type_id": self.picking_type_id.id,
"move_type": "direct",
"location_id": subcontracting_location.id,
"location_dest_id": self.location_dest_id.id,
}
)
)
stock_move_subcontract = self.env["stock.move"].create(
{
"name": "Test Subcontract Move",
"product_id": self.product.id,
"product_uom_qty": 100.0,
"product_uom": self.product.uom_id.id,
"picking_id": stock_picking_subcontract.id,
"state": "draft",
"location_id": subcontracting_location.id,
"location_dest_id": self.location_dest_id.id,
"quantity": 100.0,
}
)
# Ensure product and location don't allow negative stock
self.product.allow_negative_stock = False
subcontracting_location.allow_negative_stock = False
# This should not raise ValidationError because it's a subcontracting location
stock_picking_subcontract.action_confirm()
stock_picking_subcontract.button_validate()
# Verify negative stock is allowed
quant = self.env["stock.quant"].search(
[
("product_id", "=", self.product.id),
("location_id", "=", subcontracting_location.id),
]
)
self.assertEqual(quant.quantity, -100)

28
views/product_product_views.xml Executable file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
?? 2015-2016 Akretion (http://www.akretion.com/)
@author Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_template_property_form" model="ir.ui.view">
<field name="name">stock_no_negative.product.template.form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="stock.view_template_property_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='is_storable']/parent::div" position="after">
<field name="allow_negative_stock" invisible="not is_storable" />
</xpath>
</field>
</record>
<record id="product_category_form_view_inherit" model="ir.ui.view">
<field name="name">stock_no_negative.product.category.form</field>
<field name="model">product.category</field>
<field name="inherit_id" ref="stock.product_category_form_view_inherit" />
<field name="arch" type="xml">
<field name="removal_strategy_id" position="after">
<field name="allow_negative_stock" />
</field>
</field>
</record>
</odoo>

21
views/stock_location_views.xml Executable file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2018 Akretion (http://www.akretion.com/)
@author Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_location_form" model="ir.ui.view">
<field name="name">stock.location.form.allow_negative_stock</field>
<field name="model">stock.location</field>
<field name="inherit_id" ref="stock.view_location_form" />
<field name="arch" type="xml">
<field name="usage" position="after">
<field
name="allow_negative_stock"
invisible="usage not in ['internal', 'transit']"
/>
</field>
</field>
</record>
</odoo>