Metadata-Version: 2.1
Name: odoo-addon-stock_barcodes
Version: 18.0.1.6.0.4
Requires-Python: >=3.10
Requires-Dist: odoo-addon-stock_move_line_qty_picked==18.0.*
Requires-Dist: odoo-addon-web_widget_numeric_step==18.0.*
Requires-Dist: odoo==18.0.*
Summary: It provides read barcode on stock operations.
Home-page: https://github.com/OCA/stock-logistics-barcode
License: AGPL-3
Author: Tecnativa, Odoo Community Association (OCA)
Author-email: support@odoo-community.org
Classifier: Programming Language :: Python
Classifier: Framework :: Odoo
Classifier: Framework :: Odoo :: 18.0
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
Description-Content-Type: text/x-rst

.. image:: https://odoo-community.org/readme-banner-image
   :target: https://odoo-community.org/get-involved?utm_source=readme
   :alt: Odoo Community Association

==============
Stock Barcodes
==============

.. 
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !! This file is generated by oca-gen-addon-readme !!
   !! changes will be overwritten.                   !!
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !! source digest: sha256:1b2384fb0aa295a639f73a3994cbcb82e5e4f0c6ad533d1927f4ba0c2ffb1b58
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
    :target: https://odoo-community.org/page/development-status
    :alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
    :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
    :alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github
    :target: https://github.com/OCA/stock-logistics-barcode/tree/18.0/stock_barcodes
    :alt: OCA/stock-logistics-barcode
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
    :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-18-0/stock-logistics-barcode-18-0-stock_barcodes
    :alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
    :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-barcode&target_branch=18.0
    :alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module provides a barcode scanning interface for stock operations:
receipts, deliveries, internal transfers, relocations and inventory
adjustments.

It is designed for keyboard-wedge scanners (USB/Bluetooth) and works on
desktop and mobile browsers, without requiring the Odoo Enterprise
barcode application.

Main features:

- A scan screen for pickings and operation types, in **free** or
  **guided** mode (the screen proposes one pending move at a time and
  validates what the operator scans).
- A scan screen for **inventory adjustments** writing counted quantities
  on stock quants.
- Recognition of product, product packaging, lot/serial, package and
  location barcodes.
- A **product information** dialog with the on hand, incoming, outgoing
  and forecasted quantities and the stock by location, also used to pick
  the source or destination location among the ones with stock.
- **Barcode option groups**: a data-driven configuration of the screen
  behavior per operation type (fields to scan, required, pre-filled,
  forced, cleaned after each read, steps, backorder handling, putaway
  handling, etc.).
- A **Barcodes** main menu with configurable, printable barcode actions
  (scan an action barcode to open it).
- A base abstract wizard (``wiz.stock.barcodes.read``) that other
  modules extend (GS1, batch picking, ...).

**Table of contents**

.. contents::
   :local:

Configuration
=============

Barcodes on master data
-----------------------

The interface recognizes four kinds of barcodes. Assign them first:

Warehouse locations
~~~~~~~~~~~~~~~~~~~

1. You need the permission *Manage Multiple Stock Locations* to see the
   menu.

   |Warehouse location access|

2. Go to *Inventory > Configuration > Locations*.

3. Select the location and fill in the *Barcode* field.

   |Warehouse location barcode|

Product packagings
~~~~~~~~~~~~~~~~~~

1. You need the permission *Manage Product Packaging* to see the menu.

   |Product packaging access|

2. Go to *Inventory > Configuration > Product Packagings*.

3. Create or select a packaging and fill in the *Barcode* field.
   Scanning a packaging selects its product and proposes the packaging
   quantity.

   |Product packaging barcode|

Products
~~~~~~~~

1. Go to *Inventory > Products > Products*.
2. Fill in the *Barcode* field of each product.

Lots / serial numbers
~~~~~~~~~~~~~~~~~~~~~

The lot **name** acts as its barcode, so no extra configuration is
needed (requires *Lots & Serial Numbers* enabled).

|Product lot barcode|

Packages are matched by their name, so scanning a package label selects
the package content (requires *Packages* enabled).

Barcode option groups
---------------------

Go to *Inventory > Configuration > Barcodes > Barcode Option Groups* to
define how the scan screen behaves. The first task of an implementation
is to analyze with the customer the flow of each operation (what is
labelled, what the operator reads and in which order, whether readings
are confirmed one by one) and adjust the options below to it. The module
ships six example groups: **Picking IN**, **Picking OUT**, **Picking
Internal**, **Relocation**, **Inventory** and a generic **Operation**
fallback. The **Inventory** group is always the one used by the
inventory scan screen.

