[ADD] stock_quant_safe_inventory: Prevent inventory on quant being processed

This commit is contained in:
Laurent Mignon (ACSONE)
2024-02-20 11:01:43 +01:00
committed by Denis Roussel
parent 38c3faaa31
commit 3a57721696
18 changed files with 825 additions and 0 deletions

View File

@@ -0,0 +1 @@
../../../../stock_quant_safe_inventory

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@@ -0,0 +1,103 @@
==========================
Stock Quant Safe Inventory
==========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:8d5ca98684eb4061dab8a6fd933f66881a81d33a3d885ebfc8b0d1e87dd9849d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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--warehouse-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-warehouse/tree/16.0/stock_quant_safe_inventory
:alt: OCA/stock-logistics-warehouse
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-16-0/stock-logistics-warehouse-16-0-stock_quant_safe_inventory
: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-warehouse&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module prevents the user from updating the quantity on a quant if
some quantity has been put as done on a move line not yet validated for
the same product, location, lot and package.
**Table of contents**
.. contents::
:local:
Use Cases / Context
===================
In odoo, you can update the quantity on a quant by filling the counted
quantity on the quant form view and clicking on the "Apply inventory"
button at the end of the line. Unfortunately, nothing prevents you from
doing this for a quant and location in front of which you are standing
to perform an inventory while some quantity have already been picked
from the location by another user but not yet validated. This can lead
to stock discrepancies since the quantity you are updating is not the
actual quantity in the location for the system and when the picking will
be validated, the system will decrease the quantity you just updated by
the quantity that was picked by the other user.
This module prevents this by preventing the user from updating the
quantity on a quant if some quantity has been put as done on a move line
not yet validated for the same product, location, lot and package.
Usage
=====
To prevent inventory of quants being processed you must check the
``Stock quant no inventory if being picked`` parameter into the stock
settings panel. (stock -> configuration -> settings)
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-warehouse/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-warehouse/issues/new?body=module:%20stock_quant_safe_inventory%0Aversion:%2016.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
-------
* ACSONE SA/NV
Contributors
------------
- Laurent Mignon laurent.mignon@acsone.eu (https://www.acsone.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-warehouse <https://github.com/OCA/stock-logistics-warehouse/tree/16.0/stock_quant_safe_inventory>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,21 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Stock Quant Safe Inventory",
"summary": """
Prevents the quantity on the quant from being updated if quantities have
already been picked but not validated in pickings in progress.""",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"depends": [
"stock",
],
"data": [
"views/res_config_settings.xml",
],
"demo": [],
"installable": True,
}

View File

@@ -0,0 +1,3 @@
from . import res_company
from . import res_config_settings
from . import stock_quant

View File

@@ -0,0 +1,16 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
stock_quant_no_inventory_if_being_picked = fields.Boolean(
string="Stock quant no inventory if being picked",
help="If checked, the system will prevent inventory of stock quants if "
"some quantities are currently being picked for the same product, "
"location, lot and package.",
default=False,
)

View File

@@ -0,0 +1,12 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
stock_quant_no_inventory_if_being_picked = fields.Boolean(
related="company_id.stock_quant_no_inventory_if_being_picked", readonly=False
)

View File

