odoo-addon-shopfloor-mobile 16.0.1.0.0.6__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 (57) hide show
  1. odoo/addons/shopfloor_mobile/README.rst +215 -0
  2. odoo/addons/shopfloor_mobile/__init__.py +0 -0
  3. odoo/addons/shopfloor_mobile/__manifest__.py +17 -0
  4. odoo/addons/shopfloor_mobile/i18n/es_AR.po +39 -0
  5. odoo/addons/shopfloor_mobile/i18n/pt_BR.po +14 -0
  6. odoo/addons/shopfloor_mobile/i18n/shopfloor_mobile.pot +13 -0
  7. odoo/addons/shopfloor_mobile/readme/CONTRIBUTORS.rst +12 -0
  8. odoo/addons/shopfloor_mobile/readme/CREDITS.rst +5 -0
  9. odoo/addons/shopfloor_mobile/readme/DESCRIPTION.rst +31 -0
  10. odoo/addons/shopfloor_mobile/readme/HISTORY.rst +4 -0
  11. odoo/addons/shopfloor_mobile/readme/ROADMAP.rst +29 -0
  12. odoo/addons/shopfloor_mobile/readme/USAGE.rst +34 -0
  13. odoo/addons/shopfloor_mobile/static/description/icon.png +0 -0
  14. odoo/addons/shopfloor_mobile/static/description/index.html +555 -0
  15. odoo/addons/shopfloor_mobile/static/wms/.gitignore +21 -0
  16. odoo/addons/shopfloor_mobile/static/wms/src/components/batch_picking_detail.js +69 -0
  17. odoo/addons/shopfloor_mobile/static/wms/src/components/batch_picking_line_detail.js +141 -0
  18. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_location.js +66 -0
  19. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_lot.js +91 -0
  20. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_operation.js +50 -0
  21. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_package.js +73 -0
  22. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_picking.js +40 -0
  23. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_product.js +70 -0
  24. odoo/addons/shopfloor_mobile/static/wms/src/components/detail/detail_transfer.js +128 -0
  25. odoo/addons/shopfloor_mobile/static/wms/src/components/forms/form_edit_stock_picking.js +39 -0
  26. odoo/addons/shopfloor_mobile/static/wms/src/components/manual_select_color.js +24 -0
  27. odoo/addons/shopfloor_mobile/static/wms/src/components/misc.js +201 -0
  28. odoo/addons/shopfloor_mobile/static/wms/src/components/packaging-qty-picker.js +329 -0
  29. odoo/addons/shopfloor_mobile/static/wms/src/components/scenario_picking_detail/mixins.js +130 -0
  30. odoo/addons/shopfloor_mobile/static/wms/src/components/scenario_picking_detail/picking_select.js +135 -0
  31. odoo/addons/shopfloor_mobile/static/wms/src/components/scenario_picking_detail/picking_summary.js +212 -0
  32. odoo/addons/shopfloor_mobile/static/wms/src/css/main.css +73 -0
  33. odoo/addons/shopfloor_mobile/static/wms/src/css/normalize.css +351 -0
  34. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.checkout.js +257 -0
  35. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.cluster_picking.js +188 -0
  36. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.delivery.js +79 -0
  37. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.location_content_transfer.js +179 -0
  38. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.scan_anything.js +124 -0
  39. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.single_pack_transfer.js +83 -0
  40. odoo/addons/shopfloor_mobile/static/wms/src/demo/demo.zone_picking.js +277 -0
  41. odoo/addons/shopfloor_mobile/static/wms/src/i18n/add_translations_to_registry.js +4 -0
  42. odoo/addons/shopfloor_mobile/static/wms/src/i18n/en.json +31 -0
  43. odoo/addons/shopfloor_mobile/static/wms/src/i18n/fr.json +27 -0
  44. odoo/addons/shopfloor_mobile/static/wms/src/scenario/checkout.js +390 -0
  45. odoo/addons/shopfloor_mobile/static/wms/src/scenario/checkout_states.js +380 -0
  46. odoo/addons/shopfloor_mobile/static/wms/src/scenario/cluster_picking.js +481 -0
  47. odoo/addons/shopfloor_mobile/static/wms/src/scenario/delivery.js +353 -0
  48. odoo/addons/shopfloor_mobile/static/wms/src/scenario/location_content_transfer.js +388 -0
  49. odoo/addons/shopfloor_mobile/static/wms/src/scenario/single_pack_transfer.js +132 -0
  50. odoo/addons/shopfloor_mobile/static/wms/src/scenario/zone_picking.js +838 -0
  51. odoo/addons/shopfloor_mobile/static/wms/src/screen.js +36 -0
  52. odoo/addons/shopfloor_mobile/static/wms/src/wms_utils.js +318 -0
  53. odoo/addons/shopfloor_mobile/templates/assets.xml +180 -0
  54. odoo_addon_shopfloor_mobile-16.0.1.0.0.6.dist-info/METADATA +235 -0
  55. odoo_addon_shopfloor_mobile-16.0.1.0.0.6.dist-info/RECORD +57 -0
  56. odoo_addon_shopfloor_mobile-16.0.1.0.0.6.dist-info/WHEEL +5 -0
  57. odoo_addon_shopfloor_mobile-16.0.1.0.0.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
