odoo-addon-stock-barcodes 15.0.2.0.0.7__py3-none-any.whl → 15.0.3.0.0__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/stock_barcodes/README.rst +1 -1
- odoo/addons/stock_barcodes/__manifest__.py +1 -1
- odoo/addons/stock_barcodes/i18n/it.po +5 -5
- odoo/addons/stock_barcodes/i18n/stock_barcodes.pot +107 -7
- odoo/addons/stock_barcodes/models/stock_barcodes_option.py +16 -0
- odoo/addons/stock_barcodes/models/stock_move_line.py +12 -2
- odoo/addons/stock_barcodes/models/stock_picking_type.py +10 -6
- odoo/addons/stock_barcodes/models/stock_quant.py +21 -2
- odoo/addons/stock_barcodes/static/description/index.html +1 -2
- odoo/addons/stock_barcodes/static/src/css/stock.scss +17 -0
- odoo/addons/stock_barcodes/static/src/js/basic_controller.js +10 -0
- odoo/addons/stock_barcodes/views/stock_barcodes_menu.xml +1 -0
- odoo/addons/stock_barcodes/views/stock_barcodes_option_view.xml +8 -0
- odoo/addons/stock_barcodes/views/stock_picking_views.xml +1 -0
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read.py +116 -23
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory.py +27 -11
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory_views.xml +35 -1
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking.py +129 -37
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking_views.xml +10 -1
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo.py +2 -7
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo_view.xml +13 -1
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_views.xml +57 -16
- {odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info → odoo_addon_stock_barcodes-15.0.3.0.0.dist-info}/METADATA +2 -2
- {odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info → odoo_addon_stock_barcodes-15.0.3.0.0.dist-info}/RECORD +26 -26
- {odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info → odoo_addon_stock_barcodes-15.0.3.0.0.dist-info}/WHEEL +1 -1
- {odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info → odoo_addon_stock_barcodes-15.0.3.0.0.dist-info}/top_level.txt +0 -0
@@ -66,6 +66,14 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
66
66
|
show_detailed_operations = fields.Boolean(
|
67
67
|
related="option_group_id.show_detailed_operations"
|
68
68
|
)
|
69
|
+
keep_screen_values = fields.Boolean(related="option_group_id.keep_screen_values")
|
70
|
+
# Extended from stock_barcodes_read base model
|
71
|
+
total_product_uom_qty = fields.Float(compute="_compute_total_product")
|
72
|
+
total_product_qty_done = fields.Float(compute="_compute_total_product")
|
73
|
+
# Technical fields to compute locations domain based on picking location
|
74
|
+
picking_location_id = fields.Many2one(related="picking_id.location_id")
|
75
|
+
picking_location_dest_id = fields.Many2one(related="picking_id.location_dest_id")
|
76
|
+
company_id = fields.Many2one(related="picking_id.company_id")
|
69
77
|
|
70
78
|
@api.depends("todo_line_id")
|
71
79
|
def _compute_todo_line_display_ids(self):
|
@@ -81,17 +89,24 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
81
89
|
else:
|
82
90
|
self.pending_move_ids = False
|
83
91
|
|
92
|
+
@api.depends("todo_line_ids")
|
84
93
|
def _compute_move_line_ids(self):
|
85
94
|
self.move_line_ids = self.picking_id.move_line_ids.filtered("qty_done").sorted(
|
86
|
-
|
95
|
+
key=lambda sml: (sml.write_date, sml.create_date), reverse=True
|
87
96
|
)
|
88
97
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
98
|
+
@api.depends("picking_id.move_line_ids.qty_done")
|
99
|
+
def _compute_total_product(self):
|
100
|
+
self.total_product_uom_qty = 0.0
|
101
|
+
self.total_product_qty_done = 0.0
|
102
|
+
for rec in self:
|
103
|
+
product_moves = rec.picking_id.move_lines.filtered(
|
104
|
+
lambda ln: ln.product_id.ids == self.product_id.ids
|
105
|
+
and ln.state != "cancel"
|
106
|
+
)
|
107
|
+
for line in product_moves:
|
108
|
+
rec.total_product_uom_qty += line.product_uom_qty
|
109
|
+
rec.total_product_qty_done += line.quantity_done
|
95
110
|
|
96
111
|
def name_get(self):
|
97
112
|
return [
|
@@ -180,6 +195,16 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
180
195
|
move_lines = self.get_sorted_move_lines(self.get_moves_or_move_lines())
|
181
196
|
self.env["wiz.stock.barcodes.read.todo"].fill_records(self, [move_lines])
|
182
197
|
|
198
|
+
@api.model
|
199
|
+
def _get_fields_filled_special(self):
|
200
|
+
return [
|
201
|
+
"location_id",
|
202
|
+
"location_dest_id",
|
203
|
+
"package_id",
|
204
|
+
"result_package_id",
|
205
|
+
"product_qty",
|
206
|
+
]
|
207
|
+
|
183
208
|
def determine_todo_action(self, forced_todo_line=False):
|
184
209
|
self.visible_force_done = self.env.context.get("visible_force_done", False)
|
185
210
|
if not self.option_group_id.barcode_guided_mode == "guided":
|
@@ -205,33 +230,33 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
205
230
|
self.location_id = move_line.location_id
|
206
231
|
elif self.picking_type_code != "incoming":
|
207
232
|
self.location_id = False
|
208
|
-
|
209
233
|
if self.option_group_id.get_option_value("location_dest_id", "filled_default"):
|
210
234
|
self.location_dest_id = move_line.location_dest_id
|
211
235
|
elif self.picking_type_code != "outgoing":
|
212
236
|
self.location_dest_id = False
|
213
|
-
|
214
237
|
if self.option_group_id.get_option_value("package_id", "filled_default"):
|
215
238
|
self.package_id = move_line.package_id
|
216
239
|
if not self.keep_result_package and self.option_group_id.get_option_value(
|
217
240
|
"result_package_id", "filled_default"
|
218
241
|
):
|
219
242
|
self.result_package_id = move_line.result_package_id
|
220
|
-
|
221
|
-
if self.option_group_id.get_option_value("product_id", "filled_default"):
|
222
|
-
self.product_id = move_line.product_id
|
223
|
-
else:
|
224
|
-
self.product_id = False
|
225
|
-
if self.option_group_id.get_option_value("lot_id", "filled_default"):
|
226
|
-
self.lot_id = move_line.lot_id
|
227
|
-
else:
|
228
|
-
self.lot_id = False
|
229
243
|
if self.option_group_id.get_option_value("product_qty", "filled_default"):
|
230
244
|
self.product_qty = move_line.product_uom_qty - move_line.qty_done
|
231
245
|
else:
|
232
246
|
if not self.visible_force_done:
|
233
247
|
self.product_qty = 0.0
|
248
|
+
# Try to fill data of any field defined in options
|
249
|
+
processed_fields = self._get_fields_filled_special()
|
250
|
+
for option in self.option_group_id.option_ids:
|
251
|
+
if option.field_name in processed_fields:
|
252
|
+
continue
|
253
|
+
if option.filled_default:
|
254
|
+
self[option.field_name] = move_line[option.field_name]
|
255
|
+
else:
|
256
|
+
if not self.env.context.get("skip_clean_values", False):
|
257
|
+
self[option.field_name] = False
|
234
258
|
self.update_fields_after_determine_todo(move_line)
|
259
|
+
self.action_show_step()
|
235
260
|
|
236
261
|
def update_fields_after_determine_todo(self, move_line):
|
237
262
|
self.picking_product_qty = move_line.qty_done
|
@@ -246,14 +271,18 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
246
271
|
move_dic = self._process_stock_move_line()
|
247
272
|
if move_dic:
|
248
273
|
self[self._field_candidate_ids].scan_count += 1
|
249
|
-
self.action_clean_values()
|
250
274
|
if self.env.context.get("force_create_move"):
|
251
275
|
self.move_line_ids.barcode_scan_state = "done_forced"
|
252
|
-
self.
|
276
|
+
if not self.keep_screen_values or self.todo_line_id.state != "pending":
|
277
|
+
if not self.env.context.get("skip_clean_values", False):
|
278
|
+
self.action_clean_values()
|
279
|
+
self.determine_todo_action()
|
280
|
+
else:
|
281
|
+
self.action_show_step()
|
253
282
|
# Now we can add read log with details.
|
254
283
|
_logger.info("Add scanned log barcode:{}".format(self.barcode))
|
255
284
|
self._add_read_log(log_detail=move_dic)
|
256
|
-
return
|
285
|
+
return move_dic
|
257
286
|
# Add read log normally.
|
258
287
|
_logger.info("Add scanned log barcode:{}".format(self.barcode))
|
259
288
|
self._add_read_log()
|
@@ -359,6 +388,7 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
359
388
|
and l.product_id == self.product_id
|
360
389
|
)
|
361
390
|
)
|
391
|
+
# Try to reuse existing stock move lines updating locations
|
362
392
|
if not candidate_lines:
|
363
393
|
location_option = self.option_group_id.option_ids.filtered(
|
364
394
|
lambda op: op.field_name == "location_id"
|
@@ -368,6 +398,7 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
368
398
|
lambda l: (
|
369
399
|
l.location_dest_id == self.location_dest_id
|
370
400
|
and l.product_id == self.product_id
|
401
|
+
and l.location_id == self.picking_location_id
|
371
402
|
)
|
372
403
|
)
|
373
404
|
if candidate_lines and self.location_id:
|
@@ -381,6 +412,7 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
381
412
|
lambda l: (
|
382
413
|
l.location_id == self.location_id
|
383
414
|
and l.product_id == self.product_id
|
415
|
+
and l.location_dest_id == self.picking_location_dest_id
|
384
416
|
)
|
385
417
|
)
|
386
418
|
if candidate_lines and self.location_dest_id:
|
@@ -391,6 +423,18 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
391
423
|
"""To be extended for other modules"""
|
392
424
|
domain = []
|
393
425
|
if self.env.user.has_group("stock.group_tracking_lot"):
|
426
|
+
# Check if sml is created with complete content so we fill result package to
|
427
|
+
# set the complete package
|
428
|
+
if (
|
429
|
+
len(self.package_id.quant_ids) == 1
|
430
|
+
and float_compare(
|
431
|
+
self.package_id.quant_ids.quantity,
|
432
|
+
self.product_qty,
|
433
|
+
precision_rounding=self.product_id.uom_id.rounding,
|
434
|
+
)
|
435
|
+
== 0
|
436
|
+
):
|
437
|
+
self.result_package_id = self.package_id
|
394
438
|
domain.extend(
|
395
439
|
[
|
396
440
|
("package_id", "=", self.package_id.id),
|
@@ -458,15 +502,9 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
458
502
|
candidate_domain = self._get_candidate_line_domain()
|
459
503
|
if candidate_domain:
|
460
504
|
lines = lines.filtered_domain(candidate_domain)
|
461
|
-
#
|
505
|
+
# Take into account all smls to get a line to update
|
462
506
|
if not lines:
|
463
|
-
lines = candidate_lines.filtered(
|
464
|
-
lambda ln: (
|
465
|
-
ln.lot_id == self.lot_id
|
466
|
-
and ln.product_uom_qty == 0.0
|
467
|
-
and ln.qty_done > 0.0
|
468
|
-
)
|
469
|
-
)
|
507
|
+
lines = candidate_lines.filtered(lambda ln: (ln.lot_id == self.lot_id))
|
470
508
|
if candidate_domain:
|
471
509
|
lines = lines.filtered_domain(candidate_domain)
|
472
510
|
available_qty = self.product_qty
|
@@ -496,9 +534,18 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
496
534
|
)
|
497
535
|
else:
|
498
536
|
assigned_qty = available_qty
|
537
|
+
# Not increase qty done if user reads a complete package
|
538
|
+
if (
|
539
|
+
self.result_package_id
|
540
|
+
and self.package_id
|
541
|
+
and self.result_package_id == self.package_id
|
542
|
+
):
|
543
|
+
qty_done = assigned_qty
|
544
|
+
else:
|
545
|
+
qty_done = line.qty_done + assigned_qty
|
499
546
|
sml_vals.update(
|
500
547
|
{
|
501
|
-
"qty_done":
|
548
|
+
"qty_done": qty_done,
|
502
549
|
"result_package_id": self.result_package_id.id,
|
503
550
|
}
|
504
551
|
)
|
@@ -538,17 +585,42 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
538
585
|
):
|
539
586
|
# Create an extra stock move line if this product has an
|
540
587
|
# initial demand.
|
588
|
+
# When the sml is created we need to link to a stock move but user can read
|
589
|
+
# any other product in guided mode so we must ensure that the sm linked to
|
590
|
+
# moves todo records have the same product. If not we search any sm linked
|
591
|
+
# to the picking.
|
592
|
+
moves_to_link = moves_todo.filtered(
|
593
|
+
lambda mv: mv.product_id == self.product_id
|
594
|
+
)
|
595
|
+
move_to_link_in_todo_line = True
|
596
|
+
if not moves_to_link:
|
597
|
+
move_to_link_in_todo_line = False
|
598
|
+
moves_to_link = self.picking_id.move_lines.filtered(
|
599
|
+
lambda mv: mv.product_id == self.product_id
|
600
|
+
)
|
541
601
|
stock_move_lines = self.create_new_stock_move_line(
|
542
|
-
|
602
|
+
moves_to_link, available_qty
|
543
603
|
)
|
544
604
|
for sml in stock_move_lines:
|
545
605
|
if not sml.move_id:
|
546
606
|
self.create_new_stock_move(sml)
|
547
607
|
move_lines_dic[sml.id] = sml.qty_done
|
608
|
+
# Ensure that the state of stock_move linked to the sml read is assigned
|
609
|
+
stock_move_lines.move_id.filtered(
|
610
|
+
lambda sm: sm.state == "draft"
|
611
|
+
).state = "assigned"
|
548
612
|
# When create new stock move lines and we are in guided mode we need
|
549
613
|
# link this new lines to the todo line details
|
550
614
|
if self.option_group_id.barcode_guided_mode == "guided":
|
551
|
-
|
615
|
+
# If user scan a product distinct of the todo line we need link to other
|
616
|
+
# alternative move
|
617
|
+
if move_to_link_in_todo_line:
|
618
|
+
todo_line = self.todo_line_id
|
619
|
+
else:
|
620
|
+
todo_line = self.todo_line_ids.filtered(
|
621
|
+
lambda ln: ln.product_id == self.product_id
|
622
|
+
)
|
623
|
+
todo_line.line_ids = [(4, sml.id) for sml in stock_move_lines]
|
552
624
|
elif self.option_group_id.show_pending_moves:
|
553
625
|
# TODO: Check performance with a lot records
|
554
626
|
self.fill_todo_records()
|
@@ -582,10 +654,6 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
582
654
|
new_move = self.env["stock.move"].create(vals)
|
583
655
|
sml.move_id = new_move
|
584
656
|
|
585
|
-
def filter_sml(self, candidate_lines, lines, sml_vals):
|
586
|
-
"""Empty method that needs to be implemented in other modules."""
|
587
|
-
return lines
|
588
|
-
|
589
657
|
def update_fields_after_process_stock(self, moves):
|
590
658
|
self.picking_product_qty = sum(moves.mapped("quantity_done"))
|
591
659
|
|
@@ -699,8 +767,25 @@ class WizStockBarcodesReadPicking(models.TransientModel):
|
|
699
767
|
def action_clean_values(self):
|
700
768
|
res = super().action_clean_values()
|
701
769
|
self.selected_pending_move_id = False
|
770
|
+
self.visible_force_done = False
|
702
771
|
return res
|
703
772
|
|
773
|
+
def _option_required_hook(self, option_required):
|
774
|
+
if (
|
775
|
+
option_required.field_name == "location_dest_id"
|
776
|
+
and self.option_group_id.use_location_dest_putaway
|
777
|
+
):
|
778
|
+
self.location_dest_id = self.picking_id.location_dest_id.with_context(
|
779
|
+
avoid_location_with_reserve=True
|
780
|
+
)._get_putaway_strategy(
|
781
|
+
self.product_id,
|
782
|
+
self.product_qty,
|
783
|
+
self.result_package_id,
|
784
|
+
self.packaging_id,
|
785
|
+
)
|
786
|
+
return bool(self.location_dest_id)
|
787
|
+
return super()._option_required_hook(option_required)
|
788
|
+
|
704
789
|
|
705
790
|
class WizCandidatePicking(models.TransientModel):
|
706
791
|
"""
|
@@ -811,10 +896,17 @@ class WizCandidatePicking(models.TransientModel):
|
|
811
896
|
return wiz.action_cancel()
|
812
897
|
|
813
898
|
def _get_picking_to_validate(self):
|
899
|
+
"""Inject context show_picking_type_action_tree to redirect to picking list
|
900
|
+
after validate picking in barcodes environment.
|
901
|
+
The stock_barcodes_validate_picking key allows to know when a picking has been
|
902
|
+
validated from stock barcodes interface.
|
903
|
+
"""
|
814
904
|
return (
|
815
905
|
self.env["stock.picking"]
|
816
906
|
.browse(self.env.context.get("picking_id", False))
|
817
|
-
.with_context(
|
907
|
+
.with_context(
|
908
|
+
show_picking_type_action_tree=True, stock_barcodes_validate_picking=True
|
909
|
+
)
|
818
910
|
)
|
819
911
|
|
820
912
|
def action_validate_picking(self):
|
@@ -124,6 +124,14 @@
|
|
124
124
|
<field name="picking_type_code" invisible="1" force_save="1" />
|
125
125
|
<field name="picking_id" invisible="1" force_save="1" />
|
126
126
|
<field name="show_detailed_operations" invisible="1" />
|
127
|
+
<field name="picking_location_id" invisible="1" />
|
128
|
+
<field name="picking_location_dest_id" invisible="1" />
|
129
|
+
<field name="company_id" invisible="1" />
|
130
|
+
</field>
|
131
|
+
<field name="location_id" position="attributes">
|
132
|
+
<attribute
|
133
|
+
name="domain"
|
134
|
+
>[('id', 'child_of', picking_location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id), ('usage', '!=', 'view')]</attribute>
|
127
135
|
</field>
|
128
136
|
<group name="location" position="attributes">
|
129
137
|
<attribute
|
@@ -148,6 +156,7 @@
|
|
148
156
|
force_save="1"
|
149
157
|
style="width:85%"
|
150
158
|
class="h5"
|
159
|
+
domain="[('id', 'child_of', picking_location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id), ('usage', '!=', 'view')]"
|
151
160
|
/>
|
152
161
|
</div>
|
153
162
|
</group>
|
@@ -370,7 +379,7 @@
|
|
370
379
|
help="Put in pack"
|
371
380
|
type="object"
|
372
381
|
attrs="{'invisible': ['|', ('picking_state', 'in', ('draft', 'done', 'cancel')), ('display_menu', '=', True)]}"
|
373
|
-
class="ml-auto oe_kanban_action_button btn btn-secondary btn-sm"
|
382
|
+
class="ml-auto oe_kanban_action_button btn btn-secondary btn-sm pl-3 pr-3"
|
374
383
|
groups="stock.group_tracking_lot"
|
375
384
|
data-hotkey="6"
|
376
385
|
>
|
@@ -41,9 +41,7 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
41
41
|
qty_done = fields.Float(
|
42
42
|
"Done",
|
43
43
|
digits="Product Unit of Measure",
|
44
|
-
readonly=False,
|
45
44
|
compute="_compute_qty_done",
|
46
|
-
store=True,
|
47
45
|
)
|
48
46
|
location_id = fields.Many2one(comodel_name="stock.location")
|
49
47
|
location_name = fields.Char(related="location_id.name")
|
@@ -102,7 +100,6 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
102
100
|
"package_id": line.package_id.id,
|
103
101
|
"result_package_id": line.result_package_id.id,
|
104
102
|
"uom_id": line.product_uom_id.id,
|
105
|
-
"qty_done": line.qty_done,
|
106
103
|
"product_qty_reserved": line.product_qty,
|
107
104
|
"line_ids": [(6, 0, line.ids)],
|
108
105
|
"stock_move_ids": [(6, 0, line.move_id.ids)],
|
@@ -119,7 +116,6 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
119
116
|
line.move_line_ids[:1] or line
|
120
117
|
).location_dest_id.id,
|
121
118
|
"uom_id": line.product_uom.id,
|
122
|
-
"qty_done": line.quantity_done,
|
123
119
|
"product_qty_reserved": line.move_line_ids
|
124
120
|
and sum(line.move_line_ids.mapped("product_qty"))
|
125
121
|
or line.product_uom_qty,
|
@@ -133,7 +129,6 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
133
129
|
vals["product_uom_qty"] += line.product_uom_qty
|
134
130
|
if wiz_barcode.option_group_id.source_pending_moves == "move_line_ids":
|
135
131
|
vals["product_qty_reserved"] += line.product_qty
|
136
|
-
vals["qty_done"] += line.qty_done
|
137
132
|
vals["line_ids"][0][2].append(line.id)
|
138
133
|
vals["stock_move_ids"][0][2].append(line.move_id.id)
|
139
134
|
else:
|
@@ -142,7 +137,6 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
142
137
|
and sum(line.move_line_ids.mapped("product_qty"))
|
143
138
|
or line.product_uom_qty
|
144
139
|
)
|
145
|
-
vals["qty_done"] += line.quantity_done
|
146
140
|
vals["line_ids"][0][2].extend(line.move_line_ids.ids)
|
147
141
|
vals["stock_move_ids"][0][2].extend(line.ids)
|
148
142
|
return vals
|
@@ -195,7 +189,7 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
195
189
|
@api.depends("line_ids.qty_done")
|
196
190
|
def _compute_qty_done(self):
|
197
191
|
for rec in self:
|
198
|
-
rec.qty_done = sum(ln.
|
192
|
+
rec.qty_done = sum(ln.qty_done for ln in rec.line_ids)
|
199
193
|
|
200
194
|
@api.depends(
|
201
195
|
"line_ids",
|
@@ -243,4 +237,5 @@ class WizStockBarcodesReadTodo(models.TransientModel):
|
|
243
237
|
self.line_ids.mapped("qty_done")
|
244
238
|
)
|
245
239
|
self.wiz_barcode_id.product_uom_id = self.uom_id
|
240
|
+
self.wiz_barcode_id.action_show_step()
|
246
241
|
self.wiz_barcode_id._set_focus_on_qty_input()
|
@@ -129,14 +129,26 @@
|
|
129
129
|
</button>
|
130
130
|
</div>
|
131
131
|
<div class="col-3">
|
132
|
+
<button
|
133
|
+
name="action_todo_next"
|
134
|
+
type="object"
|
135
|
+
class="btn btn-warning pull-right btn-sm"
|
136
|
+
context="{'wiz_barcode_id': parent.id}"
|
137
|
+
data-hotkey="3"
|
138
|
+
attrs="{'invisible': [('qty_done', '=', 0.0)]} "
|
139
|
+
>
|
140
|
+
Ignore rest
|
141
|
+
</button>
|
132
142
|
<button
|
133
143
|
name="action_todo_next"
|
134
144
|
type="object"
|
135
145
|
class="btn btn-danger pull-right btn-sm"
|
136
146
|
context="{'wiz_barcode_id': parent.id}"
|
137
147
|
data-hotkey="3"
|
148
|
+
attrs="{'invisible': [('qty_done', '!=', 0.0)]} "
|
149
|
+
confirm="You have not set any quantity to this operation and it will be removed from pending moves. Are you sure?"
|
138
150
|
>
|
139
|
-
|
151
|
+
Ignore rest
|
140
152
|
</button>
|
141
153
|
</div>
|
142
154
|
<div class="col-3">
|
@@ -312,8 +312,20 @@
|
|
312
312
|
class="col text-center pr-0"
|
313
313
|
name="total_qty_header"
|
314
314
|
>
|
315
|
-
<div
|
316
|
-
|
315
|
+
<div
|
316
|
+
attrs="{'invisible': [('total_product_uom_qty', '=', 0.0)]}"
|
317
|
+
>
|
318
|
+
<span>(<field
|
319
|
+
name="total_product_qty_done"
|
320
|
+
readonly="1"
|
321
|
+
/> / <field
|
322
|
+
name="total_product_uom_qty"
|
323
|
+
readonly="1"
|
324
|
+
/>) <field
|
325
|
+
name="product_uom_id"
|
326
|
+
options="{'no_open': True}"
|
327
|
+
readonly="1"
|
328
|
+
/></span>
|
317
329
|
</div>
|
318
330
|
</div>
|
319
331
|
</div>
|
@@ -404,26 +416,54 @@
|
|
404
416
|
</group>
|
405
417
|
</div>
|
406
418
|
<div class="oe_stock_barcodes_bottombar d-flex">
|
407
|
-
<field
|
408
|
-
name="manual_entry"
|
409
|
-
widget="FieldBarcodeBooleanToggle"
|
410
|
-
data-hotkey="5"
|
411
|
-
attrs="{'invisible': [('display_menu', '=', True)]}"
|
412
|
-
/>
|
413
419
|
<field name="display_menu" invisible="1" />
|
414
|
-
<
|
415
|
-
|
420
|
+
<div
|
421
|
+
class="btn-group dropup"
|
422
|
+
attrs="{'invisible': [('display_menu', '=', True)]}"
|
423
|
+
>
|
424
|
+
<a
|
425
|
+
type="button"
|
426
|
+
class="btn btn-secondary dropdown-toggle d-lg-none"
|
427
|
+
data-toggle="dropdown"
|
428
|
+
aria-haspopup="true"
|
429
|
+
aria-expanded="false"
|
430
|
+
>
|
431
|
+
<i class="fa fa-cogs" />
|
432
|
+
</a>
|
433
|
+
<div
|
434
|
+
class="dropdown-menu pl-2 pr-2 d-lg-flex-no-dropdown"
|
435
|
+
style="min-width: 200px"
|
436
|
+
>
|
437
|
+
<div name="manual_entry" class="d-flex">
|
438
|
+
<field
|
439
|
+
name="manual_entry"
|
440
|
+
widget="FieldBarcodeBooleanToggle"
|
441
|
+
data-hotkey="5"
|
442
|
+
/>
|
443
|
+
<label for="manual_entry">
|
444
|
+
Edit
|
445
|
+
</label>
|
446
|
+
</div>
|
447
|
+
</div>
|
448
|
+
</div>
|
449
|
+
<div
|
450
|
+
class="d-flex pl-1 pr-1 d-lg-none"
|
451
|
+
style="width: 75px;flex-wrap: wrap;"
|
416
452
|
attrs="{'invisible': [('display_menu', '=', True)]}"
|
417
453
|
>
|
418
|
-
|
419
|
-
|
454
|
+
<i
|
455
|
+
name="manual_entry"
|
456
|
+
class="fa fa-hand-paper-o text-info mr-1"
|
457
|
+
attrs="{'invisible': [('manual_entry', '=', False)]}"
|
458
|
+
/>
|
459
|
+
</div>
|
420
460
|
<!-- HACK: To avoid inheritance crash -->
|
421
461
|
<button name="action_manual_entry" invisible="1" />
|
422
462
|
<!-- // -->
|
423
463
|
<button
|
424
464
|
name="action_clean_values"
|
425
465
|
type="object"
|
426
|
-
class="btn-warning ml-auto oe_kanban_action_button btn-sm"
|
466
|
+
class="btn-warning ml-auto oe_kanban_action_button btn-sm pl-3 pr-3"
|
427
467
|
attrs="{'invisible': [('display_menu', '=', True)]}"
|
428
468
|
data-hotkey="7"
|
429
469
|
>
|
@@ -432,7 +472,7 @@
|
|
432
472
|
<button
|
433
473
|
name="action_confirm"
|
434
474
|
type="object"
|
435
|
-
class="btn-success ml-auto oe_kanban_action_button btn-sm"
|
475
|
+
class="btn-success ml-auto oe_kanban_action_button btn-sm pl-3 pr-3"
|
436
476
|
attrs="{'invisible': ['|', '|','&', ('is_manual_confirm', '=', False), ('manual_entry', '=', False), ('display_menu', '=', True), ('visible_force_done', '=', True)]}"
|
437
477
|
data-hotkey="8"
|
438
478
|
>
|
@@ -443,13 +483,14 @@
|
|
443
483
|
type="object"
|
444
484
|
icon="fa-check"
|
445
485
|
attrs="{'invisible': [('visible_force_done', '=', False)]}"
|
446
|
-
class="btn-danger ml-auto oe_kanban_action_button btn-sm"
|
486
|
+
class="btn-danger ml-auto oe_kanban_action_button btn-sm pl-3 pr-3"
|
487
|
+
style="width: 50px"
|
447
488
|
data-hotkey="8"
|
448
489
|
/>
|
449
490
|
<button
|
450
491
|
name="open_actions"
|
451
492
|
type="object"
|
452
|
-
class="ml-auto oe_kanban_action_button btn-sm"
|
493
|
+
class="ml-auto oe_kanban_action_button btn-sm pl-3 pr-3"
|
453
494
|
attrs="{'invisible': [('display_menu', '=', True)]}"
|
454
495
|
data-hotkey="0"
|
455
496
|
>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odoo-addon-stock-barcodes
|
3
|
-
Version: 15.0.
|
3
|
+
Version: 15.0.3.0.0
|
4
4
|
Summary: It provides read barcode on stock operations.
|
5
5
|
Home-page: https://github.com/OCA/stock-logistics-barcode
|
6
6
|
Author: Tecnativa, Odoo Community Association (OCA)
|
@@ -24,7 +24,7 @@ Stock Barcodes
|
|
24
24
|
!! This file is generated by oca-gen-addon-readme !!
|
25
25
|
!! changes will be overwritten. !!
|
26
26
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
27
|
-
!! source digest: sha256:
|
27
|
+
!! source digest: sha256:c5625a58cedcafe2e8c00ccf9af27ed7bae315c53b5c2a8fb485e477addd895e
|
28
28
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
29
29
|
|
30
30
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
@@ -1,21 +1,21 @@
|
|
1
|
-
odoo/addons/stock_barcodes/README.rst,sha256=
|
1
|
+
odoo/addons/stock_barcodes/README.rst,sha256=tA0Utl5gtWWOXbcARqbqtn5_o9EwxEzpvY9DE7TRS0A,7000
|
2
2
|
odoo/addons/stock_barcodes/__init__.py,sha256=GJDFROBciW9KNOlikIfV-4Gu8TPCJRp8ZWZCxngbDtI,206
|
3
|
-
odoo/addons/stock_barcodes/__manifest__.py,sha256=
|
3
|
+
odoo/addons/stock_barcodes/__manifest__.py,sha256=yPjZhYyb7MhaSXcNwyQRQvqjSY4KoZvotpyahat-WTQ,1721
|
4
4
|
odoo/addons/stock_barcodes/hooks.py,sha256=XramAPbWa-q40rEpW_LmnNpnF-aMd_WseYb_kyG3ntQ,525
|
5
5
|
odoo/addons/stock_barcodes/data/stock_barcodes_action.xml,sha256=BYvm7V39dkqfLPCtNVpYKzqinOaIuRGCjTz9Fo5U3m4,1889
|
6
6
|
odoo/addons/stock_barcodes/data/stock_barcodes_option.xml,sha256=gBDOLurvDcRlBRg7Ni2_Uk_an9uJOpRM55LiRl9u7aA,20711
|
7
7
|
odoo/addons/stock_barcodes/i18n/es.po,sha256=dxFchT0X0pOvpwGz22YT_AUfftm6MsHk6FO01wEv3s0,85306
|
8
|
-
odoo/addons/stock_barcodes/i18n/it.po,sha256=
|
9
|
-
odoo/addons/stock_barcodes/i18n/stock_barcodes.pot,sha256
|
8
|
+
odoo/addons/stock_barcodes/i18n/it.po,sha256=uoA8aWeulrFrrLbKWlrAkDQPCtAQqlHlkTrHIr5U1ls,82275
|
9
|
+
odoo/addons/stock_barcodes/i18n/stock_barcodes.pot,sha256=21r2Nf_xFvJAET-jl2hCxv9DmvnJsCgGmZd_DqyOwro,75671
|
10
10
|
odoo/addons/stock_barcodes/migrations/15.0.1.0.0/pre-migration.py,sha256=HAhq_Q8pCUpu8vHs0ukSTFX7RmEvurJDN2M49HTGomI,400
|
11
11
|
odoo/addons/stock_barcodes/models/__init__.py,sha256=vDwn77QfdOHXvQS_g4_Xjj7jWYX7WGoahPzpttpIgko,227
|
12
12
|
odoo/addons/stock_barcodes/models/stock_barcodes_action.py,sha256=fz-Ua705YkuVXKuGx9oItAB5Q5eq7i5hy0L9S68SsII,1997
|
13
|
-
odoo/addons/stock_barcodes/models/stock_barcodes_option.py,sha256=
|
13
|
+
odoo/addons/stock_barcodes/models/stock_barcodes_option.py,sha256=mG0TRv6LohNTVQFj9NNXt5k8m33pmwjjGAKXvEEaYcE,4735
|
14
14
|
odoo/addons/stock_barcodes/models/stock_barcodes_read_log.py,sha256=MXm4gKUDjmS8SoM-ZB5hb4NH6p9SdCo2vebinzP9270,2084
|
15
|
-
odoo/addons/stock_barcodes/models/stock_move_line.py,sha256=
|
15
|
+
odoo/addons/stock_barcodes/models/stock_move_line.py,sha256=rMdeYBdpjLUSI7YZmu11Irfy8eEmS-AerU_WBxc6-7M,1815
|
16
16
|
odoo/addons/stock_barcodes/models/stock_picking.py,sha256=Z6df9Y-dUCqTyqg6UKXXSNyRwTExz8ztUu2cF87IbdI,2151
|
17
|
-
odoo/addons/stock_barcodes/models/stock_picking_type.py,sha256=
|
18
|
-
odoo/addons/stock_barcodes/models/stock_quant.py,sha256
|
17
|
+
odoo/addons/stock_barcodes/models/stock_picking_type.py,sha256=jtF5GHtE4iapX33hhLKIXyyNsMsmYADYlXDD29bXQSY,2795
|
18
|
+
odoo/addons/stock_barcodes/models/stock_quant.py,sha256=2QdFE59Evu-9zyNVa8XUxPp4pOf2oGvldG3w_x5PItY,1038
|
19
19
|
odoo/addons/stock_barcodes/readme/CONTRIBUTORS.rst,sha256=YwIWfY0nMK40FKKAJnRLWWlTZIJmEQtfr1mq3dAuWWc,317
|
20
20
|
odoo/addons/stock_barcodes/readme/DESCRIPTION.rst,sha256=fMAHjb-c2tqBWN0iQ6VcYCDx6jn4PwWfxPjXwEEjOAI,273
|
21
21
|
odoo/addons/stock_barcodes/readme/HISTORY.rst,sha256=pKGjt3TefR5ZnrjyLQxXP-6lDM0uX-KQoHlgBPXdE3k,374
|
@@ -24,12 +24,12 @@ odoo/addons/stock_barcodes/readme/USAGE.rst,sha256=I3vBT7ih0lReN147-tDO6imDTuHWs
|
|
24
24
|
odoo/addons/stock_barcodes/security/ir.model.access.csv,sha256=GUAIZrn35Oh4aTIr7qJmtrWwNg8BvP1avdIzQhiOPIE,1584
|
25
25
|
odoo/addons/stock_barcodes/static/description/icon.png,sha256=7ksDD35buxE_kBLoeXUGbdSW_5n-LC4S-SnQSs9tz1A,2994
|
26
26
|
odoo/addons/stock_barcodes/static/description/icon.svg,sha256=aMrHV2Isu4t_jJlnLVYqbcL_icg9wT2eSSAKxQ3pgDA,69299
|
27
|
-
odoo/addons/stock_barcodes/static/description/index.html,sha256=
|
27
|
+
odoo/addons/stock_barcodes/static/description/index.html,sha256=KdpwvRHrQleWo_BsubFFX8kKN_3tGQKKUF5T6IsX1NA,19068
|
28
28
|
odoo/addons/stock_barcodes/static/src/css/stock.css,sha256=6U9n2kttW8cXYWMU04eEtHmY6-7Bcn3o1LAMCpC5J3c,121
|
29
|
-
odoo/addons/stock_barcodes/static/src/css/stock.scss,sha256=
|
29
|
+
odoo/addons/stock_barcodes/static/src/css/stock.scss,sha256=w8oMsOijg8cwC5uDefUr-PFMHB_NNMgK3roONAK5OLY,1984
|
30
30
|
odoo/addons/stock_barcodes/static/src/img/scan.png,sha256=DIN3r_B9kzMGmeRpqSx8K0S7RO8_FEwZudxGUYIPqSM,5405
|
31
31
|
odoo/addons/stock_barcodes/static/src/js/barcodes_models_mixin.js,sha256=nxO5UIFc0t3_i4qpp_RwEZOBx_yKR5HKBf51tn2fqAw,1062
|
32
|
-
odoo/addons/stock_barcodes/static/src/js/basic_controller.js,sha256=
|
32
|
+
odoo/addons/stock_barcodes/static/src/js/basic_controller.js,sha256=300tHIeY3LsJN1WzGW_1cg8E3cxUG2iU5foCPrQeexE,15620
|
33
33
|
odoo/addons/stock_barcodes/static/src/js/basic_fields.js,sha256=1jpTQE_mc6tPNqUFDaFzKyG7eF5emcNnnkyjmUZaMa4,2176
|
34
34
|
odoo/addons/stock_barcodes/static/src/js/form_view.js,sha256=bJlnfWkJ7POhE2CSl_sC7g0_cxAdAOGFsvLJrXLdqzo,757
|
35
35
|
odoo/addons/stock_barcodes/static/src/js/kanban_renderer.js,sha256=hTpQIqZk6hiVwB5L1DtKuwhunemOvqk9pBJvn-NkslU,1587
|
@@ -41,22 +41,22 @@ odoo/addons/stock_barcodes/tests/test_stock_barcodes.py,sha256=DvTT8Ak0nAmNOofjo
|
|
41
41
|
odoo/addons/stock_barcodes/tests/test_stock_barcodes_new_lot.py,sha256=aKdJnQv0qQgpt4xv2IHKxoOOKxByUBOcu4kUWfcqezQ,1063
|
42
42
|
odoo/addons/stock_barcodes/tests/test_stock_barcodes_picking.py,sha256=g-Eq5ZWc0LiNkIciIA_OtjzqzmSz1v8L9gI4rsQMgTg,19306
|
43
43
|
odoo/addons/stock_barcodes/views/stock_barcodes_action_view.xml,sha256=trxWfNOODRM5Qzxq4pSnmjz4bssFdE2FXxZcwdD9Utk,1706
|
44
|
-
odoo/addons/stock_barcodes/views/stock_barcodes_menu.xml,sha256=
|
45
|
-
odoo/addons/stock_barcodes/views/stock_barcodes_option_view.xml,sha256=
|
44
|
+
odoo/addons/stock_barcodes/views/stock_barcodes_menu.xml,sha256=gYfZly4O55Pn78o6cwewlIDJqyfOJPNQicsoi-4vyak,296
|
45
|
+
odoo/addons/stock_barcodes/views/stock_barcodes_option_view.xml,sha256=iUENePnzrW7pKN3RucMZ-xRs5hNB3mkDaRAPJ3ZJ-QQ,5170
|
46
46
|
odoo/addons/stock_barcodes/views/stock_location_views.xml,sha256=ZjbIEGztSEqNcl6xN4R8H0Np68Y0-K05QP-R47Sscps,716
|
47
|
-
odoo/addons/stock_barcodes/views/stock_picking_views.xml,sha256
|
47
|
+
odoo/addons/stock_barcodes/views/stock_picking_views.xml,sha256=Ulev5113Gir1CzKzoiWMp_e3cSk_OkT3btrMS_Ac5Gs,4753
|
48
48
|
odoo/addons/stock_barcodes/wizard/__init__.py,sha256=uUoIvaVAJWYetOqNRsGyYFjsBfMevz4UC3jkeZn_CTY,194
|
49
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read.py,sha256=
|
50
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory.py,sha256=
|
51
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory_views.xml,sha256=
|
52
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking.py,sha256=
|
53
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking_views.xml,sha256=
|
54
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo.py,sha256=
|
55
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo_view.xml,sha256=
|
56
|
-
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_views.xml,sha256=
|
49
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read.py,sha256=CQ5imqVVs0dDtOPkr3rngZXN6qhHXlB0CHHDbzh9U8A,32621
|
50
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory.py,sha256=OA4v2gPdiKhLReQ4ZjHTTIq_xUQbbRrERTU8JZuwR9k,5089
|
51
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory_views.xml,sha256=98XV32z771eWTeAgZ19NsL9_UOJroFJr9WqSpLDI8j4,10179
|
52
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking.py,sha256=jtno8xbvNjifvWZG1mCFIe0REOxxrpCbmpcK3lYRtr0,37556
|
53
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking_views.xml,sha256=Uujl1HPGfPF9sQWDVU6idODk821d4j8jaSuCLRRdtxs,23185
|
54
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo.py,sha256=JlfkQ4ypkZjFAvG89_fBwODVSBcZW7KDJs484d-mrug,9480
|
55
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo_view.xml,sha256=DOZKGojUd9LE0Gq2z5IRRtabx5a5i6XKBC_TXlNXPg4,9347
|
56
|
+
odoo/addons/stock_barcodes/wizard/stock_barcodes_read_views.xml,sha256=bC_08j8ZLT81iFhKhPGEb8nD6RlpT-ZfykUkvpCHjgs,33375
|
57
57
|
odoo/addons/stock_barcodes/wizard/stock_production_lot.py,sha256=-xxa2_y0Ln3THilCi5DZpauTesdtiRp9SIZiTFHff9k,2217
|
58
58
|
odoo/addons/stock_barcodes/wizard/stock_production_lot_views.xml,sha256=rsX8DUnwQVkGFfGcsYcrsfkgCh5JGmiO3BrSJilIhJc,2056
|
59
|
-
odoo_addon_stock_barcodes-15.0.
|
60
|
-
odoo_addon_stock_barcodes-15.0.
|
61
|
-
odoo_addon_stock_barcodes-15.0.
|
62
|
-
odoo_addon_stock_barcodes-15.0.
|
59
|
+
odoo_addon_stock_barcodes-15.0.3.0.0.dist-info/METADATA,sha256=LQAcQEULMsydnzWk7pyA4nSRcV3Mj5BsStUXLBbc2rc,7633
|
60
|
+
odoo_addon_stock_barcodes-15.0.3.0.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
61
|
+
odoo_addon_stock_barcodes-15.0.3.0.0.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
|
62
|
+
odoo_addon_stock_barcodes-15.0.3.0.0.dist-info/RECORD,,
|