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.
Files changed (26) hide show
  1. odoo/addons/stock_barcodes/README.rst +1 -1
  2. odoo/addons/stock_barcodes/__manifest__.py +1 -1
  3. odoo/addons/stock_barcodes/i18n/it.po +5 -5
  4. odoo/addons/stock_barcodes/i18n/stock_barcodes.pot +107 -7
  5. odoo/addons/stock_barcodes/models/stock_barcodes_option.py +16 -0
  6. odoo/addons/stock_barcodes/models/stock_move_line.py +12 -2
  7. odoo/addons/stock_barcodes/models/stock_picking_type.py +10 -6
  8. odoo/addons/stock_barcodes/models/stock_quant.py +21 -2
  9. odoo/addons/stock_barcodes/static/description/index.html +1 -2
  10. odoo/addons/stock_barcodes/static/src/css/stock.scss +17 -0
  11. odoo/addons/stock_barcodes/static/src/js/basic_controller.js +10 -0
  12. odoo/addons/stock_barcodes/views/stock_barcodes_menu.xml +1 -0
  13. odoo/addons/stock_barcodes/views/stock_barcodes_option_view.xml +8 -0
  14. odoo/addons/stock_barcodes/views/stock_picking_views.xml +1 -0
  15. odoo/addons/stock_barcodes/wizard/stock_barcodes_read.py +116 -23
  16. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory.py +27 -11
  17. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory_views.xml +35 -1
  18. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking.py +129 -37
  19. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking_views.xml +10 -1
  20. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo.py +2 -7
  21. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo_view.xml +13 -1
  22. odoo/addons/stock_barcodes/wizard/stock_barcodes_read_views.xml +57 -16
  23. {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
  24. {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
  25. {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
  26. {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
- "write_date", reverse=True
95
+ key=lambda sml: (sml.write_date, sml.create_date), reverse=True
87
96
  )
88
97
 
89
- # if self.option_group_id.show_detailed_operations:
90
- # self.move_line_ids = self.picking_id.move_line_ids.filtered(
91
- # "qty_done"
92
- # ).sorted("write_date", reverse=True)
93
- # else:
94
- # self.move_line_ids = False
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.determine_todo_action()
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 bool(move_dic)
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
- # The new lines scanned has been created without reserved quantity
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": line.qty_done + assigned_qty,
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
- moves_todo, available_qty
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
- self.todo_line_id.line_ids = [(4, sml.id) for sml in stock_move_lines]
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(show_picking_type_action_tree=True)
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._origin.qty_done for ln in rec.line_ids)
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
- Done
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
- <span>Total Qty</span>
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
- <label
415
- for="manual_entry"
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
- Edit
419
- </label>
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': ['|', '|','&amp;', ('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.2.0.0.7
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:525a93165bdee89662d7cde6315ac154e43ad2bb1db6fd2b6c4f72847a16ac6d
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=lotuZwD-PH3OgbRxE7luNFOrUiSaHFjnOtGj8nKOnZ8,7000
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=1sK1vPvdu2JwwT04lNJfbgO0hs8dhkprbQSa7xhghbw,1721
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=IbKjcUmBePxM6-fAWwu2TOWbEwJDN8pXU89AH2TYxpw,82279
9
- odoo/addons/stock_barcodes/i18n/stock_barcodes.pot,sha256=-MsixHJnFZn_TsbanrAdZ7tMwiZs0KqTg9CcqRB9OiA,71701
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=geOL6PHg8uU3HZcYX9ZOwtWc08pmuTqbZHqkj2pl-bE,4070
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=vXO9vjy_9TddkxKmUaPGPE2MiTIF7AQYtCbEdLdMAfw,1274
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=UtrS4lGG6pbPaJKlS_9_shj4R2J9kFVK80KS_gD-DI8,2675
18
- odoo/addons/stock_barcodes/models/stock_quant.py,sha256=-YHYQcUEWYPpK37xoqnFHQA9uIQGRVcLKRFcU1quBeg,421
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=6sfTwFT9sZNmCEVWBg2PWeMDz1UcQvbRGckJa8UO5Zg,19107
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=oB4vieoLq8y2wu5dp346UBti49znWnqP1goRjrdWHyI,1594
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=liuHej2J7D52Gr2YluQLPQz-BqUVbQEuJU3Qj87RXw4,15197
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=fwjKE-6gtNG8bpBUf7ND_sTQ2cElAGmxfEpWQ2EusUc,256
45
- odoo/addons/stock_barcodes/views/stock_barcodes_option_view.xml,sha256=YmQchNXo9Qh69WfzR3BAYKvwa-4Gx8cPjf_6lf_DZnI,4716
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=-X8-mj5l8iww7_Pzx7a-pcBf7qKi5Vx7d2VsNHwTjtA,4692
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=BZcg8khYno8LOvQEYKa-Q5QZqMG-8THBYq5cIdF9EWA,28671
50
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory.py,sha256=gxHMu-53SJZvvyLEuSLwBJKkBarapMCLYvabiyffwgs,4383
51
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_inventory_views.xml,sha256=JeP9ZxMFBe53PMTL5Mcw0NYtH690bvJWp66Pn7QX5NA,8366
52
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking.py,sha256=5fy-TKlBKMp3_i6ck2CLyQQyGCC9TgWfq1OtBNJhQZw,32898
53
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_picking_views.xml,sha256=011dPI-rMbk0XkBvMtFVvG6ccZux-sJse-Z_Ft-ucto,22498
54
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo.py,sha256=k7EKUgExIhhGvYtagKb-QlF-u-6BHWyKhqFUCY9u22A,9681
55
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_todo_view.xml,sha256=EdDOSfwAui4uj9yfBvXSchlrcNSfa7IdJqTrHjy3nL0,8494
56
- odoo/addons/stock_barcodes/wizard/stock_barcodes_read_views.xml,sha256=mU1aoFWZAIOWdyAd9t3dUBBRwRNFz43Ug9ZGAhOcdVQ,30997
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.2.0.0.7.dist-info/METADATA,sha256=JPst3JCA1BRxPfQOCCQJVy3WqPPU0VWvg2alBw6xmxM,7635
60
- odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
61
- odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
62
- odoo_addon_stock_barcodes-15.0.2.0.0.7.dist-info/RECORD,,
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,,