@@ -0,0 +1,89 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, models
from odoo.exceptions import UserError
from odoo.tools import groupby
class StockQuant(models.Model):
_inherit = "stock.quant"
@api.model
def _quant_move_common_keys(self):
"""Return the list of fields that are used to select quant from move lines."""
return [
"location_id",
"product_id",
"lot_id",
"package_id",
"owner_id",
"company_id",
]
def _get_current_move_lines(self):
"""Return a dictionary of move lines that are currently in progress
by quant.
This method returns a dictionary with the key being the quant id and
the value being a list of move lines that are currently in progress
for that quant.
A move line is considered to be in progress if it is not done and
its quantity done is positive for the same product, location, lot
and package as the quant.
"""
quants = self.filtered("reserved_quantity")
quant_selection_keys = self._quant_move_common_keys()
move_lines = self.env["stock.move.line"].search(
[
("state", "not in", ("done", "cancel")),
("location_id", "in", quants.mapped("location_id").ids),
("qty_done", ">", 0.0),
]
)
move_lines_by_location_by_product = dict(
groupby(
move_lines,
lambda ml: tuple([ml[quant_key] for quant_key in quant_selection_keys]),
)
)
ret = {}
for quant in quants:
key = tuple([quant[quant_key] for quant_key in quant_selection_keys])
move_lines = move_lines_by_location_by_product.get(key, [])
if move_lines:
ret[quant.id] = move_lines
return ret
def _check_update_quantity_allowed(self, raise_exception=True):
if not self.env.company.stock_quant_no_inventory_if_being_picked:
return
current_move_lines = self._get_current_move_lines()
if current_move_lines:
if raise_exception:
details = []
for quant in self:
move_lines = current_move_lines.get(quant.id, [])
if move_lines:
details.extend(
f"{move_line.qty_done} {move_line.product_id.name} "
f"-> {move_line.location_id.name}"
for move_line in move_lines
)
raise UserError(
_(
"You cannot update the quantity of a quant that is "
"currently being picked.\n %(details)s",
details="\n".join(details),
)
)
def write(self, vals):
if "inventory_quantity" in vals:
self._check_update_quantity_allowed()
return super().write(vals)
def _apply_inventory(self):
self.filtered("inventory_diff_quantity")._check_update_quantity_allowed()
return super()._apply_inventory()

View File

@@ -0,0 +1,13 @@
In odoo, you can update the quantity on a quant by filling the
counted quantity on the quant form view and clicking on the "Apply inventory"
button at the end of the line. Unfortunately, nothing prevents you from doing
this for a quant and location in front of which you are standing to perform
an inventory while some quantity have already been picked from the location by
another user but not yet validated. This can lead to stock discrepancies since
the quantity you are updating is not the actual quantity in the location for the
system and when the picking will be validated, the system will decrease the
quantity you just updated by the quantity that was picked by the other user.
This module prevents this by preventing the user from updating the quantity on
a quant if some quantity has been put as done on a move line not yet validated
for the same product, location, lot and package.

View File