Steps to scan
~~~~~~~~~~~~~

GS1-128 labels (``stock_barcodes_gs1``) are decoded as a whole: the
product, lot and quantity they carry are set regardless of the steps.

The *Steps to scan* list defines, per field of the screen (location,
product, packaging, lot, package, destination, destination package,
quantity, owner, ...):

- **Step**: order in which the fields are asked. The current step is the
  step of the first required field still empty, and only the fields to
  scan of that step are matched against a barcode.
- **To scan**: the field can be filled by reading a barcode.
- **Required**: a reading is not processed while the field is empty.
- **Filled default**: the field is filled from the pending move (guided
  mode) or from the picking or operation type when the screen opens.
- **Forced** (guided mode): a value different from the pending move is
  rejected (*Wrong product*, *Wrong lot*, *Wrong location*).
- **Clean after done**: the field is emptied after each processed
  reading.

A field that is required but not scannable in its step can only be
filled by default, from the stock of a scanned lot or package, or by
hand in manual entry.

Screen and confirmation
~~~~~~~~~~~~~~~~~~~~~~~

- **Mode**: *Guided* proposes one pending move at a time; empty means
  free mode, where barcodes are read in any order.
- **Manual entry**: open the screen with editable fields; **Manual entry
  on edit** switches to it when a pending move is edited with the
  pencil; **Manual entry field focus** is the field focused when
  switching.
- **Is manual confirm**: scans only fill the screen and the operator
  confirms each reading. Otherwise a reading is processed as soon as the
  required fields are filled.
- **Is manual qty**: the operator always types the quantity; scans do
  not set it.
- **Ignore filled fields**: a barcode skips the required fields that
  already have a value, e.g. so that a second location barcode sets the
  destination.
- **Keep screen values**: keep the values of the screen until the
  pending move is completed.
- **Show form scan**: keep the scan fields always visible; otherwise
  they are only shown in manual entry.
- **Show stock** and **Show owner**: show the quantity available in the
  location and the owner field on the screen.
- **Display Odoo notifications**: also notify when a reading is missing
  a required field.

Pending moves
~~~~~~~~~~~~~

- **Show pending moves**: none, only pending or all (pending and done),
  built from the **operations** or the **detailed operations** (*Source
  pending moves*).
- **Group key for todo records**: expression grouping the pending moves,
  e.g. ``object.picking_id,object.product_id``.
- **Location field to sort**: sort by source or destination location (X,
  Y, Z position and name). By default the destination is used for
  receipts and internal transfers and the source for the rest.
- **Show detailed operations**: show the detailed operations already
  read on the screen.
- **Confirmed moves**: also work on moves without reservation.

Quantities
~~~~~~~~~~

- **Replace quantity on each reading**: a confirmed reading replaces the
  quantity already recorded (done quantity of the detailed operation,
  counted quantity of the inventory) instead of being added to it.
  Editing a counted inventory line from the list always replaces it.
- **Accumulate repeated readings**: with manual confirmation, reading
  the same product, lot or packaging again before confirming adds one
  unit (or packaging) to the quantity to confirm. Combined with the
  previous option, units can be counted one by one on the screen and the
  result replaces the counted quantity.
- **Allow not demanded product**: accept products outside the picking
  demand, adding a move for them.
- **Allow negative quant**: accept quantities over the stock available
  in the location, and lots without stock.

Lots, packages and locations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- **Fill fields from lot**: reading a lot or product fills product, lot,
  package, owner and location from its stock (not on receipts).
- **Ignore quant location**: when filling from stock, keep the location
  of the screen.
- **Get lots automatically** (pickings): propose the reserved lot, or
  the first one by removal strategy (not on receipts).
- **Create lots if not match**: accept new lot names; the lot is created
  with the reading in inventories and on validation in transfers.
- **Auto put in pack**: on validation of a picking of an operation type
  using the group, put its lines in a new package if none has one.
- **Use location dest. putaway**: when the destination is required and
  empty, compute it from the putaway strategy.
- **Show fixed dest. location**: show on each pending move the
  destination already planned by a fixed putaway, and make scans reuse
  that move line (see Usage).

Other
~~~~~

- **Search picking from product**: when the screen is opened from an
  operation type, reading a product opens the first or last ready
  picking containing it.
- **Read items on inventory mode**: open the inventory screen listing
  the items already counted instead of the pending ones.