3
+ * Copyright 2021 ACSONE SA/NV (http://www.acsone.eu)
4
+ * @author Simone Orsi <simahawk@gmail.com>
5
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
6
+ */
7
+
8
+ // Override main menu template
9
+
10
+ Vue.component("nav-item-content").extendOptions.template = `
11
+ <div :class="$options._componentTag">
12
+ <v-list-item-title class="primary--text">
13
+ {{ item.name }}
14
+ </v-list-item-title>
15
+ <v-list-item-subtitle v-if="show_full_info">
16
+ <small class="font-weight-light"><strong>{{ $t('app.nav.scenario') }}</strong> {{ item.scenario }}</small>
17
+ <div v-if="!_.isEmpty(item.picking_types)">
18
+ <small class="font-weight-light text-wrap pr-2">
19
+ <strong>{{ $t('app.nav.op_types') }}</strong>
20
+ <span v-for="(pt, index) in item.picking_types"
21
+ :key="'pt-' + item.id + '-' + pt.id"
22
+ >{{ pt.name }}<span v-if="index != (item.picking_types.length - 1)">,</span>
23
+ </span>
24
+ </small>
25
+ </div>
26
+ </v-list-item-subtitle>
27
+ </div>
28
+ `;
29
+
30
+ Vue.component("nav-item-action").extendOptions.template = `
31
+ <div :class="$options._componentTag">
32
+ <div class="pa-4 secondary text-no-wrap rounded-pill" v-if="item.lines_count">
33
+ {{ $t('misc.lines_count', item) }}
34
+ </div>
35
+ </div>
36
+ `;
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
3
+ * Copyright 2021 ACSONE SA/NV (http://www.acsone.eu)
4
+ * @author Simone Orsi <simahawk@gmail.com>
5
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
6
+ */
7
+ import {utils_registry} from "/shopfloor_mobile_base/static/wms/src/services/utils_registry.js";
8
+
9
+ export class WMSUtils {
10
+ group_lines_by_location(lines, options) {
11
+ const self = this;
12
+ // {'key': 'no-group', 'title': '', 'records': []}
13
+ options = _.defaults(options || {}, {
14
+ group_key: "location_src",
15
+ group_no_title: false,
16
+ name_prefix: "Location",
17
+ prepare_records: function (recs) {
18
+ return recs;
19
+ },
20
+ group_color_maker: function (recs) {
21
+ return "";
22
+ },
23
+ });
24
+ const res = [];
25
+ const locations = _.uniqBy(
26
+ _.map(lines, function (x) {
27
+ return x[options.group_key];
28
+ }),
29
+ "id"
30
+ );
31
+ const grouped = _.groupBy(lines, options.group_key + ".id");
32
+ // TODO: grouped.forEach?
33
+ _.forEach(grouped, function (value, loc_id) {
34
+ const location = _.first(_.filter(locations, {id: parseInt(loc_id, 10)}));
35
+ const title = options.group_no_title
36
+ ? ""
37
+ : options.name_prefix
38
+ ? options.name_prefix + ": " + location.name
39
+ : location.name;
40
+ res.push({
41
+ _is_group: true,
42
+ key: loc_id,
43
+ title: title,
44
+ group_color: options.group_color_maker(value),
45
+ records: options.prepare_records.call(self, value),
46
+ });
47
+ });
48
+ return res;
49
+ }
50
+
51
+ group_lines_by_locations(lines, options) {
52
+ const self = this;
53
+ // {key: 'no-group', location_src: {}, location_dest: {} records: []}
54
+ options = _.defaults(options || {}, {
55
+ prepare_records: function (recs) {
56
+ return recs;
57
+ },
58
+ });
59
+ const res = [];
60
+ const locations = _.uniqBy(
61
+ _.concat(
62
+ _.map(lines, function (x) {
63
+ return x.location_src;
64
+ }),
65
+ _.map(lines, function (x) {
66
+ return x.location_dest;
67
+ })
68
+ ),
69
+ "id"
70
+ );
71
+ const grouped = _.chain(lines)
72
+ .groupBy((item) => `${item.location_src.id}--${item.location_dest.id}`)
73
+ .value();
74
+ _.forEach(grouped, function (value, loc_ids) {
75
+ const [src_id, dest_id] = loc_ids.split("--");
76
+ const src_loc = _.first(_.filter(locations, {id: parseInt(src_id, 10)}));
77
+ const dest_loc = _.first(_.filter(locations, {id: parseInt(dest_id, 10)}));
78
+ res.push({
79
+ _is_group: true,
80
+ key: loc_ids,
81
+ location_src: src_loc,
82
+ location_dest: dest_loc,
83
+ records: options.prepare_records.call(self, value),
84
+ });
85
+ });
86
+ return res;
87
+ }
88
+
89
+ group_lines_by_product(lines, options) {
90
+ const self = this;
91
+ // {'key': 'no-group', 'title': '', 'records': []}
92
+ options = _.defaults(options || {}, {
93
+ group_no_title: false,
94
+ prepare_records: function (recs) {
95
+ return recs;
96
+ },
97
+ group_color_maker: function (recs) {
98
+ return "";
99
+ },
100
+ });
101
+ const res = [];
102
+ const products = _.uniqBy(
103
+ _.map(lines, function (x) {
104
+ return x["product"];
105
+ }),
106
+ "id"
107
+ );
108
+ const grouped = _.groupBy(lines, "product.id");
109
+ _.forEach(grouped, function (value, prod_id) {
110
+ const product = _.first(_.filter(products, {id: parseInt(prod_id, 10)}));
111
+ const title = options.group_no_title
112
+ ? ""
113
+ : options.name_prefix
114
+ ? options.name_prefix + ": " + product.name
115
+ : product.name;
116
+ res.push({
117
+ _is_group: true,
118
+ key: prod_id,
119
+ title: title,
120
+ group_color: options.group_color_maker(value),
121
+ records: options.prepare_records.call(self, value),
122
+ });
123
+ });
124
+ return res;
125
+ }
126
+
127
+ group_by_pack(lines, package_key = "package_dest") {
128
+ const self = this;
129
+ const res = [];
130
+ const packs = _.uniqBy(
131
+ _.map(lines, function (x) {
132
+ return _.result(x, package_key);
133
+ }),
134
+ "id"
135
+ );
136
+ const grouped = _.groupBy(lines, function (l) {
137
+ const pack_id = _.result(l, package_key + ".id");
138
+ if (pack_id) {
139
+ return "pack-" + pack_id;
140
+ }
141
+ return "raw-" + l.id + l.product.id;
142
+ });
143
+ let counter = 0;
144
+ _.forEach(grouped, function (products, key) {
145
+ counter++;
146
+ let pack = null;
147
+ if (key.startsWith("pack")) {
148
+ pack = _.first(
149
+ _.filter(packs, {id: parseInt(key.split("-").slice(-1)[0], 10)})
150
+ );
151
+ }
152
+ res.push({
153
+ _is_group: true,
154
+ key: key + "--" + counter,
155
+ // No pack, just display the product name
156
+ title: pack ? pack.name : products[0].display_name,
157
+ pack: pack,
158
+ records: products,
159
+ records_by_pkg_type: pack ? self.group_by_package_type(products) : null,
160
+ });
161
+ });
162
+ return res;
163
+ }
164
+
165
+ group_by_package_type(lines) {
166
+ const res = [];
167
+ const grouped = _.groupBy(lines, "package_dest.packaging.name");
168
+ _.forEach(grouped, function (products, packaging_name) {
169
+ res.push({
170
+ _is_group: true,
171
+ // GroupBy gives undefined as string
172
+ key: packaging_name == "undefined" ? "no-packaging" : packaging_name,
173
+ title: packaging_name == "undefined" ? "" : packaging_name,
174
+ records: products,
175
+ });
176
+ });
177
+ return res;
178
+ }
179
+
180
+ only_one_package(lines) {
181
+ const res = [];
182
+ const pkg_seen = [];
183
+ lines.forEach(function (line) {
184
+ if (line.package_dest) {
185
+ if (!pkg_seen.includes(line.package_dest.id)) {
186
+ // Got a pack
187
+ res.push(line);
188
+ pkg_seen.push(line.package_dest.id);
189
+ }
190
+ } else {
191
+ // No pack
192
+ res.push(line);
193
+ }
194
+ });
195
+ return res;
196
+ }
197
+
198
+ completed_move_lines(move_lines) {
199
+ return _.filter(move_lines, function (l) {
200
+ return l.qty_done > 0;
201
+ }).length;
202
+ }
203
+
204
+ move_lines_completeness(move_lines) {
205
+ return (this.completed_move_lines(move_lines) / move_lines.length) * 100;
206
+ }
207
+
208
+ picking_completeness(record, filtered_move_lines) {
209
+ const move_lines = filtered_move_lines
210
+ ? filtered_move_lines
211
+ : record.move_lines;
212
+ return this.move_lines_completeness(move_lines);
213
+ }
214
+
215
+ order_picking_by_completeness(pickings) {
216
+ const self = this;
217
+ const ordered = _.sortBy(pickings, function (rec) {
218
+ return self.picking_completeness(rec);
219
+ });
220
+ return _.reverse(ordered);
221
+ }
222
+
223
+ move_line_color_klass(rec) {
224
+ let line = rec;
225
+ if (line._is_group) {
226
+ line = line.records[0];
227
+ }
228
+ let klass = "";
229
+ if (line.qty_done == line.quantity) {
230
+ klass = "done screen_step_done lighten-1";
231
+ } else if (line.qty_done && line.qty_done < line.quantity) {
232
+ klass = "partial screen_step_todo lighten-2";
233
+ } else if (line.qty_done == 0) {
234
+ klass = "not-done screen_step_todo lighten-1";
235
+ }
236
+ return "move-line-" + klass;
237
+ }
238
+
239
+ list_item_klass_maker_by_progress(rec) {
240
+ const records = _.result(rec, "records", undefined);
241
+ if (!records) {
242
+ return;
243
+ }
244
+ let avg_progress =
245
+ records.reduce((acc, next) => {
246
+ return next.progress + acc;
247
+ }, 0) / records.length;
248
+ let klass = "";
249
+ if (avg_progress === 100) {
250
+ klass = "done screen_step_done lighten-1";
251
+ } else if (avg_progress === 0) {
252
+ klass = "not-done screen_step_todo lighten-1";
253
+ } else {
254
+ klass = "partial screen_step_todo lighten-2";
255
+ }
256
+ return "move-line-" + klass;
257
+ }
258
+
259
+ /**
260
+ * Provide display options for rendering move line product's info.
261
+ *
262
+ * TODO: @simahawk this is a first attempt to stop creating a specific widget of each case
263
+ * whereas you have to handle different options.
264
+ * The aim is to be able to re-use detail-card and alike by passing options only.
265
+ *
266
+ * @param {*} line The move line
267
+ */
268
+ move_line_product_detail_options(line, options = {}) {
269
+ const self = this;
270
+ const default_fields = [
271
+ {path: "product.supplier_code", label: "Vendor code", klass: "loud"},
272
+ {path: "package_src.name", label: "Pack"},
273
+ {path: "lot.name", label: "Lot"},
274
+ {
275
+ path: "quantity",
276
+ label: "Qty",
277
+ render_component: "packaging-qty-picker-display",
278
+ render_props: function (record) {
279
+ return self.move_line_qty_picker_props(record, {
280
+ qtyInit: record.quantity,
281
+ });
282
+ },
283
+ },
284
+ {path: "product.qty_available", label: "Qty on hand"},
285
+ ];
286
+ options = _.defaults({}, options, {
287
+ main: true,
288
+ key_title: "product.display_name",
289
+ title_action_field: {action_val_path: "product.barcode"},
290
+ fields_blacklist: [],
291
+ fields_extend_default: true,
292
+ });
293
+ options.fields = options.fields_extend_default
294
+ ? default_fields.concat(options.fields || [])
295
+ : options.fields || [];
296
+ options.fields = _.filter(options.fields, function (field) {
297
+ return !options.fields_blacklist.includes(field.path);
298
+ });
299
+ return options;
300
+ }
301
+ move_line_qty_picker_options(line, override = {}) {
302
+ // DEPRECATED - To drop in next versions
303
+ // Use v-bind="utils.wms.move_line_qty_picker_props(...)" instead
304
+ console.log("wms_utils.move_line_qty_picker_options is deprecated.");
305
+ }
306
+ move_line_qty_picker_props(line, override = {}) {
307
+ const props = {
308
+ qtyTodo: parseInt(line.quantity, 10),
309
+ qtyInit: line.qty_done,
310
+ availablePackaging: line.product.packaging,
311
+ uom: line.product.uom,
312
+ nonZeroOnly: true,
313
+ };
314
+ return _.extend(props, override || {});
315
+ }
316
+ }
317
+
318
+ utils_registry.add("wms", new WMSUtils());
@@ -0,0 +1,180 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!--
3
+ Copyright 2020 Camptocamp SA (http://www.camptocamp.com)
4
+ @author Simone Orsi <simahawk@gmail.com>
5
+ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
6
+ -->
7
+ <odoo>
8
+ <template
9
+ id="shopfloor_app_assets"
10
+ inherit_id="shopfloor_mobile_base.shopfloor_app_assets"
11
+ >
12
+ <script id="script_app_main" position="before">
13
+ <t t-set="mod_version" t-value="get_version('shopfloor_mobile')" />
14
+ <link
15
+ id="link_css_main"
16
+ t-attf-href="/shopfloor_mobile/static/wms/src/css/main.css?v=#{mod_version}"
17
+ rel="stylesheet"
18
+ />
19
+ <script
20
+ id="script_scren_override"
21
+ t-attf-src="/shopfloor_mobile/static/wms/src/screen.js?v=#{mod_version}"
22
+ type="module"
23
+ />
24
+ <script
25
+ id="script_wms_utils"
26
+ t-attf-src="/shopfloor_mobile/static/wms/src/wms_utils.js?v=#{mod_version}"
27
+ type="module"
28
+ />
29
+ <script
30
+ id="script_manual_select_color"
31
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/manual_select_color.js?v=#{mod_version}"
32
+ type="module"
33
+ />
34
+ <script
35
+ id="script_misc"
36
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/misc.js?v=#{mod_version}"
37
+ type="module"
38
+ />
39
+ <script
40
+ id="script_add_translations_registry"
41
+ t-attf-src="/shopfloor_mobile/static/wms/src/i18n/add_translations_to_registry.js?v=#{app_version}"
42
+ type="module"
43
+ />
44
+ <script
45
+ id="script_component_packaging_qty_picker"
46
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/packaging-qty-picker.js?v=#{mod_version}"
47
+ type="module"
48
+ />
49
+ <script
50
+ id="script_component_detail_location"
51
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/detail/detail_location.js?v=#{mod_version}"
52
+ type="module"
53
+ />
54
+ <script
55
+ id="script_component_detail_package"
56
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/detail/detail_package.js?v=#{mod_version}"
57
+ type="module"
58
+ />
59
+ <script
60
+ id="script_component_detail_lot"
61
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/detail/detail_lot.js?v=#{mod_version}"
62
+ type="module"
63
+ />
64
+ <script
65
+ id="script_component_detail_product"
66
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/detail/detail_product.js?v=#{mod_version}"
67
+ type="module"
68
+ />
69
+ <script
70
+ id="script_component_detail_transfer"
71
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/detail/detail_transfer.js?v=#{mod_version}"
72
+ type="module"
73
+ />
74
+ <script
75
+ id="script_component_detail_operation"
76
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/detail/detail_operation.js?v=#{mod_version}"
77
+ type="module"
78
+ />
79
+ <script
80
+ id="script_component_batch_picking_detail"
81
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/batch_picking_detail.js?v=#{mod_version}"
82
+ type="module"
83
+ />
84
+ <script
85
+ id="script_component_batch_picking_line_detail"
86
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/batch_picking_line_detail.js?v=#{mod_version}"
87
+ type="module"
88
+ />
89
+ <script
90
+ id="script_component_picking_select"
91
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/scenario_picking_detail/picking_select.js?v=#{mod_version}"
92
+ type="module"
93
+ />
94
+ <script
95
+ id="script_component_picking_summary"
96
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/scenario_picking_detail/picking_summary.js?v=#{mod_version}"
97
+ type="module"
98
+ />
99
+ <script
100
+ id="script_component_form_edit_stock_picking"
101
+ t-attf-src="/shopfloor_mobile/static/wms/src/components/forms/form_edit_stock_picking.js?v=#{mod_version}"
102
+ type="module"
103
+ />
104
+ <!-- Scenario -->
105
+ <script
106
+ id="script_scenario_single_pack_transfer"
107
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/single_pack_transfer.js?v=#{mod_version}"
108
+ type="module"
109
+ />
110
+ <script
111
+ id="script_scenario_cluster_picking"
112
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/cluster_picking.js?v=#{mod_version}"
113
+ type="module"
114
+ />
115
+ <script
116
+ id="script_scenario_checkout_states"
117
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/checkout_states.js?v=#{mod_version}"
118
+ type="module"
119
+ />
120
+ <script
121
+ id="script_scenario_checkout"
122
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/checkout.js?v=#{mod_version}"
123
+ type="module"
124
+ />
125
+ <script
126
+ id="script_scenario_delivery"
127
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/delivery.js?v=#{mod_version}"
128
+ type="module"
129
+ />
130
+ <script
131
+ id="script_scenario_location_content_transfer"
132
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/location_content_transfer.js?v=#{mod_version}"
133
+ type="module"
134
+ />
135
+ <script
136
+ id="script_scenario_zone_picking"
137
+ t-attf-src="/shopfloor_mobile/static/wms/src/scenario/zone_picking.js?v=#{mod_version}"
138
+ type="module"
139
+ />
140
+ </script>
141
+ </template>
142
+ <template
143
+ id="shopfloor_app_demo_assets"
144
+ inherit_id="shopfloor_mobile_base.shopfloor_app_demo_assets"
145
+ >
146
+ <xpath expr="//script[last()]" position="after">
147
+ <t t-set="mod_version" t-value="get_version('shopfloor_mobile')" />
148
+ <script
149
+ id="script_demo_checkout"
150
+ t-attf-src="/shopfloor_mobile/static/wms/src/demo/demo.checkout.js?v=#{mod_version}"
151
+ type="module"
152
+ />
153
+ <script
154
+ id="script_demo_cluster_picking"
155
+ t-attf-src="/shopfloor_mobile/static/wms/src/demo/demo.cluster_picking.js?v=#{mod_version}"
156
+ type="module"
157
+ />
158
+ <script
159
+ id="script_demo_delivery"
160
+ t-attf-src="/shopfloor_mobile/static/wms/src/demo/demo.delivery.js?v=#{mod_version}"
161
+ type="module"
162
+ />
163
+ <script
164
+ id="script_demo_single_pack_transfer"
165
+ t-attf-src="/shopfloor_mobile/static/wms/src/demo/demo.single_pack_transfer.js?v=#{mod_version}"
166
+ type="module"
167
+ />
168
+ <script
169
+ id="script_demo_zone_picking"
170
+ t-attf-src="/shopfloor_mobile/static/wms/src/demo/demo.zone_picking.js?v=#{mod_version}"
171
+ type="module"
172
+ />
173
+ <script
174
+ id="script_demo_location_content_transfer"
175
+ t-attf-src="/shopfloor_mobile/static/wms/src/demo/demo.location_content_transfer.js?v=#{mod_version}"
176
+ type="module"
177
+ />
178
+ </xpath>
179
+ </template>
180
+ </odoo>