odoo-addon-stock-restrict-lot 17.0.1.2.1__py3-none-any.whl → 18.0.1.0.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of odoo-addon-stock-restrict-lot might be problematic. Click here for more details.
- odoo/addons/stock_restrict_lot/README.rst +10 -8
- odoo/addons/stock_restrict_lot/__manifest__.py +3 -1
- odoo/addons/stock_restrict_lot/i18n/es.po +8 -2
- odoo/addons/stock_restrict_lot/i18n/hr.po +8 -2
- odoo/addons/stock_restrict_lot/i18n/it.po +8 -2
- odoo/addons/stock_restrict_lot/i18n/stock_restrict_lot.pot +9 -3
- odoo/addons/stock_restrict_lot/models/stock_move.py +49 -7
- odoo/addons/stock_restrict_lot/models/stock_picking.py +1 -1
- odoo/addons/stock_restrict_lot/models/stock_rule.py +7 -0
- odoo/addons/stock_restrict_lot/readme/CONTRIBUTORS.md +1 -0
- odoo/addons/stock_restrict_lot/readme/DESCRIPTION.md +2 -2
- odoo/addons/stock_restrict_lot/static/description/index.html +8 -6
- odoo/addons/stock_restrict_lot/tests/test_restrict_lot.py +123 -34
- odoo/addons/stock_restrict_lot/views/stock_move_views.xml +16 -18
- odoo/addons/stock_restrict_lot/views/stock_picking.xml +18 -20
- {odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info → odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info}/METADATA +13 -11
- odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info/RECORD +24 -0
- odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info/RECORD +0 -24
- {odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info → odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info}/WHEEL +0 -0
- {odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info → odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info}/top_level.txt +0 -0
|
@@ -7,7 +7,7 @@ Stock Restrict Lot
|
|
|
7
7
|
!! This file is generated by oca-gen-addon-readme !!
|
|
8
8
|
!! changes will be overwritten. !!
|
|
9
9
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
10
|
-
!! source digest: sha256:
|
|
10
|
+
!! source digest: sha256:dce023da3482003599a49ae27980bca635a30f0b86afd9ee1bcbeb8d3ae775d9
|
|
11
11
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
12
12
|
|
|
13
13
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
|
@@ -17,21 +17,22 @@ Stock Restrict Lot
|
|
|
17
17
|
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
|
|
18
18
|
:alt: License: LGPL-3
|
|
19
19
|
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--workflow-lightgray.png?logo=github
|
|
20
|
-
:target: https://github.com/OCA/stock-logistics-workflow/tree/
|
|
20
|
+
:target: https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_restrict_lot
|
|
21
21
|
:alt: OCA/stock-logistics-workflow
|
|
22
22
|
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
|
23
|
-
:target: https://translation.odoo-community.org/projects/stock-logistics-workflow-
|
|
23
|
+
:target: https://translation.odoo-community.org/projects/stock-logistics-workflow-18-0/stock-logistics-workflow-18-0-stock_restrict_lot
|
|
24
24
|
:alt: Translate me on Weblate
|
|
25
25
|
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
|
|
26
|
-
:target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&target_branch=
|
|
26
|
+
:target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&target_branch=18.0
|
|
27
27
|
:alt: Try me on Runboat
|
|
28
28
|
|
|
29
29
|
|badge1| |badge2| |badge3| |badge4| |badge5|
|
|
30
30
|
|
|
31
|
-
This module
|
|
31
|
+
This module adds a field to restrict a stock move to a specific lot. It
|
|
32
32
|
propagates it between chained moves. A move with a restrict lot will
|
|
33
33
|
only be able to reserve or transfer products with the specified lot.
|
|
34
|
-
This module
|
|
34
|
+
This module serves as a basis for other modules, it has not effect on
|
|
35
|
+
its own.
|
|
35
36
|
|
|
36
37
|
**Table of contents**
|
|
37
38
|
|
|
@@ -44,7 +45,7 @@ Bug Tracker
|
|
|
44
45
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-workflow/issues>`_.
|
|
45
46
|
In case of trouble, please check there if your issue has already been reported.
|
|
46
47
|
If you spotted it first, help us to smash it by providing a detailed and welcomed
|
|
47
|
-
`feedback <https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_restrict_lot%0Aversion:%
|
|
48
|
+
`feedback <https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_restrict_lot%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
|
48
49
|
|
|
49
50
|
Do not contact contributors directly about support or help with technical issues.
|
|
50
51
|
|
|
@@ -61,6 +62,7 @@ Contributors
|
|
|
61
62
|
|
|
62
63
|
- Florian da Costa <florian.dacosta@akretion.com>
|
|
63
64
|
- Ruchir Shukla <ruchir@bizzappdev.com>
|
|
65
|
+
- Stefan Rijnhart <stefan@opener.amsterdam>
|
|
64
66
|
|
|
65
67
|
Maintainers
|
|
66
68
|
-----------
|
|
@@ -83,6 +85,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|
|
|
83
85
|
|
|
84
86
|
|maintainer-florian-dacosta|
|
|
85
87
|
|
|
86
|
-
This module is part of the `OCA/stock-logistics-workflow <https://github.com/OCA/stock-logistics-workflow/tree/
|
|
88
|
+
This module is part of the `OCA/stock-logistics-workflow <https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_restrict_lot>`_ project on GitHub.
|
|
87
89
|
|
|
88
90
|
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
2
|
+
|
|
1
3
|
{
|
|
2
4
|
"name": "Stock Restrict Lot",
|
|
3
5
|
"summary": "Base module that add back the concept of restrict lot on stock move",
|
|
4
|
-
"version": "
|
|
6
|
+
"version": "18.0.1.0.0",
|
|
5
7
|
"category": "Warehouse Management",
|
|
6
8
|
"website": "https://github.com/OCA/stock-logistics-workflow",
|
|
7
9
|
"author": "Akretion, Odoo Community Association (OCA)",
|
|
@@ -19,7 +19,6 @@ msgstr ""
|
|
|
19
19
|
#. module: stock_restrict_lot
|
|
20
20
|
#. odoo-python
|
|
21
21
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
22
|
-
#, python-format
|
|
23
22
|
msgid ""
|
|
24
23
|
"Inconsistencies between reserved quant and lot restriction on stock move"
|
|
25
24
|
msgstr ""
|
|
@@ -55,7 +54,6 @@ msgstr "Regla de Existencias"
|
|
|
55
54
|
#. module: stock_restrict_lot
|
|
56
55
|
#. odoo-python
|
|
57
56
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
58
|
-
#, python-format
|
|
59
57
|
msgid ""
|
|
60
58
|
"The lot(s) %(move_line_lot)s being moved is inconsistent with the "
|
|
61
59
|
"restriction on lot %(move_restrict_lot)s set on the move"
|
|
@@ -65,3 +63,11 @@ msgstr ""
|
|
|
65
63
|
#: model:ir.model,name:stock_restrict_lot.model_stock_picking
|
|
66
64
|
msgid "Transfer"
|
|
67
65
|
msgstr "Transferencia"
|
|
66
|
+
|
|
67
|
+
#. module: stock_restrict_lot
|
|
68
|
+
#. odoo-python
|
|
69
|
+
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
70
|
+
msgid ""
|
|
71
|
+
"You can't modify the Lot/Serial number because at least one move in the "
|
|
72
|
+
"chain has already been done with another Lot/Serial number."
|
|
73
|
+
msgstr ""
|
|
@@ -20,7 +20,6 @@ msgstr ""
|
|
|
20
20
|
#. module: stock_restrict_lot
|
|
21
21
|
#. odoo-python
|
|
22
22
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
23
|
-
#, python-format
|
|
24
23
|
msgid ""
|
|
25
24
|
"Inconsistencies between reserved quant and lot restriction on stock move"
|
|
26
25
|
msgstr ""
|
|
@@ -56,7 +55,6 @@ msgstr "Skladišno pravilo"
|
|
|
56
55
|
#. module: stock_restrict_lot
|
|
57
56
|
#. odoo-python
|
|
58
57
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
59
|
-
#, python-format
|
|
60
58
|
msgid ""
|
|
61
59
|
"The lot(s) %(move_line_lot)s being moved is inconsistent with the "
|
|
62
60
|
"restriction on lot %(move_restrict_lot)s set on the move"
|
|
@@ -66,3 +64,11 @@ msgstr ""
|
|
|
66
64
|
#: model:ir.model,name:stock_restrict_lot.model_stock_picking
|
|
67
65
|
msgid "Transfer"
|
|
68
66
|
msgstr "Prijenos"
|
|
67
|
+
|
|
68
|
+
#. module: stock_restrict_lot
|
|
69
|
+
#. odoo-python
|
|
70
|
+
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
71
|
+
msgid ""
|
|
72
|
+
"You can't modify the Lot/Serial number because at least one move in the "
|
|
73
|
+
"chain has already been done with another Lot/Serial number."
|
|
74
|
+
msgstr ""
|
|
@@ -19,7 +19,6 @@ msgstr ""
|
|
|
19
19
|
#. module: stock_restrict_lot
|
|
20
20
|
#. odoo-python
|
|
21
21
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
22
|
-
#, python-format
|
|
23
22
|
msgid ""
|
|
24
23
|
"Inconsistencies between reserved quant and lot restriction on stock move"
|
|
25
24
|
msgstr ""
|
|
@@ -55,7 +54,6 @@ msgstr "Regola di giacenza"
|
|
|
55
54
|
#. module: stock_restrict_lot
|
|
56
55
|
#. odoo-python
|
|
57
56
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
58
|
-
#, python-format
|
|
59
57
|
msgid ""
|
|
60
58
|
"The lot(s) %(move_line_lot)s being moved is inconsistent with the "
|
|
61
59
|
"restriction on lot %(move_restrict_lot)s set on the move"
|
|
@@ -67,3 +65,11 @@ msgstr ""
|
|
|
67
65
|
#: model:ir.model,name:stock_restrict_lot.model_stock_picking
|
|
68
66
|
msgid "Transfer"
|
|
69
67
|
msgstr "Trasferimento"
|
|
68
|
+
|
|
69
|
+
#. module: stock_restrict_lot
|
|
70
|
+
#. odoo-python
|
|
71
|
+
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
72
|
+
msgid ""
|
|
73
|
+
"You can't modify the Lot/Serial number because at least one move in the "
|
|
74
|
+
"chain has already been done with another Lot/Serial number."
|
|
75
|
+
msgstr ""
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#
|
|
5
5
|
msgid ""
|
|
6
6
|
msgstr ""
|
|
7
|
-
"Project-Id-Version: Odoo Server
|
|
7
|
+
"Project-Id-Version: Odoo Server 18.0\n"
|
|
8
8
|
"Report-Msgid-Bugs-To: \n"
|
|
9
9
|
"Last-Translator: \n"
|
|
10
10
|
"Language-Team: \n"
|
|
@@ -16,7 +16,6 @@ msgstr ""
|
|
|
16
16
|
#. module: stock_restrict_lot
|
|
17
17
|
#. odoo-python
|
|
18
18
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
19
|
-
#, python-format
|
|
20
19
|
msgid ""
|
|
21
20
|
"Inconsistencies between reserved quant and lot restriction on stock move"
|
|
22
21
|
msgstr ""
|
|
@@ -50,7 +49,6 @@ msgstr ""
|
|
|
50
49
|
#. module: stock_restrict_lot
|
|
51
50
|
#. odoo-python
|
|
52
51
|
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
53
|
-
#, python-format
|
|
54
52
|
msgid ""
|
|
55
53
|
"The lot(s) %(move_line_lot)s being moved is inconsistent with the "
|
|
56
54
|
"restriction on lot %(move_restrict_lot)s set on the move"
|
|
@@ -60,3 +58,11 @@ msgstr ""
|
|
|
60
58
|
#: model:ir.model,name:stock_restrict_lot.model_stock_picking
|
|
61
59
|
msgid "Transfer"
|
|
62
60
|
msgstr ""
|
|
61
|
+
|
|
62
|
+
#. module: stock_restrict_lot
|
|
63
|
+
#. odoo-python
|
|
64
|
+
#: code:addons/stock_restrict_lot/models/stock_move.py:0
|
|
65
|
+
msgid ""
|
|
66
|
+
"You can't modify the Lot/Serial number because at least one move in the "
|
|
67
|
+
"chain has already been done with another Lot/Serial number."
|
|
68
|
+
msgstr ""
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
2
|
+
|
|
3
|
+
from odoo import api, exceptions, fields, models
|
|
4
|
+
from odoo.exceptions import UserError, ValidationError
|
|
5
|
+
from odoo.tools.misc import OrderedSet
|
|
3
6
|
|
|
4
7
|
|
|
5
8
|
class StockMove(models.Model):
|
|
6
9
|
_inherit = "stock.move"
|
|
7
10
|
|
|
8
|
-
# seems better to not copy this field except when a move is
|
|
11
|
+
# seems better to not copy this field except when a move is split, because a move
|
|
9
12
|
# can be copied in multiple different occasions and could even be copied with a
|
|
10
13
|
# different product...
|
|
11
14
|
restrict_lot_id = fields.Many2one(
|
|
@@ -34,7 +37,7 @@ class StockMove(models.Model):
|
|
|
34
37
|
and vals["lot_id"] != self.restrict_lot_id.id
|
|
35
38
|
):
|
|
36
39
|
raise exceptions.UserError(
|
|
37
|
-
_(
|
|
40
|
+
self.env._(
|
|
38
41
|
"Inconsistencies between reserved quant and lot restriction on "
|
|
39
42
|
"stock move"
|
|
40
43
|
)
|
|
@@ -67,7 +70,6 @@ class StockMove(models.Model):
|
|
|
67
70
|
self,
|
|
68
71
|
need,
|
|
69
72
|
location_id,
|
|
70
|
-
quant_ids=None,
|
|
71
73
|
lot_id=None,
|
|
72
74
|
package_id=None,
|
|
73
75
|
owner_id=None,
|
|
@@ -79,7 +81,6 @@ class StockMove(models.Model):
|
|
|
79
81
|
return super()._update_reserved_quantity(
|
|
80
82
|
need,
|
|
81
83
|
location_id,
|
|
82
|
-
quant_ids=quant_ids,
|
|
83
84
|
lot_id=lot_id,
|
|
84
85
|
package_id=package_id,
|
|
85
86
|
owner_id=owner_id,
|
|
@@ -108,7 +109,7 @@ class StockMove(models.Model):
|
|
|
108
109
|
move_line_lot = move.mapped("move_line_ids.lot_id")
|
|
109
110
|
if move.restrict_lot_id != move_line_lot:
|
|
110
111
|
raise UserError(
|
|
111
|
-
_(
|
|
112
|
+
self.env._(
|
|
112
113
|
"The lot(s) %(move_line_lot)s being moved is "
|
|
113
114
|
"inconsistent with the restriction on "
|
|
114
115
|
"lot %(move_restrict_lot)s set on the move",
|
|
@@ -116,3 +117,44 @@ class StockMove(models.Model):
|
|
|
116
117
|
move_restrict_lot=move.restrict_lot_id.display_name,
|
|
117
118
|
)
|
|
118
119
|
)
|
|
120
|
+
|
|
121
|
+
# Same as _rollup_move_origs but also for "done" moves.
|
|
122
|
+
def _rollup_not_cancelled_move_origs(self, seen=False):
|
|
123
|
+
if not seen:
|
|
124
|
+
seen = OrderedSet()
|
|
125
|
+
unseen = OrderedSet(self.ids) - seen
|
|
126
|
+
if not unseen:
|
|
127
|
+
return seen
|
|
128
|
+
seen.update(unseen)
|
|
129
|
+
self.filtered(lambda m: m.id in unseen).move_orig_ids.filtered(
|
|
130
|
+
lambda sm: sm.state != "cancel"
|
|
131
|
+
)._rollup_not_cancelled_move_origs(seen)
|
|
132
|
+
return seen
|
|
133
|
+
|
|
134
|
+
def write(self, vals):
|
|
135
|
+
if "restrict_lot_id" not in vals:
|
|
136
|
+
return super().write(vals)
|
|
137
|
+
else:
|
|
138
|
+
restrict_lot_id = vals.pop("restrict_lot_id")
|
|
139
|
+
restrict_lot = self.env["stock.lot"].browse(restrict_lot_id)
|
|
140
|
+
chained_move_ids = self._rollup_move_dests()
|
|
141
|
+
chained_move_ids = self._rollup_not_cancelled_move_origs(
|
|
142
|
+
chained_move_ids - self.ids
|
|
143
|
+
)
|
|
144
|
+
chained_moves = self.env["stock.move"].browse(chained_move_ids)
|
|
145
|
+
if any(
|
|
146
|
+
[
|
|
147
|
+
sm.state == "done" and sm.lot_ids and sm.lot_ids != restrict_lot
|
|
148
|
+
for sm in chained_moves
|
|
149
|
+
]
|
|
150
|
+
):
|
|
151
|
+
raise ValidationError(
|
|
152
|
+
self.env._(
|
|
153
|
+
"You can't modify the Lot/Serial number "
|
|
154
|
+
"because at least one move in the chain has "
|
|
155
|
+
"already been done with another Lot/Serial number."
|
|
156
|
+
)
|
|
157
|
+
)
|
|
158
|
+
for move in chained_moves:
|
|
159
|
+
super(StockMove, move).write({"restrict_lot_id": restrict_lot_id})
|
|
160
|
+
return super().write(vals)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
2
|
+
|
|
1
3
|
from odoo import models
|
|
2
4
|
|
|
3
5
|
|
|
@@ -8,3 +10,8 @@ class StockRule(models.Model):
|
|
|
8
10
|
fields = super()._get_custom_move_fields()
|
|
9
11
|
fields += ["restrict_lot_id"]
|
|
10
12
|
return fields
|
|
13
|
+
|
|
14
|
+
def _push_prepare_move_copy_values(self, move_to_copy, new_date):
|
|
15
|
+
values = super()._push_prepare_move_copy_values(move_to_copy, new_date)
|
|
16
|
+
values["restrict_lot_id"] = move_to_copy.restrict_lot_id.id
|
|
17
|
+
return values
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
This module
|
|
1
|
+
This module adds a field to restrict a stock move to a specific lot. It
|
|
2
2
|
propagates it between chained moves. A move with a restrict lot will
|
|
3
3
|
only be able to reserve or transfer products with the specified lot.
|
|
4
|
-
This module
|
|
4
|
+
This module serves as a basis for other modules, it has not effect on its own.
|
|
@@ -367,13 +367,14 @@ ul.auto-toc {
|
|
|
367
367
|
!! This file is generated by oca-gen-addon-readme !!
|
|
368
368
|
!! changes will be overwritten. !!
|
|
369
369
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
370
|
-
!! source digest: sha256:
|
|
370
|
+
!! source digest: sha256:dce023da3482003599a49ae27980bca635a30f0b86afd9ee1bcbeb8d3ae775d9
|
|
371
371
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
|
372
|
-
<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/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/stock-logistics-workflow/tree/
|
|
373
|
-
<p>This module
|
|
372
|
+
<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/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_restrict_lot"><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_restrict_lot"><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&target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
|
373
|
+
<p>This module adds a field to restrict a stock move to a specific lot. It
|
|
374
374
|
propagates it between chained moves. A move with a restrict lot will
|
|
375
375
|
only be able to reserve or transfer products with the specified lot.
|
|
376
|
-
This module
|
|
376
|
+
This module serves as a basis for other modules, it has not effect on
|
|
377
|
+
its own.</p>
|
|
377
378
|
<p><strong>Table of contents</strong></p>
|
|
378
379
|
<div class="contents local topic" id="contents">
|
|
379
380
|
<ul class="simple">
|
|
@@ -391,7 +392,7 @@ This module is a based for other modules, it has not effect on its own.</p>
|
|
|
391
392
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/issues">GitHub Issues</a>.
|
|
392
393
|
In case of trouble, please check there if your issue has already been reported.
|
|
393
394
|
If you spotted it first, help us to smash it by providing a detailed and welcomed
|
|
394
|
-
<a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_restrict_lot%0Aversion:%
|
|
395
|
+
<a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_restrict_lot%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
|
395
396
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
|
396
397
|
</div>
|
|
397
398
|
<div class="section" id="credits">
|
|
@@ -407,6 +408,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
|
|
407
408
|
<ul class="simple">
|
|
408
409
|
<li>Florian da Costa <<a class="reference external" href="mailto:florian.dacosta@akretion.com">florian.dacosta@akretion.com</a>></li>
|
|
409
410
|
<li>Ruchir Shukla <<a class="reference external" href="mailto:ruchir@bizzappdev.com">ruchir@bizzappdev.com</a>></li>
|
|
411
|
+
<li>Stefan Rijnhart <<a class="reference external" href="mailto:stefan@opener.amsterdam">stefan@opener.amsterdam</a>></li>
|
|
410
412
|
</ul>
|
|
411
413
|
</div>
|
|
412
414
|
<div class="section" id="maintainers">
|
|
@@ -420,7 +422,7 @@ mission is to support the collaborative development of Odoo features and
|
|
|
420
422
|
promote its widespread use.</p>
|
|
421
423
|
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
|
|
422
424
|
<p><a class="reference external image-reference" href="https://github.com/florian-dacosta"><img alt="florian-dacosta" src="https://github.com/florian-dacosta.png?size=40px" /></a></p>
|
|
423
|
-
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/tree/
|
|
425
|
+
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_restrict_lot">OCA/stock-logistics-workflow</a> project on GitHub.</p>
|
|
424
426
|
<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>
|
|
425
427
|
</div>
|
|
426
428
|
</div>
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
2
|
+
|
|
3
|
+
from odoo.exceptions import UserError, ValidationError
|
|
2
4
|
from odoo.tests.common import TransactionCase
|
|
3
5
|
|
|
4
6
|
|
|
@@ -12,6 +14,19 @@ class TestRestrictLot(TransactionCase):
|
|
|
12
14
|
cls.product.write({"tracking": "lot"})
|
|
13
15
|
cls.warehouse = cls.env.ref("stock.warehouse0")
|
|
14
16
|
cls.warehouse.write({"delivery_steps": "pick_ship"})
|
|
17
|
+
cls.stock_loc = cls.warehouse.lot_stock_id
|
|
18
|
+
|
|
19
|
+
# Set up a pull route from an external warehouse
|
|
20
|
+
cls.warehouse2 = cls.env["stock.warehouse"].create(
|
|
21
|
+
{"name": __name__, "code": "_WH2"}
|
|
22
|
+
)
|
|
23
|
+
cls.warehouse.resupply_wh_ids = cls.warehouse2
|
|
24
|
+
route = cls.env["stock.route"].search(
|
|
25
|
+
[("supplied_wh_id", "=", cls.warehouse.id)]
|
|
26
|
+
)
|
|
27
|
+
assert route
|
|
28
|
+
cls.product.route_ids = route
|
|
29
|
+
|
|
15
30
|
cls.lot = cls.env["stock.lot"].create(
|
|
16
31
|
{
|
|
17
32
|
"name": "lot1",
|
|
@@ -20,12 +35,56 @@ class TestRestrictLot(TransactionCase):
|
|
|
20
35
|
}
|
|
21
36
|
)
|
|
22
37
|
|
|
38
|
+
def _create_move_with_lot(self):
|
|
39
|
+
move = self.env["stock.move"].create(
|
|
40
|
+
{
|
|
41
|
+
"product_id": self.product.id,
|
|
42
|
+
"location_id": self.stock_loc.id,
|
|
43
|
+
"location_dest_id": self.output_loc.id,
|
|
44
|
+
"product_uom_qty": 1,
|
|
45
|
+
"product_uom": self.product.uom_id.id,
|
|
46
|
+
"name": "test",
|
|
47
|
+
"procure_method": "make_to_order",
|
|
48
|
+
"warehouse_id": self.warehouse.id,
|
|
49
|
+
"route_ids": [(6, 0, self.warehouse.delivery_route_id.ids)],
|
|
50
|
+
"restrict_lot_id": self.lot.id,
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
move._action_confirm()
|
|
54
|
+
move._action_assign()
|
|
55
|
+
new_lot = self.env["stock.lot"].create(
|
|
56
|
+
{
|
|
57
|
+
"name": "lot2",
|
|
58
|
+
"product_id": self.product.id,
|
|
59
|
+
"company_id": self.warehouse.company_id.id,
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
return move, new_lot
|
|
63
|
+
|
|
64
|
+
def _create_move_dest(self):
|
|
65
|
+
return self.env["stock.move"].create(
|
|
66
|
+
{
|
|
67
|
+
"product_id": self.product.id,
|
|
68
|
+
"location_id": self.customer_loc.id,
|
|
69
|
+
"product_uom_qty": 1,
|
|
70
|
+
"product_uom": self.product.uom_id.id,
|
|
71
|
+
"picking_type_id": self.warehouse.out_type_id.id,
|
|
72
|
+
"location_dest_id": self.output_loc.id,
|
|
73
|
+
"name": "test",
|
|
74
|
+
"procure_method": "make_to_order",
|
|
75
|
+
"warehouse_id": self.warehouse.id,
|
|
76
|
+
"route_ids": [(6, 0, self.warehouse.delivery_route_id.ids)],
|
|
77
|
+
"state": "waiting",
|
|
78
|
+
"restrict_lot_id": self.lot.id,
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
|
|
23
82
|
def test_00_move_restrict_lot_propagation(self):
|
|
24
83
|
move = self.env["stock.move"].create(
|
|
25
84
|
{
|
|
26
85
|
"product_id": self.product.id,
|
|
27
|
-
"location_id": self.
|
|
28
|
-
"location_dest_id": self.
|
|
86
|
+
"location_id": self.stock_loc.id,
|
|
87
|
+
"location_dest_id": self.output_loc.id,
|
|
29
88
|
"product_uom_qty": 1,
|
|
30
89
|
"product_uom": self.product.uom_id.id,
|
|
31
90
|
"name": "test",
|
|
@@ -43,8 +102,8 @@ class TestRestrictLot(TransactionCase):
|
|
|
43
102
|
move = self.env["stock.move"].create(
|
|
44
103
|
{
|
|
45
104
|
"product_id": self.product.id,
|
|
46
|
-
"location_id": self.
|
|
47
|
-
"location_dest_id": self.
|
|
105
|
+
"location_id": self.stock_loc.id,
|
|
106
|
+
"location_dest_id": self.output_loc.id,
|
|
48
107
|
"product_uom_qty": 2,
|
|
49
108
|
"product_uom": self.product.uom_id.id,
|
|
50
109
|
"name": "test",
|
|
@@ -114,19 +173,13 @@ class TestRestrictLot(TransactionCase):
|
|
|
114
173
|
"group_stock_multi_locations": True,
|
|
115
174
|
}
|
|
116
175
|
)
|
|
117
|
-
warehouse = self.env["stock.warehouse"].search(
|
|
118
|
-
[("company_id", "=", self.env.company.id)], limit=1
|
|
119
|
-
)
|
|
120
|
-
warehouse.delivery_steps = "pick_ship"
|
|
121
176
|
|
|
122
|
-
self.product.categ_id.route_ids |= self.
|
|
123
|
-
[("name", "ilike", "deliver in 2")]
|
|
124
|
-
)
|
|
177
|
+
self.product.categ_id.route_ids |= self.warehouse.delivery_route_id
|
|
125
178
|
location_1 = self.env["stock.location"].create(
|
|
126
|
-
{"name": "loc1", "location_id": warehouse.lot_stock_id.id}
|
|
179
|
+
{"name": "loc1", "location_id": self.warehouse.lot_stock_id.id}
|
|
127
180
|
)
|
|
128
181
|
location_2 = self.env["stock.location"].create(
|
|
129
|
-
{"name": "loc2", "location_id": warehouse.lot_stock_id.id}
|
|
182
|
+
{"name": "loc2", "location_id": self.warehouse.lot_stock_id.id}
|
|
130
183
|
)
|
|
131
184
|
|
|
132
185
|
# create goods in stock
|
|
@@ -185,9 +238,9 @@ class TestRestrictLot(TransactionCase):
|
|
|
185
238
|
self.assertEqual(concern_move.product_uom_qty, expect_qty)
|
|
186
239
|
|
|
187
240
|
def assert_move_line_per_lot_and_location(
|
|
188
|
-
|
|
241
|
+
move_lines, expect_lot, expect_from_location, expect_reserved_qty
|
|
189
242
|
):
|
|
190
|
-
concern_move_line =
|
|
243
|
+
concern_move_line = move_lines.filtered(
|
|
191
244
|
lambda mov: mov.lot_id == expect_lot
|
|
192
245
|
and mov.location_id == expect_from_location
|
|
193
246
|
)
|
|
@@ -196,23 +249,11 @@ class TestRestrictLot(TransactionCase):
|
|
|
196
249
|
concern_move_line.quantity_product_uom, expect_reserved_qty
|
|
197
250
|
)
|
|
198
251
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
)
|
|
202
|
-
self.assertEqual(len(pickings), 2)
|
|
203
|
-
delivery = pickings.filtered(
|
|
204
|
-
lambda pick: pick.picking_type_id.code == "outgoing"
|
|
205
|
-
)
|
|
206
|
-
pick = pickings.filtered(lambda pick: pick.picking_type_id.code == "internal")
|
|
207
|
-
|
|
208
|
-
self.assertEqual(delivery.state, "waiting")
|
|
209
|
-
self.assertEqual(len(delivery.move_ids_without_package), 2)
|
|
210
|
-
assert_move_qty_per_lot(delivery.move_ids_without_package, self.lot, 15)
|
|
211
|
-
assert_move_qty_per_lot(delivery.move_ids_without_package, lot2, 30)
|
|
212
|
-
|
|
213
|
-
pick.action_assign()
|
|
252
|
+
pick = procurement_group.stock_move_ids.picking_id
|
|
253
|
+
self.assertEqual(len(pick), 1)
|
|
254
|
+
self.assertEqual(pick.picking_type_id.code, "internal")
|
|
214
255
|
self.assertEqual(pick.state, "assigned")
|
|
215
|
-
self.assertEqual(len(pick.
|
|
256
|
+
self.assertEqual(len(pick.move_ids), 2)
|
|
216
257
|
assert_move_qty_per_lot(pick.move_ids_without_package, self.lot, 15)
|
|
217
258
|
assert_move_qty_per_lot(pick.move_ids_without_package, lot2, 30)
|
|
218
259
|
assert_move_line_per_lot_and_location(
|
|
@@ -227,17 +268,26 @@ class TestRestrictLot(TransactionCase):
|
|
|
227
268
|
assert_move_line_per_lot_and_location(
|
|
228
269
|
pick.move_line_ids_without_package, lot2, location_2, 25
|
|
229
270
|
)
|
|
271
|
+
pick.button_validate()
|
|
272
|
+
self.assertEqual(pick.state, "done")
|
|
273
|
+
|
|
274
|
+
delivery = procurement_group.stock_move_ids.picking_id - pick
|
|
275
|
+
self.assertEqual(delivery.picking_type_id.code, "outgoing")
|
|
276
|
+
self.assertEqual(delivery.state, "assigned")
|
|
277
|
+
|
|
278
|
+
assert_move_qty_per_lot(delivery.move_ids_without_package, self.lot, 15)
|
|
279
|
+
assert_move_qty_per_lot(delivery.move_ids_without_package, lot2, 30)
|
|
230
280
|
|
|
231
281
|
def test_compute_quantites(self):
|
|
232
282
|
move = self.env["stock.move"].create(
|
|
233
283
|
{
|
|
234
284
|
"product_id": self.product.id,
|
|
235
|
-
"location_id": self.
|
|
285
|
+
"location_id": self.stock_loc.id,
|
|
236
286
|
"location_dest_id": self.customer_loc.id,
|
|
237
287
|
"product_uom_qty": 1,
|
|
238
288
|
"product_uom": self.product.uom_id.id,
|
|
239
289
|
"name": "test",
|
|
240
|
-
"procure_method": "
|
|
290
|
+
"procure_method": "make_to_stock",
|
|
241
291
|
"warehouse_id": self.warehouse.id,
|
|
242
292
|
"route_ids": [(6, 0, self.warehouse.delivery_route_id.ids)],
|
|
243
293
|
"restrict_lot_id": self.lot.id,
|
|
@@ -252,6 +302,7 @@ class TestRestrictLot(TransactionCase):
|
|
|
252
302
|
|
|
253
303
|
product = move.product_id
|
|
254
304
|
self.assertEqual(product.outgoing_qty, 2)
|
|
305
|
+
|
|
255
306
|
product.invalidate_recordset()
|
|
256
307
|
product = product.with_context(lot_id=self.lot.id)
|
|
257
308
|
self.assertEqual(product.outgoing_qty, 1)
|
|
@@ -301,3 +352,41 @@ class TestRestrictLot(TransactionCase):
|
|
|
301
352
|
self.assertRaises(UserError, move._action_done)
|
|
302
353
|
move_line.lot_id = self.lot
|
|
303
354
|
move._action_done()
|
|
355
|
+
|
|
356
|
+
def test_restrict_lot_propagation_dest_moves(self):
|
|
357
|
+
move, new_lot = self._create_move_with_lot()
|
|
358
|
+
move_dest = self._create_move_dest()
|
|
359
|
+
move.move_dest_ids = [(4, move_dest.id)]
|
|
360
|
+
self.assertEqual(move_dest.restrict_lot_id, self.lot)
|
|
361
|
+
move.restrict_lot_id = new_lot.id
|
|
362
|
+
self.assertEqual(move_dest.restrict_lot_id, new_lot)
|
|
363
|
+
|
|
364
|
+
def test_restrict_lot_propagation_origin_moves(self):
|
|
365
|
+
move, new_lot = self._create_move_with_lot()
|
|
366
|
+
orig_move = move.move_orig_ids
|
|
367
|
+
self.assertEqual(orig_move.restrict_lot_id, self.lot)
|
|
368
|
+
move.restrict_lot_id = new_lot.id
|
|
369
|
+
self.assertEqual(orig_move.restrict_lot_id, new_lot)
|
|
370
|
+
|
|
371
|
+
def test_restrict_lot_propagation_origin_and_dest_moves(self):
|
|
372
|
+
move, new_lot = self._create_move_with_lot()
|
|
373
|
+
move_dest = self._create_move_dest()
|
|
374
|
+
move.move_dest_ids = [(4, move_dest.id)]
|
|
375
|
+
orig_move = move.move_orig_ids
|
|
376
|
+
self.assertEqual(move_dest.restrict_lot_id, self.lot)
|
|
377
|
+
self.assertEqual(orig_move.restrict_lot_id, self.lot)
|
|
378
|
+
move.restrict_lot_id = new_lot.id
|
|
379
|
+
self.assertEqual(orig_move.restrict_lot_id, new_lot)
|
|
380
|
+
self.assertEqual(move_dest.restrict_lot_id, new_lot)
|
|
381
|
+
|
|
382
|
+
def test_restrict_lot_no_propagation_error(self):
|
|
383
|
+
move, new_lot = self._create_move_with_lot()
|
|
384
|
+
orig_move = move.move_orig_ids
|
|
385
|
+
orig_move._action_assign()
|
|
386
|
+
orig_move.quantity = orig_move.product_uom_qty
|
|
387
|
+
orig_move.picked = True
|
|
388
|
+
orig_move._action_done()
|
|
389
|
+
self.assertEqual(orig_move.state, "done")
|
|
390
|
+
with self.assertRaises(ValidationError) as m:
|
|
391
|
+
move.restrict_lot_id = new_lot.id
|
|
392
|
+
self.assertIn("You can't modify the Lot/Serial number", m.exception.args[0])
|
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="utf-8" ?>
|
|
2
2
|
<odoo>
|
|
3
|
-
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<field name="
|
|
8
|
-
<field
|
|
9
|
-
<field
|
|
3
|
+
<record id="stock_move_pick_tree_view" model="ir.ui.view">
|
|
4
|
+
<field name="model">stock.move</field>
|
|
5
|
+
<field name="inherit_id" ref="stock.view_picking_move_tree" />
|
|
6
|
+
<field name="arch" type="xml">
|
|
7
|
+
<field name="product_id" position="after">
|
|
8
|
+
<field
|
|
10
9
|
name="restrict_lot_id"
|
|
11
10
|
readonly="1"
|
|
12
11
|
optional="show"
|
|
13
12
|
groups="stock.group_production_lot"
|
|
14
13
|
/>
|
|
15
|
-
</field>
|
|
16
14
|
</field>
|
|
17
|
-
</
|
|
15
|
+
</field>
|
|
16
|
+
</record>
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
<record id="stock_move_tree_view" model="ir.ui.view">
|
|
19
|
+
<field name="model">stock.move</field>
|
|
20
|
+
<field name="inherit_id" ref="stock.view_move_tree" />
|
|
21
|
+
<field name="arch" type="xml">
|
|
22
|
+
<field name="product_id" position="after">
|
|
23
|
+
<field
|
|
25
24
|
name="restrict_lot_id"
|
|
26
25
|
readonly="1"
|
|
27
26
|
optional="show"
|
|
28
27
|
groups="stock.group_production_lot"
|
|
29
28
|
/>
|
|
30
|
-
</field>
|
|
31
29
|
</field>
|
|
32
|
-
</
|
|
33
|
-
|
|
30
|
+
</field>
|
|
31
|
+
</record>
|
|
34
32
|
</odoo>
|
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="utf-8" ?>
|
|
2
2
|
<odoo>
|
|
3
|
-
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
expr="//field[@name='move_ids_without_package']/tree/field[@name='product_id']"
|
|
3
|
+
<record id="custom_main_stock_picking_form_view" model="ir.ui.view">
|
|
4
|
+
<field name="model">stock.picking</field>
|
|
5
|
+
<field name="inherit_id" ref="stock.view_picking_form" />
|
|
6
|
+
<field name="arch" type="xml">
|
|
7
|
+
<xpath
|
|
8
|
+
expr="//field[@name='move_ids_without_package']/list/field[@name='product_id']"
|
|
10
9
|
position="after"
|
|
11
10
|
>
|
|
12
|
-
|
|
11
|
+
<field
|
|
13
12
|
name="restrict_lot_id"
|
|
14
13
|
readonly="1"
|
|
15
14
|
optional="show"
|
|
16
15
|
groups="stock.group_production_lot"
|
|
17
16
|
/>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
</xpath>
|
|
18
|
+
</field>
|
|
19
|
+
</record>
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
<record id="custom_stock_picking_search_view" model="ir.ui.view">
|
|
22
|
+
<field name="model">stock.picking</field>
|
|
23
|
+
<field name="inherit_id" ref="stock.view_picking_internal_search" />
|
|
24
|
+
<field name="arch" type="xml">
|
|
25
|
+
<field name="product_id" position="after">
|
|
26
|
+
<field
|
|
28
27
|
name="restrict_lot_id"
|
|
29
28
|
string="Lot"
|
|
30
29
|
groups="stock.group_production_lot"
|
|
31
30
|
/>
|
|
32
|
-
</field>
|
|
33
31
|
</field>
|
|
34
|
-
</
|
|
35
|
-
|
|
32
|
+
</field>
|
|
33
|
+
</record>
|
|
36
34
|
</odoo>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: odoo-addon-stock_restrict_lot
|
|
3
|
-
Version:
|
|
3
|
+
Version: 18.0.1.0.0.3
|
|
4
4
|
Requires-Python: >=3.10
|
|
5
|
-
Requires-Dist: odoo
|
|
5
|
+
Requires-Dist: odoo==18.0.*
|
|
6
6
|
Summary: Base module that add back the concept of restrict lot on stock move
|
|
7
7
|
Home-page: https://github.com/OCA/stock-logistics-workflow
|
|
8
8
|
License: LGPL-3
|
|
@@ -10,7 +10,7 @@ Author: Akretion, Odoo Community Association (OCA)
|
|
|
10
10
|
Author-email: support@odoo-community.org
|
|
11
11
|
Classifier: Programming Language :: Python
|
|
12
12
|
Classifier: Framework :: Odoo
|
|
13
|
-
Classifier: Framework :: Odoo ::
|
|
13
|
+
Classifier: Framework :: Odoo :: 18.0
|
|
14
14
|
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
|
|
15
15
|
|
|
16
16
|
==================
|
|
@@ -22,7 +22,7 @@ Stock Restrict Lot
|
|
|
22
22
|
!! This file is generated by oca-gen-addon-readme !!
|
|
23
23
|
!! changes will be overwritten. !!
|
|
24
24
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
25
|
-
!! source digest: sha256:
|
|
25
|
+
!! source digest: sha256:dce023da3482003599a49ae27980bca635a30f0b86afd9ee1bcbeb8d3ae775d9
|
|
26
26
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
27
27
|
|
|
28
28
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
|
@@ -32,21 +32,22 @@ Stock Restrict Lot
|
|
|
32
32
|
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
|
|
33
33
|
:alt: License: LGPL-3
|
|
34
34
|
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--workflow-lightgray.png?logo=github
|
|
35
|
-
:target: https://github.com/OCA/stock-logistics-workflow/tree/
|
|
35
|
+
:target: https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_restrict_lot
|
|
36
36
|
:alt: OCA/stock-logistics-workflow
|
|
37
37
|
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
|
38
|
-
:target: https://translation.odoo-community.org/projects/stock-logistics-workflow-
|
|
38
|
+
:target: https://translation.odoo-community.org/projects/stock-logistics-workflow-18-0/stock-logistics-workflow-18-0-stock_restrict_lot
|
|
39
39
|
:alt: Translate me on Weblate
|
|
40
40
|
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
|
|
41
|
-
:target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&target_branch=
|
|
41
|
+
:target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&target_branch=18.0
|
|
42
42
|
:alt: Try me on Runboat
|
|
43
43
|
|
|
44
44
|
|badge1| |badge2| |badge3| |badge4| |badge5|
|
|
45
45
|
|
|
46
|
-
This module
|
|
46
|
+
This module adds a field to restrict a stock move to a specific lot. It
|
|
47
47
|
propagates it between chained moves. A move with a restrict lot will
|
|
48
48
|
only be able to reserve or transfer products with the specified lot.
|
|
49
|
-
This module
|
|
49
|
+
This module serves as a basis for other modules, it has not effect on
|
|
50
|
+
its own.
|
|
50
51
|
|
|
51
52
|
**Table of contents**
|
|
52
53
|
|
|
@@ -59,7 +60,7 @@ Bug Tracker
|
|
|
59
60
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-workflow/issues>`_.
|
|
60
61
|
In case of trouble, please check there if your issue has already been reported.
|
|
61
62
|
If you spotted it first, help us to smash it by providing a detailed and welcomed
|
|
62
|
-
`feedback <https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_restrict_lot%0Aversion:%
|
|
63
|
+
`feedback <https://github.com/OCA/stock-logistics-workflow/issues/new?body=module:%20stock_restrict_lot%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
|
63
64
|
|
|
64
65
|
Do not contact contributors directly about support or help with technical issues.
|
|
65
66
|
|
|
@@ -76,6 +77,7 @@ Contributors
|
|
|
76
77
|
|
|
77
78
|
- Florian da Costa <florian.dacosta@akretion.com>
|
|
78
79
|
- Ruchir Shukla <ruchir@bizzappdev.com>
|
|
80
|
+
- Stefan Rijnhart <stefan@opener.amsterdam>
|
|
79
81
|
|
|
80
82
|
Maintainers
|
|
81
83
|
-----------
|
|
@@ -98,6 +100,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|
|
|
98
100
|
|
|
99
101
|
|maintainer-florian-dacosta|
|
|
100
102
|
|
|
101
|
-
This module is part of the `OCA/stock-logistics-workflow <https://github.com/OCA/stock-logistics-workflow/tree/
|
|
103
|
+
This module is part of the `OCA/stock-logistics-workflow <https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_restrict_lot>`_ project on GitHub.
|
|
102
104
|
|
|
103
105
|
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
odoo/addons/stock_restrict_lot/README.rst,sha256=L2SAcstft-Wa3ddB34vTd_FMymPvLd-4613euD878Io,3546
|
|
2
|
+
odoo/addons/stock_restrict_lot/__init__.py,sha256=X9EJGOE2GtZbS0G82PtSXmWSZ_R8jEM0rlJTDliQjp4,21
|
|
3
|
+
odoo/addons/stock_restrict_lot/__manifest__.py,sha256=6oKtIpnmhsXQrb7b20kBYGwETT876fKB06zpShsVghA,576
|
|
4
|
+
odoo/addons/stock_restrict_lot/i18n/es.po,sha256=lXZi8UnhBuVOh-qMlsI7EUFxDh2rFQ0ILxEjpPNI5p8,2293
|
|
5
|
+
odoo/addons/stock_restrict_lot/i18n/hr.po,sha256=JjVJrSRB8AIJMrjgZXCNbZ_DXh9N_erc37v7uQympbw,2336
|
|
6
|
+
odoo/addons/stock_restrict_lot/i18n/it.po,sha256=argyX806jq2nJSCg5tUGwLCRXnqD2kDnfsJx0W35p2o,2439
|
|
7
|
+
odoo/addons/stock_restrict_lot/i18n/stock_restrict_lot.pot,sha256=nvOiQgDpfOhBpgOFZVbVfgjs12txTi-2BjnxUph6s_k,1954
|
|
8
|
+
odoo/addons/stock_restrict_lot/models/__init__.py,sha256=3nhRO6ipFBMbcrlWXMEMR62djB3_7q2TxcUM42xYMGg,108
|
|
9
|
+
odoo/addons/stock_restrict_lot/models/product_product.py,sha256=sv-ZLxXqmf6UX4MII1lX7s1BsRgyiKOD_wDpo993KmU,888
|
|
10
|
+
odoo/addons/stock_restrict_lot/models/stock_move.py,sha256=lXtBPTeuVdu1WYWUuIONn7iCWk5FZtcuzYP9T594neo,5802
|
|
11
|
+
odoo/addons/stock_restrict_lot/models/stock_picking.py,sha256=0l60llnOb3tnmk-3pNF21kP1aR8vO0qu5BbbeqD3T6A,417
|
|
12
|
+
odoo/addons/stock_restrict_lot/models/stock_rule.py,sha256=1oOOLWBEC-inoLWHqhDxxH0Q9XXsInasxbIMLmYjQ5E,547
|
|
13
|
+
odoo/addons/stock_restrict_lot/readme/CONTRIBUTORS.md,sha256=Yzf9SONTbOQxjFZA7UFGibcNzh3pOkl5ZkBgHifmQvc,146
|
|
14
|
+
odoo/addons/stock_restrict_lot/readme/DESCRIPTION.md,sha256=jYTY5vmrg7LmJCnnJ2qwOpIVuvEaOepvYGAFy0vdlBA,289
|
|
15
|
+
odoo/addons/stock_restrict_lot/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
|
|
16
|
+
odoo/addons/stock_restrict_lot/static/description/index.html,sha256=21V4T7wSjIshHFjANDH5MbOiozLaaoYXX329MjvfICo,13078
|
|
17
|
+
odoo/addons/stock_restrict_lot/tests/__init__.py,sha256=5RimjaqBd8kD55SNoLqh-g9sCmmI28hPx7IQMUX6AOQ,32
|
|
18
|
+
odoo/addons/stock_restrict_lot/tests/test_restrict_lot.py,sha256=k-tOml6ti2jDKBh3SLJ-Ow-fKoHTTPNplSjWqa-b4Ws,15501
|
|
19
|
+
odoo/addons/stock_restrict_lot/views/stock_move_views.xml,sha256=w4zzez4f9fK-drmjnUh61ZZP4vyW_vM4ki4XcHPnFEA,1117
|
|
20
|
+
odoo/addons/stock_restrict_lot/views/stock_picking.xml,sha256=s6ONtCnjx151Ob_BOyQ4BvkTs98xqcv7QoysZb8WQ3c,1225
|
|
21
|
+
odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info/METADATA,sha256=AltRfT_ZumkU-g30f1lrKaqQIKbeTp7jXdzYuAIEQXE,4119
|
|
22
|
+
odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info/WHEEL,sha256=9fEMia4zL7ZuZbnCOrcYogUhmn4XFIVaJ8G4YGI31xc,81
|
|
23
|
+
odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
|
|
24
|
+
odoo_addon_stock_restrict_lot-18.0.1.0.0.3.dist-info/RECORD,,
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
odoo/addons/stock_restrict_lot/README.rst,sha256=Uwtmnu81Mfm4GKr9TzinHgi-RxMK29KElFRIm4aJn0A,3494
|
|
2
|
-
odoo/addons/stock_restrict_lot/__init__.py,sha256=X9EJGOE2GtZbS0G82PtSXmWSZ_R8jEM0rlJTDliQjp4,21
|
|
3
|
-
odoo/addons/stock_restrict_lot/__manifest__.py,sha256=e8vxS0eq3NQLC_rDTMsNCwh2BNzCMV3ZMJVHsonP2s4,506
|
|
4
|
-
odoo/addons/stock_restrict_lot/i18n/es.po,sha256=UKHL4vKheMhf0x2mZ_KwUmtjbwiCXnt-UJMeM82FwUs,2068
|
|
5
|
-
odoo/addons/stock_restrict_lot/i18n/hr.po,sha256=YTZunKeyiqSlJhW2cMSi2dQ8jzrrFXk1gDCyPvl847Y,2111
|
|
6
|
-
odoo/addons/stock_restrict_lot/i18n/it.po,sha256=p1GuTRBBNwL-2A5I00vhVf_9vekVVFpMBTOSishnong,2214
|
|
7
|
-
odoo/addons/stock_restrict_lot/i18n/stock_restrict_lot.pot,sha256=AhJ4X9RXaEtapVvWPhQk3dHKAIADrVe5fT6Z8mBkpGY,1729
|
|
8
|
-
odoo/addons/stock_restrict_lot/models/__init__.py,sha256=3nhRO6ipFBMbcrlWXMEMR62djB3_7q2TxcUM42xYMGg,108
|
|
9
|
-
odoo/addons/stock_restrict_lot/models/product_product.py,sha256=sv-ZLxXqmf6UX4MII1lX7s1BsRgyiKOD_wDpo993KmU,888
|
|
10
|
-
odoo/addons/stock_restrict_lot/models/stock_move.py,sha256=stXDy4srK6L2qTNQ6bHfoO24v3ZdmgGCJeq8RBvKxi8,4047
|
|
11
|
-
odoo/addons/stock_restrict_lot/models/stock_picking.py,sha256=TrMC6cSDlvCNMyRE1fRzFVbA7wYxhdTUbUBpqqLF21E,417
|
|
12
|
-
odoo/addons/stock_restrict_lot/models/stock_rule.py,sha256=NXXjB8rooKS0kpG3zvqpDDpLkmh7mvbnHLItDwdCec0,236
|
|
13
|
-
odoo/addons/stock_restrict_lot/readme/CONTRIBUTORS.md,sha256=JBjjiC74D-iWs-cRLAY7BTnLuOA83Nh0fCtABQTadHs,98
|
|
14
|
-
odoo/addons/stock_restrict_lot/readme/DESCRIPTION.md,sha256=5PwOcvRp7HF_bK6A2P20xcbXvvFZaCj6BYY7moybpO4,281
|
|
15
|
-
odoo/addons/stock_restrict_lot/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
|
|
16
|
-
odoo/addons/stock_restrict_lot/static/description/index.html,sha256=4SRSfL6SfV_ayMvIxaeEPWoFk1hl-JBcVWvjHapWkoY,12933
|
|
17
|
-
odoo/addons/stock_restrict_lot/tests/__init__.py,sha256=5RimjaqBd8kD55SNoLqh-g9sCmmI28hPx7IQMUX6AOQ,32
|
|
18
|
-
odoo/addons/stock_restrict_lot/tests/test_restrict_lot.py,sha256=owgtecTTqC_yXKIyq-gpjq5EAwiDjFeSEadUEOA2d0M,11847
|
|
19
|
-
odoo/addons/stock_restrict_lot/views/stock_move_views.xml,sha256=unNYn0AuYyBhxSnnPN6xf6X7J7S-G1KbXJVYF20scA4,1191
|
|
20
|
-
odoo/addons/stock_restrict_lot/views/stock_picking.xml,sha256=X1N9S5g09NREC_DJAlM1CjZuV21nJgBxTANn_6kC64o,1299
|
|
21
|
-
odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info/METADATA,sha256=--MeGIl0Pdq_q0V82PEqX3BlZU_mDhkwqO4JPpv8XUY,4073
|
|
22
|
-
odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info/WHEEL,sha256=9fEMia4zL7ZuZbnCOrcYogUhmn4XFIVaJ8G4YGI31xc,81
|
|
23
|
-
odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
|
|
24
|
-
odoo_addon_stock_restrict_lot-17.0.1.2.1.dist-info/RECORD,,
|
|
File without changes
|