- **Code**: some codes change the behavior. *IN* does not take the
  source location from the stock of a scanned lot or package, *OUT* does
  not propose its quantity in stock, and *REL* accepts quantities over
  the demand without asking.

Operation types
---------------

On each operation type (*Inventory > Configuration > Operation Types*)
you can select:

- **Barcode option group**: used when scanning the operation type or its
  pickings.
- **New picking barcode option group**: used when creating an unplanned
  picking from the barcode interface (*New* button).

The *Barcodes* tiles and the scanner button of the *Inventory >
Overview* cards only list operation types with a barcode option group.
The *Scan barcodes* button of a transfer uses the generic *Operation*
group when its operation type has none.

Barcode actions
---------------

*Inventory > Configuration > Barcodes > Barcode Actions* define the
tiles shown in the *Barcodes* main menu. Each action can have its own
barcode: scanning it from the main menu opens the action directly.

|Create barcode action|

Select actions and press *Print barcodes* to generate a PDF with their
Code128 barcodes, e.g. for a laminated menu sheet.

|Print barcodes|

System parameters
-----------------

The system parameter ``stock_barcodes.limit_product_qty`` (default
999999) rejects absurd quantities caused by scanning a barcode into a
quantity input.

.. |Warehouse location access| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/access_menu_warehouse_location.png
.. |Warehouse location barcode| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/barcode_warehouse_location.png
.. |Product packaging access| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/access_menu_product_packaging.png
.. |Product packaging barcode| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/barcode_product_packaging.png
.. |Product lot barcode| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/barcode_product_lot.png
.. |Create barcode action| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/create_barcode_action.png
.. |Print barcodes| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/print_barcodes.png

Usage
=====

The barcode scan screens recognize, in both free and guided mode:

1. Warehouse locations (barcode field).
2. Product packagings (barcode field).
3. Products (barcode field).
4. Lots / serial numbers (the barcode is the lot name).
5. Packages (matched by name).

A bell sound confirms a successful scan and an error sound signals a
rejected one. Status messages under the barcode field explain what the
screen is waiting for and why a scan was rejected. The *Manual* button
toggles manual entry to type values without a scanner.

Barcode interface for picking operations
----------------------------------------

You can open the scan screen from three places:

1. **Barcodes main menu** (app *Barcodes*): select an operation tile,
   then pick one of the ready transfers from the list.

   |Operation barcode action|

   |List picking|

2. **An operation type card** in *Inventory > Overview* (scanner
   button): scan products for any ready picking of that type. With
   *Search picking from product*, reading a product opens a ready
   picking that contains it.

3. **A specific transfer** (*Scan barcodes* button in *Inventory >
   Transfers*): the picking is locked and every scan applies to it.

   |Barcode interface picking|

Free mode
~~~~~~~~~

Scan in any order; the screen reacts to the kind of barcode read:

- **Product**: adds 1 unit (or waits for a lot if the product is
  tracked). The source location is resolved automatically from the
  pending reserved lines.
- **Packaging**: selects the product and adds the packaging quantity.
- **Lot**: scan the product first when several lots share the same name.
  When *fill fields from lot* is active, scanning a lot fills product,
  package, owner and location from the available stock.
- **Package**: fills all fields from the package content.
- **Location**: sets the source (or destination, per configuration) for
  the following scans.

Quantities beyond the picking demand or beyond available stock are not
written silently: the screen asks for confirmation (*force done*) or
rejects the scan, depending on the option group.

Product information and stock by location
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Once a product is read, the information button next to it opens a dialog
with the on hand, incoming, outgoing and forecasted quantities of the
product and its stock in each location. Deliveries and internal
transfers list first the locations the removal strategy takes stock
from; receptions list them in reverse order. Tapping a location fills
the source location, or the destination location on receptions.

The buttons next to the source and destination location fields open the
same list without the product quantities, to pick a location quickly:
the source one in removal strategy order, the destination one
(receptions and internal transfers) in reverse order.

On small screens, where the field labels are replaced by icons, these
buttons are hidden and the product and location icons become buttons
that open them instead.

Guided mode
~~~~~~~~~~~

The screen shows the next pending move (product, lot, quantities,
locations) and guides the operator step by step (e.g. *Scan Source*,
then *Scan Product, Lot*). Scanning something different from what is
expected is rejected with an explicit message (*Wrong product*, *Wrong
lot*, *Wrong location*).

In the pending moves list you can:

