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.
Files changed (182) hide show
  1. odoo/addons/shopfloor/README.rst +160 -0
  2. odoo/addons/shopfloor/__init__.py +4 -0
  3. odoo/addons/shopfloor/__manifest__.py +65 -0
  4. odoo/addons/shopfloor/actions/__init__.py +15 -0
  5. odoo/addons/shopfloor/actions/change_package_lot.py +164 -0
  6. odoo/addons/shopfloor/actions/completion_info.py +42 -0
  7. odoo/addons/shopfloor/actions/data.py +329 -0
  8. odoo/addons/shopfloor/actions/data_detail.py +154 -0
  9. odoo/addons/shopfloor/actions/inventory.py +150 -0
  10. odoo/addons/shopfloor/actions/location_content_transfer_sorter.py +89 -0
  11. odoo/addons/shopfloor/actions/message.py +846 -0
  12. odoo/addons/shopfloor/actions/move_line_search.py +119 -0
  13. odoo/addons/shopfloor/actions/packaging.py +59 -0
  14. odoo/addons/shopfloor/actions/savepoint.py +44 -0
  15. odoo/addons/shopfloor/actions/schema.py +182 -0
  16. odoo/addons/shopfloor/actions/schema_detail.py +98 -0
  17. odoo/addons/shopfloor/actions/search.py +187 -0
  18. odoo/addons/shopfloor/actions/stock.py +239 -0
  19. odoo/addons/shopfloor/actions/stock_unreserve.py +66 -0
  20. odoo/addons/shopfloor/components/__init__.py +5 -0
  21. odoo/addons/shopfloor/components/scan_handler_location.py +26 -0
  22. odoo/addons/shopfloor/components/scan_handler_lot.py +26 -0
  23. odoo/addons/shopfloor/components/scan_handler_package.py +26 -0
  24. odoo/addons/shopfloor/components/scan_handler_product.py +26 -0
  25. odoo/addons/shopfloor/components/scan_handler_transfer.py +26 -0
  26. odoo/addons/shopfloor/data/shopfloor_scenario_data.xml +73 -0
  27. odoo/addons/shopfloor/demo/shopfloor_app_demo.xml +12 -0
  28. odoo/addons/shopfloor/demo/shopfloor_menu_demo.xml +64 -0
  29. odoo/addons/shopfloor/demo/shopfloor_profile_demo.xml +8 -0
  30. odoo/addons/shopfloor/demo/stock_picking_type_demo.xml +93 -0
  31. odoo/addons/shopfloor/docs/checkout_diag_seq.plantuml +61 -0
  32. odoo/addons/shopfloor/docs/checkout_diag_seq.png +0 -0
  33. odoo/addons/shopfloor/docs/cluster_picking_diag_seq.plantuml +112 -0
  34. odoo/addons/shopfloor/docs/cluster_picking_diag_seq.png +0 -0
  35. odoo/addons/shopfloor/docs/delivery_diag_seq.plantuml +56 -0
  36. odoo/addons/shopfloor/docs/delivery_diag_seq.png +0 -0
  37. odoo/addons/shopfloor/docs/location_content_transfer_diag_seq.plantuml +66 -0
  38. odoo/addons/shopfloor/docs/location_content_transfer_diag_seq.png +0 -0
  39. odoo/addons/shopfloor/docs/oca_logo.png +0 -0
  40. odoo/addons/shopfloor/docs/single_pack_transfer_diag_seq.plantuml +36 -0
  41. odoo/addons/shopfloor/docs/single_pack_transfer_diag_seq.png +0 -0
  42. odoo/addons/shopfloor/docs/zone_picking_diag_seq.plantuml +85 -0
  43. odoo/addons/shopfloor/docs/zone_picking_diag_seq.png +0 -0
  44. odoo/addons/shopfloor/exceptions.py +6 -0
  45. odoo/addons/shopfloor/i18n/ca.po +1802 -0
  46. odoo/addons/shopfloor/i18n/de.po +1791 -0
  47. odoo/addons/shopfloor/i18n/es_AR.po +2147 -0
  48. odoo/addons/shopfloor/i18n/pt_BR.po +1791 -0
  49. odoo/addons/shopfloor/i18n/shopfloor.pot +1877 -0
  50. odoo/addons/shopfloor/models/__init__.py +12 -0
  51. odoo/addons/shopfloor/models/priority_postpone_mixin.py +41 -0
  52. odoo/addons/shopfloor/models/shopfloor_app.py +9 -0
  53. odoo/addons/shopfloor/models/shopfloor_menu.py +436 -0
  54. odoo/addons/shopfloor/models/stock_location.py +76 -0
  55. odoo/addons/shopfloor/models/stock_move.py +119 -0
  56. odoo/addons/shopfloor/models/stock_move_line.py +307 -0
  57. odoo/addons/shopfloor/models/stock_package_level.py +50 -0
  58. odoo/addons/shopfloor/models/stock_picking.py +118 -0
  59. odoo/addons/shopfloor/models/stock_picking_batch.py +41 -0
  60. odoo/addons/shopfloor/models/stock_picking_type.py +26 -0
  61. odoo/addons/shopfloor/models/stock_quant.py +31 -0
  62. odoo/addons/shopfloor/models/stock_quant_package.py +101 -0
  63. odoo/addons/shopfloor/readme/CONTRIBUTORS.rst +18 -0
  64. odoo/addons/shopfloor/readme/CREDITS.rst +5 -0
  65. odoo/addons/shopfloor/readme/DESCRIPTION.rst +17 -0
  66. odoo/addons/shopfloor/readme/HISTORY.rst +4 -0
  67. odoo/addons/shopfloor/readme/ROADMAP.rst +4 -0
  68. odoo/addons/shopfloor/readme/USAGE.rst +6 -0
  69. odoo/addons/shopfloor/security/groups.xml +17 -0
  70. odoo/addons/shopfloor/services/__init__.py +16 -0
  71. odoo/addons/shopfloor/services/checkout.py +1763 -0
  72. odoo/addons/shopfloor/services/cluster_picking.py +1628 -0
  73. odoo/addons/shopfloor/services/delivery.py +828 -0
  74. odoo/addons/shopfloor/services/forms/__init__.py +1 -0
  75. odoo/addons/shopfloor/services/forms/picking_form.py +78 -0
  76. odoo/addons/shopfloor/services/location_content_transfer.py +1194 -0
  77. odoo/addons/shopfloor/services/menu.py +60 -0
  78. odoo/addons/shopfloor/services/picking_batch.py +126 -0
  79. odoo/addons/shopfloor/services/service.py +101 -0
  80. odoo/addons/shopfloor/services/single_pack_transfer.py +366 -0
  81. odoo/addons/shopfloor/services/zone_picking.py +1938 -0
  82. odoo/addons/shopfloor/static/description/icon.png +0 -0
  83. odoo/addons/shopfloor/static/description/index.html +500 -0
  84. odoo/addons/shopfloor/tests/__init__.py +83 -0
  85. odoo/addons/shopfloor/tests/common.py +324 -0
  86. odoo/addons/shopfloor/tests/models.py +29 -0
  87. odoo/addons/shopfloor/tests/test_actions_change_package_lot.py +1175 -0
  88. odoo/addons/shopfloor/tests/test_actions_data.py +376 -0
  89. odoo/addons/shopfloor/tests/test_actions_data_base.py +244 -0
  90. odoo/addons/shopfloor/tests/test_actions_data_detail.py +322 -0
  91. odoo/addons/shopfloor/tests/test_actions_search.py +248 -0
  92. odoo/addons/shopfloor/tests/test_actions_stock.py +48 -0
  93. odoo/addons/shopfloor/tests/test_checkout_auto_post.py +67 -0
  94. odoo/addons/shopfloor/tests/test_checkout_base.py +81 -0
  95. odoo/addons/shopfloor/tests/test_checkout_cancel_line.py +154 -0
  96. odoo/addons/shopfloor/tests/test_checkout_change_packaging.py +184 -0
  97. odoo/addons/shopfloor/tests/test_checkout_done.py +133 -0
  98. odoo/addons/shopfloor/tests/test_checkout_list_delivery_packaging.py +131 -0
  99. odoo/addons/shopfloor/tests/test_checkout_list_package.py +327 -0
  100. odoo/addons/shopfloor/tests/test_checkout_new_package.py +88 -0
  101. odoo/addons/shopfloor/tests/test_checkout_no_package.py +95 -0
  102. odoo/addons/shopfloor/tests/test_checkout_scan.py +174 -0
  103. odoo/addons/shopfloor/tests/test_checkout_scan_line.py +377 -0
  104. odoo/addons/shopfloor/tests/test_checkout_scan_line_base.py +25 -0
  105. odoo/addons/shopfloor/tests/test_checkout_scan_line_no_prefill_qty.py +91 -0
  106. odoo/addons/shopfloor/tests/test_checkout_scan_package_action.py +451 -0
  107. odoo/addons/shopfloor/tests/test_checkout_scan_package_action_no_prefill_qty.py +107 -0
  108. odoo/addons/shopfloor/tests/test_checkout_select.py +74 -0
  109. odoo/addons/shopfloor/tests/test_checkout_select_line.py +130 -0
  110. odoo/addons/shopfloor/tests/test_checkout_select_package_base.py +64 -0
  111. odoo/addons/shopfloor/tests/test_checkout_set_qty.py +257 -0
  112. odoo/addons/shopfloor/tests/test_checkout_summary.py +69 -0
  113. odoo/addons/shopfloor/tests/test_cluster_picking_base.py +83 -0
  114. odoo/addons/shopfloor/tests/test_cluster_picking_batch.py +109 -0
  115. odoo/addons/shopfloor/tests/test_cluster_picking_change_pack_lot.py +111 -0
  116. odoo/addons/shopfloor/tests/test_cluster_picking_is_zero.py +98 -0
  117. odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination.py +376 -0
  118. odoo/addons/shopfloor/tests/test_cluster_picking_scan_destination_no_prefill_qty.py +115 -0
  119. odoo/addons/shopfloor/tests/test_cluster_picking_scan_line.py +402 -0
  120. odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_location_or_pack_first.py +114 -0
  121. odoo/addons/shopfloor/tests/test_cluster_picking_scan_line_no_prefill_qty.py +70 -0
  122. odoo/addons/shopfloor/tests/test_cluster_picking_select.py +387 -0
  123. odoo/addons/shopfloor/tests/test_cluster_picking_skip.py +90 -0
  124. odoo/addons/shopfloor/tests/test_cluster_picking_stock_issue.py +364 -0
  125. odoo/addons/shopfloor/tests/test_cluster_picking_unload.py +911 -0
  126. odoo/addons/shopfloor/tests/test_delivery_base.py +155 -0
  127. odoo/addons/shopfloor/tests/test_delivery_done.py +108 -0
  128. odoo/addons/shopfloor/tests/test_delivery_list_stock_picking.py +49 -0
  129. odoo/addons/shopfloor/tests/test_delivery_reset_qty_done_line.py +119 -0
  130. odoo/addons/shopfloor/tests/test_delivery_reset_qty_done_pack.py +107 -0
  131. odoo/addons/shopfloor/tests/test_delivery_scan_deliver.py +557 -0
  132. odoo/addons/shopfloor/tests/test_delivery_select.py +38 -0
  133. odoo/addons/shopfloor/tests/test_delivery_set_qty_done_line.py +91 -0
  134. odoo/addons/shopfloor/tests/test_delivery_set_qty_done_pack.py +135 -0
  135. odoo/addons/shopfloor/tests/test_delivery_sublocation.py +180 -0
  136. odoo/addons/shopfloor/tests/test_location_content_transfer_base.py +136 -0
  137. odoo/addons/shopfloor/tests/test_location_content_transfer_get_work.py +125 -0
  138. odoo/addons/shopfloor/tests/test_location_content_transfer_mix.py +509 -0
  139. odoo/addons/shopfloor/tests/test_location_content_transfer_putaway.py +143 -0
  140. odoo/addons/shopfloor/tests/test_location_content_transfer_scan_location.py +34 -0
  141. odoo/addons/shopfloor/tests/test_location_content_transfer_set_destination_all.py +343 -0
  142. odoo/addons/shopfloor/tests/test_location_content_transfer_set_destination_package_or_line.py +1074 -0
  143. odoo/addons/shopfloor/tests/test_location_content_transfer_single.py +748 -0
  144. odoo/addons/shopfloor/tests/test_location_content_transfer_start.py +359 -0
  145. odoo/addons/shopfloor/tests/test_menu_base.py +261 -0
  146. odoo/addons/shopfloor/tests/test_menu_counters.py +61 -0
  147. odoo/addons/shopfloor/tests/test_misc.py +25 -0
  148. odoo/addons/shopfloor/tests/test_move_action_assign.py +87 -0
  149. odoo/addons/shopfloor/tests/test_openapi.py +21 -0
  150. odoo/addons/shopfloor/tests/test_picking_form.py +62 -0
  151. odoo/addons/shopfloor/tests/test_scan_anything.py +49 -0
  152. odoo/addons/shopfloor/tests/test_single_pack_transfer.py +1121 -0
  153. odoo/addons/shopfloor/tests/test_single_pack_transfer_base.py +32 -0
  154. odoo/addons/shopfloor/tests/test_single_pack_transfer_putaway.py +104 -0
  155. odoo/addons/shopfloor/tests/test_stock_split.py +204 -0
  156. odoo/addons/shopfloor/tests/test_user.py +42 -0
  157. odoo/addons/shopfloor/tests/test_zone_picking_base.py +608 -0
  158. odoo/addons/shopfloor/tests/test_zone_picking_change_pack_lot.py +140 -0
  159. odoo/addons/shopfloor/tests/test_zone_picking_select_line.py +723 -0
  160. odoo/addons/shopfloor/tests/test_zone_picking_select_line_first_scan_location.py +207 -0
  161. odoo/addons/shopfloor/tests/test_zone_picking_select_line_first_scan_location.py.bak +202 -0
  162. odoo/addons/shopfloor/tests/test_zone_picking_select_line_no_prefill_qty.py +107 -0
  163. odoo/addons/shopfloor/tests/test_zone_picking_select_picking_type.py +26 -0
  164. odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination.py +643 -0
  165. odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination_no_prefill_qty.py +146 -0
  166. odoo/addons/shopfloor/tests/test_zone_picking_set_line_destination_pick_pack.py +241 -0
  167. odoo/addons/shopfloor/tests/test_zone_picking_start.py +206 -0
  168. odoo/addons/shopfloor/tests/test_zone_picking_stock_issue.py +121 -0
  169. odoo/addons/shopfloor/tests/test_zone_picking_unload_all.py +353 -0
  170. odoo/addons/shopfloor/tests/test_zone_picking_unload_buffer_lines.py +113 -0
  171. odoo/addons/shopfloor/tests/test_zone_picking_unload_set_destination.py +374 -0
  172. odoo/addons/shopfloor/tests/test_zone_picking_unload_single.py +123 -0
  173. odoo/addons/shopfloor/tests/test_zone_picking_zero_check.py +43 -0
  174. odoo/addons/shopfloor/utils.py +13 -0
  175. odoo/addons/shopfloor/views/shopfloor_menu.xml +167 -0
  176. odoo/addons/shopfloor/views/stock_location.xml +20 -0
  177. odoo/addons/shopfloor/views/stock_move_line.xml +52 -0
  178. odoo/addons/shopfloor/views/stock_picking_type.xml +19 -0
  179. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/METADATA +192 -0
  180. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/RECORD +182 -0
  181. odoo_addon_shopfloor-16.0.1.0.0.24.dist-info/WHEEL +5 -0
  182. 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,4 @@
1
+ from . import models
2
+ from . import actions
3
+ from . import components
4
+ from . import services
@@ -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
+ }