@@ -0,0 +1 @@
- Laurent Mignon <laurent.mignon@acsone.eu> (https://www.acsone.eu)

View File

@@ -0,0 +1,4 @@
This module prevents the user from updating the quantity on a quant if some
quantity has been put as done on a move line not yet validated for the same
product, location, lot and package.

View File

@@ -0,0 +1,3 @@
To prevent inventory of quants being processed you must check the
`Stock quant no inventory if being picked` parameter into the stock
settings panel. (stock -> configuration -> settings)

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,447 @@
<?xml version="1.0" encoding="utf-8"?>
<!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 Quant Safe Inventory</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
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: grey; } /* 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 {
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-quant-safe-inventory">
<h1 class="title">Stock Quant Safe Inventory</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:8d5ca98684eb4061dab8a6fd933f66881a81d33a3d885ebfc8b0d1e87dd9849d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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-warehouse/tree/16.0/stock_quant_safe_inventory"><img alt="OCA/stock-logistics-warehouse" src="https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/stock-logistics-warehouse-16-0/stock-logistics-warehouse-16-0-stock_quant_safe_inventory"><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-warehouse&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module prevents the user from updating the quantity on a quant if
some quantity has been put as done on a move line not yet validated for
the same product, location, lot and package.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#use-cases-context" id="toc-entry-1">Use Cases / Context</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="use-cases-context">
<h1><a class="toc-backref" href="#toc-entry-1">Use Cases / Context</a></h1>
<p>In odoo, you can update the quantity on a quant by filling the counted
quantity on the quant form view and clicking on the “Apply inventory”
button at the end of the line. Unfortunately, nothing prevents you from
doing this for a quant and location in front of which you are standing
to perform an inventory while some quantity have already been picked
from the location by another user but not yet validated. This can lead
to stock discrepancies since the quantity you are updating is not the
actual quantity in the location for the system and when the picking will
be validated, the system will decrease the quantity you just updated by
the quantity that was picked by the other user.</p>
<p>This module prevents this by preventing the user from updating the
quantity on a quant if some quantity has been put as done on a move line
not yet validated for the same product, location, lot and package.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>To prevent inventory of quants being processed you must check the
<tt class="docutils literal">Stock quant no inventory if being picked</tt> parameter into the stock
settings panel. (stock -&gt; configuration -&gt; settings)</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/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-warehouse/issues/new?body=module:%20stock_quant_safe_inventory%0Aversion:%2016.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-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>ACSONE SA/NV</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul class="simple">
<li>Laurent Mignon <a class="reference external" href="mailto:laurent.mignon&#64;acsone.eu">laurent.mignon&#64;acsone.eu</a> (<a class="reference external" href="https://www.acsone.eu">https://www.acsone.eu</a>)</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">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-warehouse/tree/16.0/stock_quant_safe_inventory">OCA/stock-logistics-warehouse</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>

View File

@@ -0,0 +1 @@
from . import test_safe_inventory

View File

@@ -0,0 +1,73 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.exceptions import UserError
from odoo.addons.base.tests.common import BaseCommon
class TestSafeInventory(BaseCommon):
def setUp(self):
super().setUp()
self.product = self.env["product.product"].create(
{
"name": "Product",
"type": "product",
"categ_id": self.env.ref("product.product_category_all").id,
}
)
self.location = self.env["stock.location"].create(
{"name": "Location", "usage": "internal"}
)
self.quant = self.env["stock.quant"].create(
{
"product_id": self.product.id,
"location_id": self.location.id,
"quantity": 10.0,
}
)
self.picking = self.env["stock.picking"].create(
{
"picking_type_id": self.env.ref("stock.picking_type_in").id,
"location_id": self.location.id,
"location_dest_id": self.env.ref("stock.stock_location_stock").id,
}
)
self.move = self.env["stock.move"].create(
{
"name": "Move",
"product_id": self.product.id,
"product_uom_qty": 5.0,
"product_uom": self.product.uom_id.id,
"picking_id": self.picking.id,
"location_id": self.location.id,
"location_dest_id": self.env.ref("stock.stock_location_stock").id,
}
)
@classmethod
def _make_inventory(cls, product, location, qty):
cls.env["stock.quant"].with_context(inventory_mode=True).create(
{
"product_id": product.id,
"location_id": location.id,
"inventory_quantity": qty,
}
)._apply_inventory()
def test_safe_inventory_qty_done(self):
self.picking.action_assign()
self.picking.move_line_ids.write({"qty_done": 5.0})
self.env.company.stock_quant_no_inventory_if_being_picked = True
with self.assertRaisesRegexp(
UserError,
"You cannot update the quantity of a quant that is currently being picked",
):
self._make_inventory(self.product, self.location, 5.0)
self.env.company.stock_quant_no_inventory_if_being_picked = False
self._make_inventory(self.product, self.location, 5.0)
def test_safe_inventory_no_qty_done(self):
self.picking.action_assign()
self.env.company.stock_quant_no_inventory_if_being_picked = True
self._make_inventory(self.product, self.location, 5.0)

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2024 ACSONE SA/NV
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="stock.res_config_settings_view_form" />
<field name="arch" type="xml">
<div name="operations_setting_container" position="inside">
<div
class="col-12 col-lg-6 o_setting_box"
id="stock_quant_no_inventory_if_being_picked"
>
<div class="o_setting_left_pane">
<field name="stock_quant_no_inventory_if_being_picked" />
</div>
<div class="o_setting_right_pane">
<label
for="stock_quant_no_inventory_if_being_picked"
string="Stock quant no inventory if being picked"
/>
<div class="text-muted">
If checked, the system will prevent inventory of stock quants if some quantities are currently being picked for the same product, location, lot and package.
</div>
</div>
</div>
</div>
</field>
</record>
</odoo>