- Jump to another line (arrows or tapping a card).

  |List items picking|

- Edit a line with the pencil icon.

  |Edit picking|

- Put the whole remaining quantity with the *+N* button (e.g. *+120*).
  Once defined, this button disappears; use the edit icon to change the
  quantity.

  |Quantity picking|

- Show the lines already scanned with the eye icon.

  |Picking scanned|

- Decide the backorder behavior per line when quantities are incomplete
  (create backorder / no backorder / keep pending).

Validation
~~~~~~~~~~

The *Validate* button confirms the transfer using the scanned
quantities. A wizard is displayed to confirm the action; after
validation you return to the ready-pickings list.

|Confirm items picking|

If some lines have no quantity, the standard confirmation wizard asks
whether to process all quantities.

|Confirm all quantities|

With *Auto put in pack* enabled, unpacked lines are packed automatically
before validating.

Extra products, new lots and packagings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Press the *+ Product* button to add an item not in the demand (when
  the option group allows non-demanded products).

  |Add product|

  When you select a product, a numeric field is displayed to add the
  quantity.

  |Add quantity product|

  The trash can icon resets the form values (except the location)
  without closing it; *Clean values* resets everything and closes the
  form; *Confirm* adds the new item.

  |Reset data form|

- If a scanned lot does not exist on a receipt, it can be created on the
  fly (*Create lots if not match*) or through the new lot dialog.

- Unknown packagings can be registered from the scan screen with the new
  packaging dialog: scan the packaging barcode, set the name and
  confirm.

Barcode interface for inventory adjustments
-------------------------------------------

Open *Barcodes > Inventory* (or the *Scan barcodes* button of an
inventory adjustment).

|Inventory barcode action|

The screen uses the *Inventory* option group. With the location filled
by default it opens on the stock location of the first warehouse; make
the location scannable to count other locations. Then scan products,
lots, packagings or packages:

- Each product scan adds 1 unit to the counted quantity (or the
  packaging quantity when a packaging is scanned). With *Replace
  quantity on each reading*, a new reading overwrites the counted
  quantity.

- With *Accumulate repeated readings* and manual confirmation, scanning
  the same product, lot or packaging again before confirming adds one
  more unit (or packaging) to the quantity to confirm.

- Serial-tracked products accept exactly one unit per serial; a second
  read of the same serial is rejected.

- The eye icon switches between the items already counted by you and the
  pending ones.

  |List items|

- Each line in the list can be edited (pencil), incremented/decremented
  (+/-) or cleared (trash). Confirming an edited line replaces its
  counted quantity.

  |List action items|

- The *Apply* button is displayed when there are counted items. It opens
  the standard inventory adjustment confirmation (with reason), applies
  your counted quants and returns to the main menu.

  |Apply inventory|

  |Apply inventory reason|

Barcode actions
---------------

1. Go to *Barcodes*.
2. Scan an action barcode (see Configuration) to open the corresponding
   action directly, or tap its tile.

Show the planned destination location on pending moves
------------------------------------------------------

By default the pending moves list on the barcode screen shows the source
location and lot of each move. When the option group has *Show fixed
dest. location* enabled, the list also shows the **destination location
already planned on the stock move line**, so the operator sees where the
goods must be stored as soon as the picking is opened, without scanning
anything.

This only **reads** the destination resolved upstream when the move was
prepared (e.g. the putaway strategy applied at reception). It never
recomputes the putaway: putaway is a warehouse decision taken when the
move is created, not a barcode-screen concern (see *Use location dest.
putaway* for the opposite, recompute-on-scan behaviour).

In addition, with this option enabled, **scanning a product reuses the
move line already routed by putaway** and keeps its destination, instead
of creating a new line at the generic picking destination. This way
receiving by barcode keeps the goods on their planned putaway location.

To keep the shown value reliable it is displayed only for moves whose
destination has **no storage category**, i.e. a fixed putaway whose
location does not depend on the received quantity. For capacity-based
putaway (storage categories) the final location may still change on a
partial receipt, so it is intentionally not shown.

Enable it in *Inventory > Configuration > Barcode Option Groups*, on the
option group used by the operation type, with the *Show fixed dest.
location* checkbox.

