odoo-addon-shopfloor 16.0.1.0.0.24__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.
- odoo/addons/shopfloor/README.rst +160 -0
- odoo/addons/shopfloor/__init__.py +4 -0
- odoo/addons/shopfloor/__manifest__.py +65 -0
- odoo/addons/shopfloor/actions/__init__.py +15 -0
- odoo/addons/shopfloor/actions/change_package_lot.py +164 -0
- odoo/addons/shopfloor/actions/completion_info.py +42 -0
- odoo/addons/shopfloor/actions/data.py +329 -0
- odoo/addons/shopfloor/actions/data_detail.py +154 -0
- odoo/addons/shopfloor/actions/inventory.py +150 -0
- odoo/addons/shopfloor/actions/location_content_transfer_sorter.py +89 -0
- odoo/addons/shopfloor/actions/message.py +846 -0
- odoo/addons/shopfloor/actions/move_line_search.py +119 -0
- odoo/addons/shopfloor/actions/packaging.py +59 -0
- odoo/addons/shopfloor/actions/savepoint.py +44 -0
- odoo/addons/shopfloor/actions/schema.py +182 -0
- odoo/addons/shopfloor/actions/schema_detail.py +98 -0
- odoo/addons/shopfloor/actions/search.py +187 -0
- odoo/addons/shopfloor/actions/stock.py +239 -0
- odoo/addons/shopfloor/actions/stock_unreserve.py +66 -0
- odoo/addons/shopfloor/components/__init__.py +5 -0
- odoo/addons/shopfloor/components/scan_handler_location.py +26 -0
- odoo/addons/shopfloor/components/scan_handler_lot.py +26 -0
- odoo/addons/shopfloor/components/scan_handler_package.py +26 -0
- odoo/addons/shopfloor/components/scan_handler_product.py +26 -0
- odoo/addons/shopfloor/components/scan_handler_transfer.py +26 -0
- odoo/addons/shopfloor/data/shopfloor_scenario_data.xml +73 -0
- odoo/addons/shopfloor/demo/shopfloor_app_demo.xml +12 -0
- odoo/addons/shopfloor/demo/shopfloor_menu_demo.xml +64 -0
- odoo/addons/shopfloor/demo/shopfloor_profile_demo.xml +8 -0
- odoo/addons/shopfloor/demo/stock_picking_type_demo.xml +93 -0
- odoo/addons/shopfloor/docs/checkout_diag_seq.plantuml +61 -0
- odoo/addons/shopfloor/docs/checkout_diag_seq.png +0 -0
- odoo/addons/shopfloor/docs/cluster_picking_diag_seq.plantuml +112 -0
- odoo/addons/shopfloor/docs/cluster_picking_diag_seq.png +0 -0
- odoo/addons/shopfloor/docs/delivery_diag_seq.plantuml +56 -0
- odoo/addons/shopfloor/docs/delivery_diag_seq.png +0 -0
- odoo/addons/shopfloor/docs/location_content_transfer_diag_seq.plantuml +66 -0
- odoo/addons/shopfloor/docs/location_content_transfer_diag_seq.png +0 -0
- odoo/addons/shopfloor/docs/oca_logo.png +0 -0
- odoo/addons/shopfloor/docs/single_pack_transfer_diag_seq.plantuml +36 -0
- odoo/addons/shopfloor/docs/single_pack_transfer_diag_seq.png +0 -0
- odoo/addons/shopfloor/docs/zone_picking_diag_seq.plantuml +85 -0
- odoo/addons/shopfloor/docs/zone_picking_diag_seq.png +0 -0
- odoo/addons/shopfloor/exceptions.py +6 -0
- odoo/addons/shopfloor/i18n/ca.po +1802 -0
- odoo/addons/shopfloor/i18n/de.po +1791 -0
- odoo/addons/shopfloor/i18n/es_AR.po +2147 -0
- odoo/addons/shopfloor/i18n/pt_BR.po +1791 -0
- odoo/addons/shopfloor/i18n/shopfloor.pot +1877 -0
- odoo/addons/shopfloor/models/__init__.py +12 -0
- odoo/addons/shopfloor/models/priority_postpone_mixin.py +41 -0
- odoo/addons/shopfloor/models/shopfloor_app.py +9 -0
- odoo/addons/shopfloor/models/shopfloor_menu.py +436 -0
- odoo/addons/shopfloor/models/stock_location.py +76 -0
- odoo/addons/shopfloor/models/stock_move.py +119 -0
- odoo/addons/shopfloor/models/stock_move_line.py +307 -0
- odoo/addons/shopfloor/models/stock_package_level.py +50 -0
- odoo/addons/shopfloor/models/stock_picking.py +118 -0
- odoo/addons/shopfloor/models/stock_picking_batch.py +41 -0
- odoo/addons/shopfloor/models/stock_picking_type.py +26 -0
- odoo/addons/shopfloor/models/stock_quant.py +31 -0
- odoo/addons/shopfloor/models/stock_quant_package.py +101 -0
- odoo/addons/shopfloor/readme/CONTRIBUTORS.rst +18 -0
- odoo/addons/shopfloor/readme/CREDITS.rst +5 -0
- odoo/addons/shopfloor/readme/DESCRIPTION.rst +17 -0
- odoo/addons/shopfloor/readme/HISTORY.rst +4 -0
- odoo/addons/shopfloor/readme/ROADMAP.rst +4 -0
- odoo/addons/shopfloor/readme/USAGE.rst +6 -0
- odoo/addons/shopfloor/security/groups.xml +17 -0
- odoo/addons/shopfloor/services/__init__.py +16 -0
- odoo/addons/shopfloor/services/checkout.py +1763 -0
- odoo/addons/shopfloor/services/cluster_picking.py +1628 -0
- odoo/addons/shopfloor/services/delivery.py +828 -0
- odoo/addons/shopfloor/services/forms/__init__.py +1 -0
- odoo/addons/shopfloor/services/forms/picking_form.py +78 -0
- odoo/addons/shopfloor/services/location_content_transfer.py +1194 -0
- odoo/addons/shopfloor/services/menu.py +60 -0
- odoo/addons/shopfloor/services/picking_batch.py +126 -0
- odoo/addons/shopfloor/services/service.py +101 -0
- odoo/addons/shopfloor/services/single_pack_transfer.py +366 -0
- odoo/addons/shopfloor/services/zone_picking.py +1938 -0
- odoo/addons/shopfloor/static/description/icon.png +0 -0
- odoo/addons/shopfloor/static/description/index.html +500 -0
- odoo/addons/shopfloor/tests/__init__.py +83 -0
- odoo/addons/shopfloor/tests/common.py +324 -0
- odoo/addons/shopfloor/tests/models.py +29 -0
- odoo/addons/shopfloor/tests/test_actions_change_package_lot.py +1175 -0
- odoo/addons/shopfloor/tests/test_actions_data.py +376 -0
- odoo/addons/shopfloor/tests/test_actions_data_base.py +244 -0
- odoo/addons/shopfloor/tests/test_actions_data_detail.py +322 -0
- odoo/addons/shopfloor/tests/test_actions_search.py +248 -0
- odoo/addons/shopfloor/tests/test_actions_stock.py +48 -0
- odoo/addons/shopfloor/tests/test_checkout_auto_post.py +67 -0
- odoo/addons/shopfloor/tests/test_checkout_base.py +81 -0
- odoo/addons/shopfloor/tests/test_checkout_cancel_line.py +154 -0
- odoo/addons/shopfloor/tests/test_checkout_change_packaging.py +184 -0
- odoo/addons/shopfloor/tests/test_checkout_done.py +133 -0
- odoo/addons/shopfloor/tests/test_checkout_list_delivery_packaging.py +131 -0
- odoo/addons/shopfloor/tests/test_checkout_list_package.py +327 -0
- odoo/addons/shopfloor/tests/test_checkout_new_package.py +88 -0
- odoo/addons/shopfloor/tests/test_checkout_no_package.py +95 -0
- odoo/addons/shopfloor/tests/test_checkout_scan.py +174 -0
- odoo/addons/shopfloor/tests/test_checkout_scan_line.py +377 -0
- odoo/addons/shopfloor/tests/test_checkout_scan_line_base.py +25 -0
- odoo/addons/shopfloor/tests/test_checkout_scan_line_no_prefill_qty.py +91 -0
- odoo/addons/shopfloor/tests/test_checkout_scan_package_action.py +451 -0
- odoo/addons/shopfloor/tests/test_checkout_scan_package_action_no_prefill_qty.py +107 -0
- odoo/addons/shopfloor/tests/test_checkout_select.py +74 -0
- odoo/addons/shopfloor/tests/test_checkout_select_line.py +130 -0
- odoo/addons/shopfloor/tests/test_checkout_select_package_base.py +64 -0
- odoo/addons/shopfloor/tests/test_checkout_set_qty.py +257 -0
- odoo/addons/shopfloor/tests/test_checkout_summary.py +69 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_base.py +83 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_batch.py +109 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_change_pack_lot.py +111 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_is_zero.py +98 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination.py +376 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination_no_prefill_qty.py +115 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_line.py +402 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_location_or_pack_first.py +114 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_no_prefill_qty.py +70 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_select.py +387 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_skip.py +90 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_stock_issue.py +364 -0
- odoo/addons/shopfloor/tests/test_cluster_picking_unload.py +911 -0
- odoo/addons/shopfloor/tests/test_delivery_base.py +155 -0
- odoo/addons/shopfloor/tests/test_delivery_done.py +108 -0
- odoo/addons/shopfloor/tests/test_delivery_list_stock_picking.py +49 -0
- odoo/addons/shopfloor/tests/test_delivery_reset_qty_done_line.py +119 -0
- odoo/addons/shopfloor/tests/test_delivery_reset_qty_done_pack.py +107 -0
- odoo/addons/shopfloor/tests/test_delivery_scan_deliver.py +557 -0
- odoo/addons/shopfloor/tests/test_delivery_select.py +38 -0
- odoo/addons/shopfloor/tests/test_delivery_set_qty_done_line.py +91 -0
- odoo/addons/shopfloor/tests/test_delivery_set_qty_done_pack.py +135 -0
- odoo/addons/shopfloor/tests/test_delivery_sublocation.py +180 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_base.py +136 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_get_work.py +125 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_mix.py +509 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_putaway.py +143 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_scan_location.py +34 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_set_destination_all.py +343 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_set_destination_package_or_line.py +1074 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_single.py +748 -0
- odoo/addons/shopfloor/tests/test_location_content_transfer_start.py +359 -0
- odoo/addons/shopfloor/tests/test_menu_base.py +261 -0
- odoo/addons/shopfloor/tests/test_menu_counters.py +61 -0
- odoo/addons/shopfloor/tests/test_misc.py +25 -0
- odoo/addons/shopfloor/tests/test_move_action_assign.py +87 -0
- odoo/addons/shopfloor/tests/test_openapi.py +21 -0
- odoo/addons/shopfloor/tests/test_picking_form.py +62 -0
- odoo/addons/shopfloor/tests/test_scan_anything.py +49 -0
- odoo/addons/shopfloor/tests/test_single_pack_transfer.py +1121 -0
- odoo/addons/shopfloor/tests/test_single_pack_transfer_base.py +32 -0
- odoo/addons/shopfloor/tests/test_single_pack_transfer_putaway.py +104 -0
- odoo/addons/shopfloor/tests/test_stock_split.py +204 -0
- odoo/addons/shopfloor/tests/test_user.py +42 -0
- odoo/addons/shopfloor/tests/test_zone_picking_base.py +608 -0
- odoo/addons/shopfloor/tests/test_zone_picking_change_pack_lot.py +140 -0
- odoo/addons/shopfloor/tests/test_zone_picking_select_line.py +723 -0
- odoo/addons/shopfloor/tests/test_zone_picking_select_line_first_scan_location.py +207 -0
- odoo/addons/shopfloor/tests/test_zone_picking_select_line_first_scan_location.py.bak +202 -0
- odoo/addons/shopfloor/tests/test_zone_picking_select_line_no_prefill_qty.py +107 -0
- odoo/addons/shopfloor/tests/test_zone_picking_select_picking_type.py +26 -0
- odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination.py +643 -0
- odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination_no_prefill_qty.py +146 -0
- odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination_pick_pack.py +241 -0
- odoo/addons/shopfloor/tests/test_zone_picking_start.py +206 -0
- odoo/addons/shopfloor/tests/test_zone_picking_stock_issue.py +121 -0
- odoo/addons/shopfloor/tests/test_zone_picking_unload_all.py +353 -0
- odoo/addons/shopfloor/tests/test_zone_picking_unload_buffer_lines.py +113 -0
- odoo/addons/shopfloor/tests/test_zone_picking_unload_set_destination.py +374 -0
- odoo/addons/shopfloor/tests/test_zone_picking_unload_single.py +123 -0
- odoo/addons/shopfloor/tests/test_zone_picking_zero_check.py +43 -0
- odoo/addons/shopfloor/utils.py +13 -0
- odoo/addons/shopfloor/views/shopfloor_menu.xml +167 -0
- odoo/addons/shopfloor/views/stock_location.xml +20 -0
- odoo/addons/shopfloor/views/stock_move_line.xml +52 -0
- odoo/addons/shopfloor/views/stock_picking_type.xml +19 -0
- odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/METADATA +192 -0
- odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/RECORD +182 -0
- odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/WHEEL +5 -0
- odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/top_level.txt +1 -0
@@ -0,0 +1,160 @@
|
|
1
|
+
=========
|
2
|
+
Shopfloor
|
3
|
+
=========
|
4
|
+
|
5
|
+
..
|
6
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
7
|
+
!! This file is generated by oca-gen-addon-readme !!
|
8
|
+
!! changes will be overwritten. !!
|
9
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
10
|
+
!! source digest: sha256:993547f893f6715d97989e36897fae01ba59faacf8a2a9f66f202d3130bba967
|
11
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
12
|
+
|
13
|
+
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
14
|
+
:target: https://odoo-community.org/page/development-status
|
15
|
+
:alt: Beta
|
16
|
+
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
17
|
+
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
18
|
+
:alt: License: AGPL-3
|
19
|
+
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fwms-lightgray.png?logo=github
|
20
|
+
:target: https://github.com/OCA/wms/tree/16.0/shopfloor
|
21
|
+
:alt: OCA/wms
|
22
|
+
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
23
|
+
:target: https://translation.odoo-community.org/projects/wms-16-0/wms-16-0-shopfloor
|
24
|
+
:alt: Translate me on Weblate
|
25
|
+
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
|
26
|
+
:target: https://runboat.odoo-community.org/builds?repo=OCA/wms&target_branch=16.0
|
27
|
+
:alt: Try me on Runboat
|
28
|
+
|
29
|
+
|badge1| |badge2| |badge3| |badge4| |badge5|
|
30
|
+
|
31
|
+
Shopfloor is a barcode scanner application for internal warehouse operations.
|
32
|
+
|
33
|
+
The application supports scenarios, to relate to Operation Types:
|
34
|
+
|
35
|
+
* Cluster Picking
|
36
|
+
* Zone Picking
|
37
|
+
* Checkout/Packing
|
38
|
+
* Delivery
|
39
|
+
* Location Content Transfer
|
40
|
+
* Single Pack Transfer
|
41
|
+
|
42
|
+
This module provides REST APIs to support the scenarios. It needs a frontend
|
43
|
+
to consume the backend APIs and provide screens for users on barcode devices.
|
44
|
+
A default front-end application is provided by ``shopfloor_mobile``.
|
45
|
+
|
46
|
+
| Note: if you want to enable a new scenario on an existing application, you must trigger the registry sync on the shopfloor.app in a post_init_hook or a post-migrate script.
|
47
|
+
| See an example `here <https://github.com/OCA/wms/pull/520/commits/bccdfd445a9bc943998c4848f183a076e8459a98>`_.
|
48
|
+
|
49
|
+
**Table of contents**
|
50
|
+
|
51
|
+
.. contents::
|
52
|
+
:local:
|
53
|
+
|
54
|
+
Usage
|
55
|
+
=====
|
56
|
+
|
57
|
+
An API key is created in the Demo data (for development), using
|
58
|
+
the Demo user. The key to use in the HTTP header ``API-KEY`` is: 72B044F7AC780DAC
|
59
|
+
|
60
|
+
Curl example::
|
61
|
+
|
62
|
+
curl -X POST "http://localhost:8069/shopfloor/user/menu" -H "accept: */*" -H "Content-Type: application/json" -H "API-KEY: 72B044F7AC780DAC"
|
63
|
+
|
64
|
+
Known issues / Roadmap
|
65
|
+
======================
|
66
|
+
|
67
|
+
* improve documentation
|
68
|
+
* split out scenario components to their own modules
|
69
|
+
* maybe split common stock features to `shopfloor_stock_base`
|
70
|
+
and move scenario to `shopfloor_wms`?
|
71
|
+
|
72
|
+
Changelog
|
73
|
+
=========
|
74
|
+
|
75
|
+
13.0.1.0.0
|
76
|
+
~~~~~~~~~~
|
77
|
+
|
78
|
+
First official version.
|
79
|
+
|
80
|
+
Bug Tracker
|
81
|
+
===========
|
82
|
+
|
83
|
+
Bugs are tracked on `GitHub Issues <https://github.com/OCA/wms/issues>`_.
|
84
|
+
In case of trouble, please check there if your issue has already been reported.
|
85
|
+
If you spotted it first, help us to smash it by providing a detailed and welcomed
|
86
|
+
`feedback <https://github.com/OCA/wms/issues/new?body=module:%20shopfloor%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
87
|
+
|
88
|
+
Do not contact contributors directly about support or help with technical issues.
|
89
|
+
|
90
|
+
Credits
|
91
|
+
=======
|
92
|
+
|
93
|
+
Authors
|
94
|
+
~~~~~~~
|
95
|
+
|
96
|
+
* Camptocamp
|
97
|
+
* BCIM
|
98
|
+
* Akretion
|
99
|
+
|
100
|
+
Contributors
|
101
|
+
~~~~~~~~~~~~
|
102
|
+
|
103
|
+
* Guewen Baconnier <guewen.baconnier@camptocamp.com>
|
104
|
+
* Simone Orsi <simahawk@gmail.com>
|
105
|
+
* Sébastien Alix <sebastien.alix@camptocamp.com>
|
106
|
+
* Alexandre Fayolle <alexandre.fayolle@camptocamp.com>
|
107
|
+
* Benoit Guillot <benoit.guillot@akretion.com>
|
108
|
+
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
|
109
|
+
* Raphaël Reverdy <raphael.reverdy@akretion.com>
|
110
|
+
* Jacques-Etienne Baudoux <je@bcim.be>
|
111
|
+
* Juan Miguel Sánchez Arce <juan.sanchez@camptocamp.com>
|
112
|
+
* Michael Tietz (MT Software) <mtietz@mt-software.de>
|
113
|
+
* Souheil Bejaoui <souheil.bejaoui@acsone.eu>
|
114
|
+
* Laurent Mignon <laurent.mignon@acsone.eu>
|
115
|
+
|
116
|
+
Design
|
117
|
+
~~~~~~
|
118
|
+
|
119
|
+
* Joël Grand-Guillaume <joel.grandguillaume@camptocamp.com>
|
120
|
+
* Jacques-Etienne Baudoux <je@bcim.be>
|
121
|
+
|
122
|
+
Other credits
|
123
|
+
~~~~~~~~~~~~~
|
124
|
+
|
125
|
+
**Financial support**
|
126
|
+
|
127
|
+
* Cosanum
|
128
|
+
* Camptocamp R&D
|
129
|
+
* Akretion R&D
|
130
|
+
|
131
|
+
Maintainers
|
132
|
+
~~~~~~~~~~~
|
133
|
+
|
134
|
+
This module is maintained by the OCA.
|
135
|
+
|
136
|
+
.. image:: https://odoo-community.org/logo.png
|
137
|
+
:alt: Odoo Community Association
|
138
|
+
:target: https://odoo-community.org
|
139
|
+
|
140
|
+
OCA, or the Odoo Community Association, is a nonprofit organization whose
|
141
|
+
mission is to support the collaborative development of Odoo features and
|
142
|
+
promote its widespread use.
|
143
|
+
|
144
|
+
.. |maintainer-guewen| image:: https://github.com/guewen.png?size=40px
|
145
|
+
:target: https://github.com/guewen
|
146
|
+
:alt: guewen
|
147
|
+
.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px
|
148
|
+
:target: https://github.com/simahawk
|
149
|
+
:alt: simahawk
|
150
|
+
.. |maintainer-sebalix| image:: https://github.com/sebalix.png?size=40px
|
151
|
+
:target: https://github.com/sebalix
|
152
|
+
:alt: sebalix
|
153
|
+
|
154
|
+
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|
155
|
+
|
156
|
+
|maintainer-guewen| |maintainer-simahawk| |maintainer-sebalix|
|
157
|
+
|
158
|
+
This module is part of the `OCA/wms <https://github.com/OCA/wms/tree/16.0/shopfloor>`_ project on GitHub.
|
159
|
+
|
160
|
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
|
2
|
+
# Copyright 2020 Akretion (http://www.akretion.com)
|
3
|
+
# Copyright 2020 BCIM
|
4
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
5
|
+
|
6
|
+
{
|
7
|
+
"name": "Shopfloor",
|
8
|
+
"summary": "manage warehouse operations with barcode scanners",
|
9
|
+
"version": "16.0.1.0.0",
|
10
|
+
"development_status": "Beta",
|
11
|
+
"category": "Inventory",
|
12
|
+
"website": "https://github.com/OCA/wms",
|
13
|
+
"author": "Camptocamp, BCIM, Akretion, Odoo Community Association (OCA)",
|
14
|
+
"maintainers": ["guewen", "simahawk", "sebalix"],
|
15
|
+
"license": "AGPL-3",
|
16
|
+
"application": True,
|
17
|
+
"depends": [
|
18
|
+
"shopfloor_base",
|
19
|
+
"stock",
|
20
|
+
"stock_picking_batch",
|
21
|
+
"jsonifier",
|
22
|
+
"base_rest",
|
23
|
+
"base_sparse_field",
|
24
|
+
# OCA / stock-logistics-warehouse
|
25
|
+
"stock_helper",
|
26
|
+
"stock_picking_completion_info",
|
27
|
+
# OCA / stock-logistics-workflow
|
28
|
+
"stock_move_line_change_lot",
|
29
|
+
"stock_quant_package_dimension",
|
30
|
+
"stock_quant_package_product_packaging",
|
31
|
+
"stock_picking_progress",
|
32
|
+
# TODO: used for manuf info on prod detail.
|
33
|
+
# This must be an optional dep
|
34
|
+
"product_manufacturer",
|
35
|
+
# TODO: used for prod lot expire detail info.
|
36
|
+
# This must be an optional dep
|
37
|
+
"product_expiry",
|
38
|
+
# TODO: used for package.package_type_id detail info.
|
39
|
+
# This must be an optional dep
|
40
|
+
"stock_storage_type",
|
41
|
+
# TODO: used for picking.carrier_id detail info
|
42
|
+
# and to validate packaging/carrier in checkout scenario
|
43
|
+
# This must be an optional dep
|
44
|
+
"delivery",
|
45
|
+
# OCA / product-attribute
|
46
|
+
"product_packaging_level",
|
47
|
+
# OCA / delivery
|
48
|
+
"stock_picking_delivery_link",
|
49
|
+
],
|
50
|
+
"data": [
|
51
|
+
"data/shopfloor_scenario_data.xml",
|
52
|
+
"security/groups.xml",
|
53
|
+
"views/shopfloor_menu.xml",
|
54
|
+
"views/stock_picking_type.xml",
|
55
|
+
"views/stock_location.xml",
|
56
|
+
"views/stock_move_line.xml",
|
57
|
+
],
|
58
|
+
"demo": [
|
59
|
+
"demo/stock_picking_type_demo.xml",
|
60
|
+
"demo/shopfloor_profile_demo.xml",
|
61
|
+
"demo/shopfloor_menu_demo.xml",
|
62
|
+
"demo/shopfloor_app_demo.xml",
|
63
|
+
],
|
64
|
+
"installable": True,
|
65
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from . import change_package_lot
|
2
|
+
from . import data
|
3
|
+
from . import data_detail
|
4
|
+
from . import schema
|
5
|
+
from . import schema_detail
|
6
|
+
from . import completion_info
|
7
|
+
from . import location_content_transfer_sorter
|
8
|
+
from . import message
|
9
|
+
from . import search
|
10
|
+
from . import inventory
|
11
|
+
from . import savepoint
|
12
|
+
from . import move_line_search
|
13
|
+
from . import stock
|
14
|
+
from . import stock_unreserve
|
15
|
+
from . import packaging
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
|
2
|
+
# Copyright 2024 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
|
3
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
4
|
+
from odoo import _, exceptions
|
5
|
+
from odoo.exceptions import UserError
|
6
|
+
from odoo.tools.float_utils import float_compare, float_is_zero
|
7
|
+
|
8
|
+
from odoo.addons.component.core import Component
|
9
|
+
|
10
|
+
|
11
|
+
class InventoryError(UserError):
|
12
|
+
pass
|
13
|
+
|
14
|
+
|
15
|
+
class ChangePackageLot(Component):
|
16
|
+
"""Provide methods for changing a package or a lot on a move line"""
|
17
|
+
|
18
|
+
_name = "shopfloor.change.package.lot.action"
|
19
|
+
_inherit = "shopfloor.process.action"
|
20
|
+
_usage = "change.package.lot"
|
21
|
+
|
22
|
+
def change_lot(self, move_line, lot, response_ok_func, response_error_func):
|
23
|
+
"""Change the lot on the move line.
|
24
|
+
|
25
|
+
:param response_ok_func: callable used to return ok response
|
26
|
+
:param response_error_func: callable used to return error response
|
27
|
+
"""
|
28
|
+
# If the lot is part of a package, what we really want
|
29
|
+
# is not to change the lot, but change the package (which will
|
30
|
+
# in turn change the lot altogether), but we have to pay attention
|
31
|
+
# to some things:
|
32
|
+
# * cannot replace a package by a lot without package (qty may be
|
33
|
+
# different, ...)
|
34
|
+
# * if we have several packages for the same lot, we can't know which
|
35
|
+
# one the operator is moving, ask to scan a package
|
36
|
+
lot_quants = self.env["stock.quant"].search(
|
37
|
+
[
|
38
|
+
("lot_id", "=", lot.id),
|
39
|
+
("location_id", "=", move_line.location_id.id),
|
40
|
+
("quantity", ">", 0),
|
41
|
+
]
|
42
|
+
)
|
43
|
+
package_quants = lot_quants.filtered(lambda quant: quant.package_id)
|
44
|
+
unit_quants = lot_quants - package_quants
|
45
|
+
|
46
|
+
if len(package_quants) > 1 or (package_quants and unit_quants):
|
47
|
+
# When we can't know which package to take, ask to scan a package.
|
48
|
+
# If we have both units and package, they have to scan the package
|
49
|
+
# first.
|
50
|
+
return response_error_func(
|
51
|
+
move_line,
|
52
|
+
message=self.msg_store.several_packs_in_location(move_line.location_id),
|
53
|
+
)
|
54
|
+
elif len(package_quants) == 1:
|
55
|
+
# change the package directly
|
56
|
+
package = package_quants.package_id
|
57
|
+
return self.change_package(
|
58
|
+
move_line, package, response_ok_func, response_error_func
|
59
|
+
)
|
60
|
+
return self._change_pack_lot_change_lot(
|
61
|
+
move_line, lot, response_ok_func, response_error_func
|
62
|
+
)
|
63
|
+
|
64
|
+
def _change_pack_lot_change_lot(
|
65
|
+
self, move_line, lot, response_ok_func, response_error_func
|
66
|
+
):
|
67
|
+
previous_lot = move_line.lot_id
|
68
|
+
previous_reserved_uom_qty = move_line.reserved_uom_qty
|
69
|
+
|
70
|
+
inventory = self._actions_for("inventory")
|
71
|
+
|
72
|
+
try:
|
73
|
+
with self.env.cr.savepoint():
|
74
|
+
move_line.write(
|
75
|
+
{
|
76
|
+
"lot_id": lot.id,
|
77
|
+
"package_id": False,
|
78
|
+
"result_package_id": False,
|
79
|
+
}
|
80
|
+
)
|
81
|
+
rounding = move_line.product_id.uom_id.rounding
|
82
|
+
if float_is_zero(
|
83
|
+
move_line.reserved_uom_qty, precision_rounding=rounding
|
84
|
+
):
|
85
|
+
# The lot is not found at all, but the user scanned it, which means
|
86
|
+
# it's an error in the stock data!
|
87
|
+
raise InventoryError("Lot not available")
|
88
|
+
except InventoryError:
|
89
|
+
inventory.create_control_stock(
|
90
|
+
move_line.location_id,
|
91
|
+
move_line.product_id,
|
92
|
+
lot=lot,
|
93
|
+
name=_(
|
94
|
+
"Pick: stock issue on lot: %(lot_name)s found in %(location_name)s",
|
95
|
+
lot_name=lot.name,
|
96
|
+
location_name=move_line.location_id.name,
|
97
|
+
),
|
98
|
+
)
|
99
|
+
message = self.msg_store.cannot_change_lot_already_picked(lot)
|
100
|
+
return response_error_func(move_line, message=message)
|
101
|
+
except UserError as e:
|
102
|
+
message = {
|
103
|
+
"message_type": "error",
|
104
|
+
"body": str(e),
|
105
|
+
}
|
106
|
+
return response_error_func(move_line, message=message)
|
107
|
+
|
108
|
+
message = self.msg_store.lot_replaced_by_lot(previous_lot, lot)
|
109
|
+
if (
|
110
|
+
float_compare(
|
111
|
+
move_line.reserved_uom_qty,
|
112
|
+
previous_reserved_uom_qty,
|
113
|
+
precision_rounding=rounding,
|
114
|
+
)
|
115
|
+
!= 0
|
116
|
+
):
|
117
|
+
message["body"] += " " + _("The quantity to do has changed!")
|
118
|
+
return response_ok_func(move_line, message=message)
|
119
|
+
|
120
|
+
def _package_content_replacement_allowed(self, package, move_line):
|
121
|
+
# we can't replace by a package which doesn't contain the product...
|
122
|
+
return move_line.product_id in package.quant_ids.product_id
|
123
|
+
|
124
|
+
def change_package(self, move_line, package, response_ok_func, response_error_func):
|
125
|
+
# Prevent change if package is already set and it's the same
|
126
|
+
if move_line.package_id == package:
|
127
|
+
return response_error_func(
|
128
|
+
move_line,
|
129
|
+
message=self.msg_store.package_change_error_same_package(package),
|
130
|
+
)
|
131
|
+
|
132
|
+
# prevent to replace a package by a package that would not satisfy the
|
133
|
+
# move (different product)
|
134
|
+
content_replacement_allowed = self._package_content_replacement_allowed(
|
135
|
+
package, move_line
|
136
|
+
)
|
137
|
+
if not content_replacement_allowed:
|
138
|
+
return response_error_func(
|
139
|
+
move_line, message=self.msg_store.package_different_content(package)
|
140
|
+
)
|
141
|
+
|
142
|
+
previous_package = move_line.package_id
|
143
|
+
|
144
|
+
# /!\ be sure to box the side-effects before calling "replace_package"
|
145
|
+
# in the savepoint, as we catch the error, we must be sure that any
|
146
|
+
# change is rollbacked
|
147
|
+
try:
|
148
|
+
with self.env.cr.savepoint():
|
149
|
+
# if no quantity is available in the package, this call will
|
150
|
+
# raise a UserError, which will revert the savepoint
|
151
|
+
move_line.replace_package(package)
|
152
|
+
except exceptions.UserError as err:
|
153
|
+
return response_error_func(
|
154
|
+
move_line,
|
155
|
+
message=self.msg_store.package_change_error(package, err.args[0]),
|
156
|
+
)
|
157
|
+
|
158
|
+
if previous_package:
|
159
|
+
message = self.msg_store.package_replaced_by_package(
|
160
|
+
previous_package, package
|
161
|
+
)
|
162
|
+
else:
|
163
|
+
message = self.msg_store.units_replaced_by_package(package)
|
164
|
+
return response_ok_func(move_line, message=message)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
|
2
|
+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
3
|
+
from odoo import _
|
4
|
+
|
5
|
+
from odoo.addons.component.core import Component
|
6
|
+
|
7
|
+
|
8
|
+
class CompletionInfo(Component):
|
9
|
+
"""Provide methods for completion info of pickings
|
10
|
+
|
11
|
+
They are based on the module "stock_picking_completion_info" from
|
12
|
+
OCA/stock-logistics-warehouse.
|
13
|
+
"""
|
14
|
+
|
15
|
+
_name = "shopfloor.completion.info.action"
|
16
|
+
_inherit = "shopfloor.process.action"
|
17
|
+
_usage = "completion.info"
|
18
|
+
|
19
|
+
def popup(self, move_lines):
|
20
|
+
"""Return a popup if move lines make chained pickings ready
|
21
|
+
|
22
|
+
Return None in case no popup should be displayed.
|
23
|
+
"""
|
24
|
+
pickings = move_lines.mapped("picking_id").filtered(
|
25
|
+
lambda p: p.picking_type_id.display_completion_info
|
26
|
+
and p.completion_info == "next_picking_ready"
|
27
|
+
)
|
28
|
+
if not pickings:
|
29
|
+
return None
|
30
|
+
next_pickings = pickings.mapped("move_ids.move_dest_ids.picking_id").filtered(
|
31
|
+
lambda p: p.state == "assigned"
|
32
|
+
)
|
33
|
+
if not next_pickings:
|
34
|
+
return None
|
35
|
+
return {
|
36
|
+
"body": _(
|
37
|
+
"Last operation of transfer %(picking_names)s. "
|
38
|
+
"Next operation (%(next_picking_names)s) is ready to proceed.",
|
39
|
+
picking_names=", ".join(pickings.mapped("name")),
|
40
|
+
next_picking_names=", ".join(next_pickings.mapped("name")),
|
41
|
+
)
|
42
|
+
}
|