.. |Operation barcode action| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/inventory_barcode_action.png
.. |List picking| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_picking.png
.. |Barcode interface picking| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/barcode_interface_picking.png
.. |List items picking| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_items_picking.png
.. |Edit picking| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_items_picking_edit.png
.. |Quantity picking| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_items_picking_quantity.png
.. |Picking scanned| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_items_picking_scanned.png
.. |Confirm items picking| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/confirm_items_picking.png
.. |Confirm all quantities| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/confirm_all_quantity_items_picking.png
.. |Add product| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/add_product.png
.. |Add quantity product| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/form_add_product_quantity.png
.. |Reset data form| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/form_add_product_reset.png
.. |Inventory barcode action| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/inventory_barcode_action.png
.. |List items| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_items.png
.. |List action items| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/list_action_items.png
.. |Apply inventory| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/apply_inventory.png
.. |Apply inventory reason| image:: https://raw.githubusercontent.com/stock_barcodes/static/src/img/apply_inventory_reason.png

Known issues / Roadmap
======================

- Execute action_done() method outside onchange environment.

- Allow create product when a barcode has not been found.

- Allow to select picking reading its barcode.

- Allow to select multiple pickings to process scanned products.

- Barcode nomenclatures: read the quantity or weight embedded in a
  barcode (e.g. EAN-13 variable weight/price prefixes), common for fresh
  food. GS1-128 is handled by ``stock_barcodes_gs1``.

- Products with several barcodes: only the product ``barcode`` field and
  the packaging barcodes are matched.

- Scrap from the scan screen (damaged goods found while picking or
  counting).

- Manufacturing orders: consume components and produce finished products
  by scanning.

- Print product, lot or package labels from the scan screen, e.g. right
  after receiving.

- Inventory: choose the option group and the default location per
  warehouse. The inventory screen always uses the *Inventory* group and
  opens on the first warehouse stock location.

- Search picking from product: order the candidate pickings by priority
  and scheduled date instead of by stock move creation. Option overlaps
  to review:

- Some behavior depends on the group code (*IN*, *OUT*, *REL*) instead
  of explicit options.

- *Auto put in pack* also applies when the picking is validated outside
  the barcode interface.

Technical debt (see ``docs/TECHNICAL.md``):

- ``action_confirm()`` persists the onchange cache through
  ``_convert_to_write(self._cache)``, relying on ORM internals.
- Rename the ``onchange_*`` helpers to ``_onchange_*`` (silent API break
  for downstream overrides, needs coordination).
- Drop the deprecated misspelled aliases (``_set_messagge_info``,
  ``check_location_contidion``, ``check_lot_contidion``) after one
  migration cycle.
- Remove unused code: ``stock.barcodes.option.message``,
  ``_scanned_location()``, the ``skip_backorder`` branch of
  ``stock.picking.button_validate()`` and the unreachable
  ``visible_force_done`` assignment for *Allow negative quant* in
  ``check_done_conditions()``.

Changelog
=========

18.0.1.6.0 (2026-10-02)
-----------------------

- [ADD] Product information: a button next to the read product opens its
  on hand, incoming, outgoing and forecasted quantities and its stock in
  each location, ordered by the removal strategy (reversed on
  receptions). Tapping a location fills the screen location.
- [ADD] Buttons next to the source and destination locations list only
  the locations with stock to pick one, the destination ones in reverse
  order. On small screens the field icons replace these buttons.

18.0.1.5.0 (2026-09-29)
-----------------------

- [IMP] *Replace quantity on each reading* (``no_increase_qty_done``)
  now also applies to inventories: a reading is added to the counted
  quantity unless it is set. *Accumulate read quantity* is renamed to
  *Accumulate repeated readings* and adds one unit (or packaging) when
  the same item is read again before a manual confirmation. The
  migration keeps the inventory behavior of each database and leaves the
  new accumulation disabled.
- [FIX] Confirming a counted inventory line edited from the list added
  its quantity again (doubling it) when readings were added; the edited
  line now always replaces its counted quantity.
- [FIX] Map the 15.0 ``move_lines`` value of *Source pending moves* to
  ``move_ids``.
- [REM] Remove the unused *Show all quantities* and *Allow direct
  partial delivery* options.

18.0.1.3.0 (2026-07-08)
-----------------------

- [FIX] Restore bus notifications broken by the 18.0 bus API: scanning
  an action barcode from the main menu (whose client-side scanner
  capture was never wired since the feature was introduced in 16.0), the
  "transfer validated" toast, the manual-edit toggle from a pending line
  and the ``display_notification()`` toasts (e.g. "Lot is required"),
  which were sent with a per-record notification type nobody subscribes
  to. Events are now sent to the scanning user only instead of a
  broadcast channel.
- [FIX] Notify only the most significant message per interaction.
  Reading a barcode triggers sequential lookups and checks that buffer
  intermediate messages (e.g. "Manual entry OK" before the availability
  check rejects the entry), and each one used to raise its own
  notification. Messages are now buffered on the wizard (last one wins,
  as the on-screen message field always behaved) and a single
  notification is sent when the read or the manual confirmation ends:
  always for errors, only in manual entry for informative messages, and
  for "Manual entry OK" only when the whole confirmation succeeded.
- [FIX] Assign serial numbers button: the core removed the
  stock.assign.serial wizard in 18.0 leaving
  stock.move.action_assign_serial() broken (missing
  stock.act_assign_serial_numbers action), so the button crashed. It now
  opens the detailed operations dialog of the pending move, where the
  core 18.0 generate-serials widget lives. Lines receiving a lot/serial
  in that dialog are counted as scanned and linked to the pending card,
  so generated serials show up on the barcode screen.
- [FIX] Show each barcode notification only once. The barcode views
  subscribed the same handler to two bus notification types, which leaks
  a listener on every render (the bus service maps subscriptions by
  callback), so each notification was displayed more and more times as
  the session went on.
- [FIX] Barcode action tile counters: the model-field check never
  matched (checked attributes on a string), so tiles counted all records
  of the model; named filters now count records matching the filter.
- [REF] Drop the ``python-barcode`` external dependency introduced by
  the 17.0 migration: barcode action images are rendered again with the
  core ``ir.actions.report.barcode()`` helper, as in 16.0.
- [REF] Remove pre-17.0 immediate-transfer leftovers, use
  ``_read_group`` aggregation, convert the report model to
  ``AbstractModel``, drop a duplicated ACL, replace deprecated ``t-esc``
  with ``t-out`` and add ``limit=1`` to singleton barcode lookups.
- [REF] Rename misspelled methods (``_set_message_info``,
  ``check_location_condition``, ``check_lot_condition``). The old names
  are kept as deprecated aliases; modules overriding them must move
  their override to the new names.

18.0.1.1.0 (2026-06-22)
-----------------------

- [ADD] New option *Show fixed dest. location* on barcode option groups.
  It shows, in the pending moves list, the destination location already
  planned on the stock move line (for a fixed putaway, destination
  without storage category), and makes a scan reuse that move line
  keeping its destination instead of duplicating it at the generic
  picking destination. It never recomputes the putaway strategy.

11.0.1.1.0 (2019-09-24)
-----------------------

- [ADD] New feature. User can uses barcode interface in picking
  operations.

13.0.1.1.1 (2021-02-06)
-----------------------

- [ADD] New feature. Add option to get lots automatically based on
  removal strategy in inventory.

14.0.1.0.0 (2021-04-05)
-----------------------

- [ADD] New feature. Add security for users.

16.0.1.0.0 (2025-01-23)
-----------------------

- [IMP] Improved views to optimize navigation and functionality.
  Intuitive and mobile-friendly views. Visual improvement of the main
  view accessed from the Barcodes menu.
- [ADD] New feature. Barcode reading to barcode actions. Generate PDF
  document for the barcodes of the selected barcode actions.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-barcode/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/stock-logistics-barcode/issues/new?body=module:%20stock_barcodes%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Tecnativa

Contributors
------------

- `Tecnativa <https://www.tecnativa.com>`__:

  - Sergio Teruel
  - Carlos Dauden
  - Pedro M. Baeza
  - Alexandre D. Díaz

- `Onestein <https://www.onestein.eu>`__:

  - Andrea Stirpe

- `InitOS <https://www.initos.com>`__:

  - Foram Shah

- `ForgeFlow <https://www.forgeflow.com>`__:

  - Lois Rilo

- Enric Tobella
- `Binhex Cloud <https://www.binhex.cloud/>`__:

  - Edilio Escalona Almira

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
   :alt: Odoo Community Association
   :target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

.. |maintainer-carlosdauden| image:: https://github.com/carlosdauden.png?size=40px
    :target: https://github.com/carlosdauden
    :alt: carlosdauden
.. |maintainer-sergio-teruel| image:: https://github.com/sergio-teruel.png?size=40px
    :target: https://github.com/sergio-teruel
    :alt: sergio-teruel

Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-carlosdauden| |maintainer-sergio-teruel| 

This module is part of the `OCA/stock-logistics-barcode <https://github.com/OCA/stock-logistics-barcode/tree/18.0/stock_barcodes>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
