Stock Barcodes

stock_barcodes
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
GIT
GIThttps://github.com/OCA/stock-logistics-barcode.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-barcode/tree/16.0/stock_barcodes
VERSION
VERSION 2.2.4
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSAlexis de Lattre, Carlos Dauden, Enric Tobella, sergio-teruel, Weblate, OCA-git-bot, oca-ci, Edilio Escalona Almira, Geyson Gualdron, Gil Arasa
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-barcode
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_widget_numeric_step
odoo/odoo:
    - barcodes
    - web
    - base
    - stock
    - product
    - mail
    - base_setup
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (18)
XML IDNameModelTypeStatus
report_barcode_actions report_barcode_actions ir.ui.view qweb New
stock_location_form_inherit stock.location.inherit stock.location group Inherits stock.view_location_form
stock_picking_kanban stock.picking xpath Inherits stock.stock_picking_kanban
stock_picking_type_kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
view_picking_form stock.picking div Inherits stock.view_picking_form
view_picking_type_form stock.picking.type xpath Inherits stock.view_picking_type_form
view_pickingtype_filter stock.picking.type field Inherits stock.view_pickingtype_filter
view_stock_barcodes_action_kanban stock.barcodes.action.kanban stock.barcodes.action kanban New
view_stock_barcodes_action_tree stock.barcodes.action.tree stock.barcodes.action tree New
view_stock_barcodes_new_lot stock.barcodes.new.lot.form wiz.stock.barcodes.new.lot form New
view_stock_barcodes_option_group_form stock.barcodes.option.group.form stock.barcodes.option.group form New
view_stock_barcodes_option_tree stock.barcodes.option.tree stock.barcodes.option tree New
view_stock_barcodes_read_form stock.barcodes.read.form wiz.stock.barcodes.read form New
view_stock_barcodes_read_form_manual_qty stock.barcodes.read.form.manual_qty wiz.stock.barcodes.read form New
view_stock_barcodes_read_inventory_form stock.barcodes.read.inventory.form wiz.stock.barcodes.read.inventory field Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_packaging_form stock.barcodes.read.packaging.form wiz.stock.barcodes.read group Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_form stock.barcodes.read.picking.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_todo_kanban stock.barcodes.todo.kanban wiz.stock.barcodes.read.todo kanban New
Models touched (16)

New fields (0)

No new fields.

Public methods (1)
  • send_bus_done(self, channel, type_channel, data=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (11)
  • action_window_id Many2one → ir.actions.act_window
    comodel_name='ir.actions.act_window' string='Action window'
  • active Boolean
    default=True
  • barcode Char
  • barcode_image Image
    attachment=True compute='_compute_barcode_image' readonly=True args: 'Barcode image'
  • context Char
  • count_elements Integer
    compute='_compute_count_elements' default=0
  • icon_class Char
  • key_char_shortcut Char
  • key_shortcut Integer
  • name Char
    translate=True
  • sequence Integer
    default=100
Public methods (3)
  • open_action(self)
  • open_inventory_action(self, ctx)
  • print_barcodes(self)

New fields (11)
  • clean_after_done Boolean
  • field_name Char
  • filled_default Boolean
  • forced Boolean
  • message Char
  • name Char
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' ondelete='cascade'
  • required Boolean
  • sequence Integer
    default=100
  • step Integer
  • to_scan Boolean
Public methods (0)

No public methods.

New fields (28)
  • accumulate_read_quantity Boolean
    help='If checked quantity will be accumulated to the existing record instead of overwrite it with the new quantity value'
  • allow_negative_quant Boolean
    help='If it is checked, it will allow the creation of movements that generate negative stock'
  • auto_lot Boolean
    help='If checked the lot will be set automatically with the same removal startegy' string='Get lots automatically'
  • auto_put_in_pack Boolean
    help='Auto put in pack before picking validation' string='Auto put in pack'
  • barcode_guided_mode Selection
    help='When guided mode is selected, information will appear with the movement to be processed' string='Mode' args: [('guided', 'Guided')]
  • code Char
  • confirmed_moves Boolean
    help='It allows to work with movements without reservation (Without detailed operations)' string='Confirmed moves'
  • create_lot Boolean
    help='If checked the lot will created automatically with the scanned barcode if not exists ' string='Create lots if not match'
  • display_notification Boolean
    string='Display Odoo notifications'
  • display_read_quant Boolean
    string='Read items on inventory mode'
  • fill_fields_from_lot Boolean
    help='If checked, the fields in the interface will be filled from the scanned lot'
  • group_key_for_todo_records Char
    help='You can establish a list of fields that will act as a grouping key to generate the movements to be process.\nThe object variable is used to refer to the source record\nFor example, object.location_id,object.product_id,object.lot_id'
  • ignore_filled_fields Boolean
    string='Ignore filled fields'
  • ignore_quant_location Boolean
    help='If it is checked, quant location will be ignored when reading lot/package'
  • is_manual_confirm Boolean
    help='If it is marked, the movement must always be confirmed from a button'
  • is_manual_qty Boolean
    help='If it is checked, it always shows the product quantity field in edit mode'
  • keep_screen_values Boolean
    help='If checked the wizard values are kept until the pending move is completed'
  • location_field_to_sort Selection
    selection=[('location_id', 'Origin Location'), ('location_dest_id', 'Destination Location')]
  • manual_entry Boolean
    help='Default value when open scan interface' string='Manual entry'
  • manual_entry_field_focus Char
    default='location_id' help='Set field to set focus when manual entry mode is enabled'
  • name Char
  • no_increase_qty_done Boolean
    string='Do not increase qty done on each scan'
  • option_ids One2many → stock.barcodes.option
    comodel_name='stock.barcodes.option' copy=True inverse_name='option_group_id'
  • show_detailed_operations Boolean
    help='If checked the picking detailed operations are displayed'
  • show_form_scan Boolean
    default=True
  • show_pending_moves Boolean
    help='Shows a list of movements to process' string='Show pending moves'
  • source_pending_moves Selection
    default='move_line_ids' help='Origin of the data to generate the movements to process' args: [('move_line_ids', 'Detailed operations'), ('move_ids', 'Operations')]
  • use_location_dest_putaway Boolean
    string='Use location dest. putaway'
Public methods (1)
  • get_option_value(self, field_name, attribute)

New fields (1)
  • barcode_backorder_action Selection
    default='pending' string='Backorder action' args: [('pending', 'Pending'), ('create_backorder', 'Create Backorder'), ('skip_backorder', 'No Backorder')]
Public methods (1)
  • copy_data(self, default=None)

New fields (1)
  • barcode_scan_state Selection
    compute='_compute_barcode_scan_state' default='pending' readonly=False store=True string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
Public methods (1)
  • action_barcode_detailed_operation_unlink(self)

New fields (0)

No new fields.

Public methods (2)
  • action_barcode_scan(self, option_group=False)
  • button_validate(self)

New fields (2)
  • barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • new_picking_barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' help="This Barcode Option Group will be selected when clicking the 'New' button in an operation type. It will be used to create a non planned picking."
Public methods (3)
  • action_barcode_new_picking(self)
  • action_barcode_scan(self)
  • get_action_picking_tree_ready(self)

New fields (0)

No new fields.

Public methods (6)
  • action_apply_inventory(self)
  • action_barcode_inventory_quant_edit(self)
  • action_barcode_inventory_quant_unlink(self)
  • enable_current_operations(self)
  • operation_quantities(self)
  • operation_quantities_rest(self)

New fields (13)
  • date Datetime
    readonly=True related='picking_id.date' string='Creation Date'
  • is_pending Boolean
    compute='_compute_is_pending'
  • name Char
    readonly=True related='picking_id.name' string='Candidate Picking'
  • note Html
    related='picking_id.note'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='picking_id.partner_id' string='Partner'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • product_qty_done Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Done'
  • product_qty_reserved Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Demand'
  • scan_count Integer
  • state Selection
    readonly=True related='picking_id.state'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking' readonly=True
  • wiz_picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True related='wiz_barcode_id.picking_id' string='Wizard Picking'
Public methods (5)
  • action_lock_picking(self)
  • action_open_picking(self)
  • action_put_in_pack(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)

New fields (2)
  • lot_name Char
    string='Lot name'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
Public methods (5)
  • cancel(self)
  • confirm(self)
  • get_scan_wizard(self)
  • on_barcode_scanned(self, barcode)
  • scan_wizard_action(self)

New fields (41)
  • action_ids Many2many → stock.barcodes.action
    comodel_name='stock.barcodes.action' compute='_compute_action_ids'
  • auto_lot Boolean
    compute='_compute_auto_lot' help='If checked the lot will be set automatically with the same removal startegy' readonly=False store=True string='Get lots automatically'
  • barcode Char
  • confirmed_moves Boolean
    related='option_group_id.confirmed_moves' string='Confirmed moves'
  • create_lot Boolean
    compute='_compute_create_lot' help='Show lot name field' string='Allow create lot'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_menu Boolean
  • enable_add_product Boolean
    default=True
  • guided_location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_location_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_lot_id Many2one → stock.lot
    comodel_name='stock.lot'
  • guided_product_id Many2one → product.product
    comodel_name='product.product'
  • is_manual_confirm Boolean
    compute='_compute_is_manual_qty'
  • is_manual_qty Boolean
    compute='_compute_is_manual_qty'
  • keep_result_package Boolean
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location' string='Location dest.'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • lot_id Many2one → stock.lot
    comodel_name='stock.lot'
  • lot_name Char
    compute='_compute_lot_name' readonly=False store=True args: 'Lot/Serial Number Name'
  • manual_entry Boolean
    help='Entry manual data' string='Manual'
  • message Char
    readonly=True
  • message_step Char
    readonly=True
  • message_type Selection
    readonly=True args: [('info', 'Barcode read with additional info'), ('info_page', 'Info page'), ('not_found', 'No barcode found'), ('more_match', 'More than one matches found'), ('success', 'Barcode read correctly')]
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • owner_id Many2one → res.partner
    comodel_name='res.partner'
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', _allowed_product_types)]
  • product_packaging_ids One2many
    related='product_id.packaging_ids'
  • product_qty Float
    digits='Product Unit of Measure'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • show_form_scan Boolean
    compute='_compute_show_form_scan'
  • step Integer
  • total_product_qty_done Float
    digits='Product Unit of Measure' store=False string='Product Qty. Done'
  • total_product_uom_qty Float
    digits='Product Unit of Measure' store=False string='Product Demand'
  • visible_force_done Boolean
Public methods (49)
  • action_add_scan_manual(self)
  • action_back(self)
  • action_cancel(self)
  • action_clean_lot(self)
  • action_clean_message(self)
  • action_clean_package(self)
  • action_clean_product(self)
  • action_clean_values(self)
  • action_confirm(self)
  • action_create_package(self)
  • action_done(self)
  • action_force_done(self)
  • action_keep_result_package(self)
  • action_lot_scaned_post(self, lot)
  • action_manual_entry(self)
  • action_manual_quantity(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_reopen_wizard(self)
  • action_show_step(self)
    @api.onchange('step')
  • check_done_conditions(self)
  • check_location_contidion(self)
  • check_lot_contidion(self)
  • check_option_required(self)
  • create(self, vals_list)
    @api.model_create_multi
  • display_notification(self, message, message_type='warning', title=False, sticky=True)
    Send notifications to web client message_type: [options.type='warning'] 'info', 'success', 'warning', 'danger' or '' sticky: Permanent notification until user removes it
  • dummy_on_barcode_scanned(self)
    To avoid execute operations in onchange environment
  • get_option_value(self, field_name, attribute)
  • on_barcode_scanned(self, barcode)
  • onchange_manual_entry(self)
    @api.onchange('manual_entry')
  • onchange_package_id(self)
    @api.onchange('package_id')
  • onchange_packaging_qty(self)
    @api.onchange('packaging_qty')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_visible_force_done(self)
    @api.onchange('product_id', 'lot_id', 'package_id', 'result_package_id', 'packaging_qty', 'product_qty')
  • open_actions(self)
  • open_records(self)
  • play_sounds(self, res)
  • process_barcode(self, barcode)
  • process_barcode_location_dest_id(self)
  • process_barcode_location_id(self)
  • process_barcode_lot_id(self)
  • process_barcode_package_id(self)
  • process_barcode_packaging_id(self)
  • process_barcode_product_id(self)
  • process_barcode_result_package_id(self)
  • process_lot_before_done(self)
  • reset_qty(self)
  • set_info_from_quants(self, quants)
    Fill wizard fields from stock quants
  • set_product_qty(self)

New fields (5)
  • count_inventory_quants Integer
    compute='_compute_count_inventory_quants' store=True
  • display_read_quant Boolean
    default=True string='Read items'
  • inventory_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Inventory quantities'
  • inventory_quant_ids Many2many → stock.quant
    comodel_name='stock.quant' compute='_compute_inventory_quant_ids'
  • product_id Many2one
    domain=[('type', 'in', _allowed_product_types)]
Public methods (5)
  • action_clean_values(self)
  • action_display_read_quant(self)
  • action_done(self)
  • action_manual_entry(self)
  • apply_inventory(self)

New fields (26)
  • candidate_picking_id Many2one → stock.picking
    comodel_name='stock.picking' related='candidate_picking_ids.picking_id' string='Candidate stock picking'
  • candidate_picking_ids One2many → wiz.candidate.picking
    comodel_name='wiz.candidate.picking' inverse_name='wiz_barcode_id' readonly=True string='Candidate pickings'
  • company_id Many2one
    related='picking_id.company_id'
  • enable_add_product Boolean
    compute='_compute_enable_add_product'
  • forced_todo_key Char
  • keep_screen_values Boolean
    related='option_group_id.keep_screen_values'
  • move_line_ids One2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_move_line_ids'
  • partner_id Many2one → res.partner
    related='picking_id.partner_id' args: 'res.partner'
  • pending_move_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_pending_move_ids'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • picking_ids Many2many → stock.picking
    comodel_name='stock.picking' readonly=True string='Pickings'
  • picking_location_dest_id Many2one
    related='picking_id.location_dest_id'
  • picking_location_id Many2one
    related='picking_id.location_id'
  • picking_mode Selection
    args: [('picking', 'Picking mode')]
  • picking_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Picking quantities'
  • picking_state Selection
    related='picking_id.state'
  • picking_type_code Selection
    args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • qty_available Float
    compute='_compute_qty_available'
  • selected_pending_move_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • show_detailed_operations Boolean
    related='option_group_id.show_detailed_operations' store=True
  • todo_line_display_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_todo_line_display_ids'
  • todo_line_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • todo_line_ids One2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' inverse_name='wiz_barcode_id' string='To Do Lines'
  • todo_line_is_extra_line Boolean
    related='todo_line_id.is_extra_line'
  • total_product_qty_done Float
    compute='_compute_total_product'
  • total_product_uom_qty Float
    compute='_compute_total_product'
Public methods (28)
  • action_assign_serial(self)
  • action_clean_values(self)
  • action_done(self)
  • action_lock_picking(self)
  • action_manual_entry(self)
  • action_open_picking(self)
  • action_product_scaned_post(self, product)
  • action_put_in_pack(self)
  • action_show_detailed_operations(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)
  • check_done_conditions(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_new_stock_move(self, sml)
  • create_new_stock_move_line(self, moves_todo, available_qty)
    Create a new stock move line when a sml is not available for the wizard values.
  • determine_todo_action(self, forced_todo_line=False)
  • fill_pending_moves(self)
  • fill_records(self, lines_list)
    @api.model
    :param lines_list: browse list :return:
  • fill_todo_records(self)
  • get_lot_by_removal_strategy(self)
  • get_moves(self)
  • get_moves_or_move_lines(self)
  • get_sorted_move_lines(self, move_lines)
  • name_get(self)
  • onchange_picking_id(self)
    @api.onchange('picking_id')
  • update_fields_after_determine_todo(self, move_line)
  • update_fields_after_process_stock(self, moves)
  • update_keep_values(self, keep_vals)

New fields (27)
  • is_extra_line Boolean
  • is_stock_move_line_origin Boolean
  • line_ids Many2many → stock.move.line
    comodel_name='stock.move.line'
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • location_dest_name Char
    related='location_dest_id.name' string='Destinatino Name'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • location_name Char
    related='location_id.name'
  • lot_id Many2one → stock.lot
    comodel_name='stock.lot'
  • name Char
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • package_product_qty Float
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Partner'
  • picking_code Char
    args: 'Type of Operation'
  • picking_state Selection
    related='wiz_barcode_id.picking_state'
  • position_index Integer
  • product_id Many2one → product.product
    comodel_name='product.product'
  • product_qty_reserved Float
    digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    digits='Product Unit of Measure' readonly=True args: 'Demand'
  • qty_done Float
    compute='_compute_qty_done' digits='Product Unit of Measure' args: 'Done'
  • qty_done_rest Float
    compute='_compute_qty_done_rest' store=True
  • res_ids Char
  • res_model_id Many2one → ir.model
    comodel_name='ir.model'
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • state Selection
    compute='_compute_state' default='pending' readonly=False string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
  • stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking'
Public methods (8)
  • action_back_line(self)
  • action_barcode_inventory_quant_edit(self)
  • action_next_line(self)
  • action_reset_lines(self)
  • action_todo_next(self)
  • fields_to_fill_from_pending_line(self)
    @api.model
  • fill_from_pending_line(self)
  • operation_quantities(self)
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
GIT
GIThttps://github.com/OCA/stock-logistics-barcode.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-barcode/tree/15.0/stock_barcodes
VERSION
VERSION 3.3.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSGitHub, Carlos Dauden, Lois Rilo, Miquel Raïch, sergio-teruel, Ernesto Tejeda, Weblate, OCA-git-bot, oca-ci, Carlos Roca
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-barcode
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_widget_numeric_step
odoo/odoo:
    - barcodes
    - web
    - base
    - stock
    - product
    - mail
    - base_setup
    - bus
    - web_tour
    - uom
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
stock_location_form_inherit stock.location.inherit stock.location group Inherits stock.view_location_form
stock_picking_kanban stock.picking xpath Inherits stock.stock_picking_kanban
stock_picking_type_kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
view_picking_form stock.picking div Inherits stock.view_picking_form
view_picking_type_form stock.picking.type xpath Inherits stock.view_picking_type_form
view_pickingtype_filter stock.picking.type field Inherits stock.view_pickingtype_filter
view_stock_barcodes_action_tree stock.barcodes.action.tree stock.barcodes.action tree New
view_stock_barcodes_new_lot stock.barcodes.new.lot.form wiz.stock.barcodes.new.lot form New
view_stock_barcodes_option_group_form stock.barcodes.option.group.form stock.barcodes.option.group form New
view_stock_barcodes_option_tree stock.barcodes.option.tree stock.barcodes.option tree New
view_stock_barcodes_read_form stock.barcodes.read.form wiz.stock.barcodes.read form New
view_stock_barcodes_read_form_manual_qty stock.barcodes.read.form.manual_qty wiz.stock.barcodes.read form New
view_stock_barcodes_read_inventory_form stock.barcodes.read.inventory.form wiz.stock.barcodes.read.inventory field Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_packaging_form stock.barcodes.read.packaging.form wiz.stock.barcodes.read div Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_form stock.barcodes.read.picking.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_todo_kanban stock.barcodes.todo.kanban wiz.stock.barcodes.read.todo kanban New
Models touched (16)

New fields (8)
  • action_window_id Many2one → ir.actions.act_window
    comodel_name='ir.actions.act_window' string='Action window'
  • active Boolean
    default=True
  • context Char
  • icon_class Char
  • key_char_shortcut Char
  • key_shortcut Integer
  • name Char
    translate=True
  • sequence Integer
    default=100
Public methods (2)
  • open_action(self)
  • open_inventory_action(self, ctx)

New fields (11)
  • clean_after_done Boolean
  • field_name Char
  • filled_default Boolean
  • forced Boolean
  • message Char
  • name Char
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' ondelete='cascade'
  • required Boolean
  • sequence Integer
    default=100
  • step Integer
  • to_scan Boolean
Public methods (0)

No public methods.

New fields (26)
  • accumulate_read_quantity Boolean
    help='If checked quantity will be accumulated to the existing record instead of overwrite it with the new quantity value'
  • allow_negative_quant Boolean
    help='If it is checked, it will allow the creation of movements that generate negative stock'
  • auto_lot Boolean
    help='If checked the lot will be set automatically with the same removal startegy' string='Get lots automatically'
  • auto_put_in_pack Boolean
    help='Auto put in pack before picking validation' string='Auto put in pack'
  • barcode_guided_mode Selection
    help='When guided mode is selected, information will appear with the movement to be processed' string='Mode' args: [('guided', 'Guided')]
  • code Char
  • confirmed_moves Boolean
    help='It allows to work with movements without reservation (Without detailed operations)' string='Confirmed moves'
  • create_lot Boolean
    help='If checked the lot will created automatically with the scanned barcode if not exists ' string='Create lots if not match'
  • display_notification Boolean
    string='Display Odoo notifications'
  • fill_fields_from_lot Boolean
    help='If checked, the fields in the interface will be filled from the scanned lot'
  • group_key_for_todo_records Char
    help='You can establish a list of fields that will act as a grouping key to generate the movements to be process.\nThe object variable is used to refer to the source record\nFor example, object.location_id,object.product_id,object.lot_id'
  • ignore_filled_fields Boolean
    string='Ignore filled fields'
  • ignore_quant_location Boolean
    help='If it is checked, quant location will be ignored when reading lot/package'
  • is_manual_confirm Boolean
    help='If it is marked, the movement must always be confirmed from a button'
  • is_manual_qty Boolean
    help='If it is checked, it always shows the product quantity field in edit mode'
  • keep_screen_values Boolean
    help='If checked the wizard values are kept until the pending move is completed'
  • location_field_to_sort Selection
    selection=[('location_id', 'Origin Location'), ('location_dest_id', 'Destination Location')]
  • manual_entry Boolean
    help='Default value when open scan interface' string='Manual entry'
  • manual_entry_field_focus Char
    default='location_id' help='Set field to set focus when manual entry mode is enabled'
  • name Char
  • option_ids One2many → stock.barcodes.option
    comodel_name='stock.barcodes.option' copy=True inverse_name='option_group_id'
  • show_detailed_operations Boolean
    help='If checked the picking detailed operations are displayed'
  • show_pending_moves Boolean
    help='Shows a list of movements to process' string='Show pending moves'
  • show_scan_log Boolean
    help='Displays a log of the scans processed' string='Show scan log'
  • source_pending_moves Selection
    default='move_line_ids' help='Origin of the data to generate the movements to process' args: [('move_line_ids', 'Detailed operations'), ('move_lines', 'Operations')]
  • use_location_dest_putaway Boolean
    string='Use location dest. putaway'
Public methods (1)
  • get_option_value(self, field_name, attribute)

New fields (12)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • log_line_ids One2many → stock.barcodes.read.log.line
    comodel_name='stock.barcodes.read.log.line' inverse_name='read_log_id' string='Scanning log details'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot' string='Lot scanned'
  • manual_entry Boolean
    string='Manual entry'
  • name Char
    string='Barcode Scanned'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' string='Picking'
  • product_id Many2one → product.product
    comodel_name='product.product' index=True
  • product_qty Float
    digits='Product Unit of Measure' string='Quantity'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
Public methods (0)

No public methods.

New fields (3)
  • move_line_id Many2one → stock.move.line
    comodel_name='stock.move.line' readonly=True string='Stock move lines'
  • product_qty Float
    digits='Product Unit of Measure' readonly=True string='Quantity scanned'
  • read_log_id Many2one → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' ondelete='cascade' readonly=True string='Scanning log'
Public methods (0)

No public methods.

New fields (1)
  • barcode_backorder_action Selection
    default='pending' string='Backorder action' args: [('pending', 'Pending'), ('create_backorder', 'Create Backorder'), ('skip_backorder', 'No Backorder')]
Public methods (1)
  • copy_data(self, default=None)

New fields (1)
  • barcode_scan_state Selection
    compute='_compute_barcode_scan_state' default='pending' readonly=False store=True string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
Public methods (1)
  • action_barcode_detailed_operation_unlink(self)

New fields (0)

No new fields.

Public methods (2)
  • action_barcode_scan(self, option_group=False)
  • button_validate(self)

New fields (2)
  • barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • new_picking_barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' help="This Barcode Option Group will be selected when clicking the 'New' button in an operation type. It will be used to create a non planned picking."
Public methods (2)
  • action_barcode_new_picking(self)
  • action_barcode_scan(self)

New fields (0)

No new fields.

Public methods (2)
  • action_barcode_inventory_quant_edit(self)
  • action_barcode_inventory_quant_unlink(self)

New fields (13)
  • date Datetime
    readonly=True related='picking_id.date' string='Creation Date'
  • is_pending Boolean
    compute='_compute_is_pending'
  • name Char
    readonly=True related='picking_id.name' string='Candidate Picking'
  • note Html
    related='picking_id.note'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='picking_id.partner_id' string='Partner'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • product_qty_done Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Done'
  • product_qty_reserved Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Demand'
  • scan_count Integer
  • state Selection
    readonly=True related='picking_id.state'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking' readonly=True
  • wiz_picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True related='wiz_barcode_id.picking_id' string='Wizard Picking'
Public methods (5)
  • action_lock_picking(self)
  • action_open_picking(self)
  • action_put_in_pack(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)

New fields (2)
  • lot_name Char
    string='Lot name'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
Public methods (5)
  • cancel(self)
  • confirm(self)
  • get_scan_wizard(self)
  • on_barcode_scanned(self, barcode)
  • scan_wizard_action(self)

New fields (41)
  • action_ids Many2many → stock.barcodes.action
    comodel_name='stock.barcodes.action' compute='_compute_action_ids'
  • auto_lot Boolean
    compute='_compute_auto_lot' help='If checked the lot will be set automatically with the same removal startegy' readonly=False store=True string='Get lots automatically'
  • barcode Char
  • confirmed_moves Boolean
    related='option_group_id.confirmed_moves' string='Confirmed moves'
  • create_lot Boolean
    compute='_compute_create_lot' help='Show lot name field' string='Allow create lot'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_menu Boolean
  • guided_location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_location_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • guided_product_id Many2one → product.product
    comodel_name='product.product'
  • is_manual_confirm Boolean
    compute='_compute_is_manual_qty'
  • is_manual_qty Boolean
    compute='_compute_is_manual_qty'
  • keep_result_package Boolean
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location' string='Location dest.'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • lot_name Char
    compute='_compute_lot_name' readonly=False store=True args: 'Lot/Serial Number Name'
  • manual_entry Boolean
    help='Entry manual data' string='Manual'
  • message Char
    readonly=True
  • message_step Char
    readonly=True
  • message_type Selection
    readonly=True args: [('info', 'Barcode read with additional info'), ('not_found', 'No barcode found'), ('more_match', 'More than one matches found'), ('success', 'Barcode read correctly')]
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • owner_id Many2one → res.partner
    comodel_name='res.partner'
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', _allowed_product_types)]
  • product_packaging_ids One2many
    related='product_id.packaging_ids'
  • product_qty Float
    digits='Product Unit of Measure'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • scan_log_ids Many2many → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' compute='_compute_scan_log_ids'
  • show_scan_log Boolean
    compute='_compute_is_manual_qty'
  • step Integer
  • total_product_qty_done Float
    digits='Product Unit of Measure' store=False string='Product Qty. Done'
  • total_product_uom_qty Float
    digits='Product Unit of Measure' store=False string='Product Demand'
  • visible_force_done Boolean
Public methods (49)
  • action_back(self)
  • action_cancel(self)
  • action_clean_lot(self)
  • action_clean_message(self)
  • action_clean_package(self)
  • action_clean_product(self)
  • action_clean_values(self)
  • action_confirm(self)
  • action_create_package(self)
  • action_done(self)
  • action_force_done(self)
  • action_keep_result_package(self)
  • action_lot_scaned_post(self, lot)
  • action_manual_entry(self)
  • action_manual_quantity(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_reopen_wizard(self)
  • action_show_step(self)
    @api.onchange('step')
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • check_location_contidion(self)
  • check_lot_contidion(self)
  • check_option_required(self)
  • create(self, vals)
    @api.model
  • display_notification(self, message, message_type='warning', title=False, sticky=True)
    Send notifications to web client message_type: [options.type='warning'] 'info', 'success', 'warning', 'danger' or '' See web/static/src/legacy/js/core/service_mixins.js#L241 to implement more options. sticky: Permanent notification until user removes it
  • dummy_on_barcode_scanned(self)
    To avoid execute operations in onchange environment
  • get_option_value(self, field_name, attribute)
  • on_barcode_scanned(self, barcode)
  • onchange_manual_entry(self)
    @api.onchange('manual_entry')
  • onchange_package_id(self)
    @api.onchange('package_id')
  • onchange_packaging_qty(self)
    @api.onchange('packaging_qty')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_visible_force_done(self)
    @api.onchange('product_id', 'lot_id', 'package_id', 'result_package_id', 'packaging_qty', 'product_qty')
  • open_actions(self)
  • open_records(self)
  • play_sounds(self, res)
  • process_barcode(self, barcode)
  • process_barcode_location_dest_id(self)
  • process_barcode_location_id(self)
  • process_barcode_lot_id(self)
  • process_barcode_package_id(self)
  • process_barcode_packaging_id(self)
  • process_barcode_product_id(self)
  • process_barcode_result_package_id(self)
  • process_lot_before_done(self)
  • reset_qty(self)
  • set_info_from_quants(self, quants)
    Fill wizard fields from stock quants
  • set_product_qty(self)

New fields (4)
  • display_read_quant Boolean
    string='Read items'
  • inventory_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Inventory quantities'
  • inventory_quant_ids Many2many → stock.quant
    comodel_name='stock.quant' compute='_compute_inventory_quant_ids'
  • product_id Many2one
    domain=[('type', 'in', _allowed_product_types)]
Public methods (4)
  • action_clean_values(self)
  • action_done(self)
  • action_manual_entry(self)
  • apply_inventory(self)

New fields (23)
  • candidate_picking_ids One2many → wiz.candidate.picking
    comodel_name='wiz.candidate.picking' inverse_name='wiz_barcode_id' readonly=True string='Candidate pickings'
  • company_id Many2one
    related='picking_id.company_id'
  • forced_todo_key Char
  • keep_screen_values Boolean
    related='option_group_id.keep_screen_values'
  • move_line_ids One2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_move_line_ids'
  • pending_move_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_pending_move_ids'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • picking_ids Many2many → stock.picking
    comodel_name='stock.picking' readonly=True string='Pickings'
  • picking_location_dest_id Many2one
    related='picking_id.location_dest_id'
  • picking_location_id Many2one
    related='picking_id.location_id'
  • picking_mode Selection
    args: [('picking', 'Picking mode')]
  • picking_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Picking quantities'
  • picking_state Selection
    related='picking_id.state'
  • picking_type_code Selection
    args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • qty_available Float
    compute='_compute_qty_available'
  • selected_pending_move_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • show_detailed_operations Boolean
    related='option_group_id.show_detailed_operations'
  • todo_line_display_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_todo_line_display_ids'
  • todo_line_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • todo_line_ids One2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' inverse_name='wiz_barcode_id' string='To Do Lines'
  • todo_line_is_extra_line Boolean
    related='todo_line_id.is_extra_line'
  • total_product_qty_done Float
    compute='_compute_total_product'
  • total_product_uom_qty Float
    compute='_compute_total_product'
Public methods (26)
  • action_assign_serial(self)
  • action_clean_values(self)
  • action_done(self)
  • action_manual_entry(self)
  • action_product_scaned_post(self, product)
  • action_put_in_pack(self)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • create(self, vals)
    @api.model
  • create_new_stock_move(self, sml)
  • create_new_stock_move_line(self, moves_todo, available_qty)
    Create a new stock move line when a sml is not available for the wizard values.
  • determine_todo_action(self, forced_todo_line=False)
  • fill_pending_moves(self)
  • fill_records(self, lines_list)
    @api.model
    :param lines_list: browse list :return:
  • fill_todo_records(self)
  • get_lot_by_removal_strategy(self)
  • get_moves(self)
  • get_moves_or_move_lines(self)
  • get_sorted_move_lines(self, move_lines)
  • name_get(self)
  • onchange_picking_id(self)
    @api.onchange('picking_id')
  • remove_scanning_log(self, scanning_log)
  • update_barcodes_wiz_after_changes(self)
  • update_fields_after_determine_todo(self, move_line)
  • update_fields_after_process_stock(self, moves)
  • update_keep_values(self, keep_vals)

New fields (25)
  • is_extra_line Boolean
  • is_stock_move_line_origin Boolean
  • line_ids Many2many → stock.move.line
    comodel_name='stock.move.line'
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • location_dest_name Char
    related='location_dest_id.name' string='Destinatino Name'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • location_name Char
    related='location_id.name'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • name Char
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • package_product_qty Float
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Partner'
  • picking_code Char
    args: 'Type of Operation'
  • position_index Integer
  • product_id Many2one → product.product
    comodel_name='product.product'
  • product_qty_reserved Float
    digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    digits='Product Unit of Measure' readonly=True args: 'Demand'
  • qty_done Float
    compute='_compute_qty_done' digits='Product Unit of Measure' args: 'Done'
  • res_ids Char
  • res_model_id Many2one → ir.model
    comodel_name='ir.model'
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • state Selection
    compute='_compute_state' default='pending' readonly=False string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
  • stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking'
Public methods (6)
  • action_back_line(self)
  • action_next_line(self)
  • action_reset_lines(self)
  • action_todo_next(self)
  • fields_to_fill_from_pending_line(self)
    @api.model
  • fill_from_pending_line(self)
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
GIT
GIThttps://github.com/OCA/stock-logistics-barcode.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-barcode/tree/14.0/stock_barcodes
VERSION
VERSION 4.0.1
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSdavid, Lois Rilo, OCA Transbot, sergio-teruel, Ernesto Tejeda, oca-travis, Weblate, OCA-git-bot, Tom, oca-ci, mariadforgeflow, Alessandro Uffreduzzi, David Alonso // Solvos, hkapatel, Alessio Renda
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-barcode
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:52
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_widget_numeric_step
odoo/odoo:
    - barcodes
    - web
    - base
    - stock
    - product
    - mail
    - base_setup
    - bus
    - web_tour
    - uom
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (19)
XML IDNameModelTypeStatus
assets_backend stock_barcodes Assets ir.ui.view qweb Inherits web.assets_backend
stock_location_form_inherit stock.location.inherit stock.location group Inherits stock.view_location_form
stock_picking_kanban stock.picking xpath Inherits stock.stock_picking_kanban
stock_picking_type_kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
view_inventory_form stock.inventory div Inherits stock.view_inventory_form
view_picking_form stock.picking div Inherits stock.view_picking_form
view_picking_type_form stock.picking.type xpath Inherits stock.view_picking_type_form
view_pickingtype_filter stock.picking.type field Inherits stock.view_pickingtype_filter
view_stock_barcodes_action_tree stock.barcodes.action.tree stock.barcodes.action tree New
view_stock_barcodes_new_lot stock.barcodes.new.lot.form wiz.stock.barcodes.new.lot form New
view_stock_barcodes_option_group_form stock.barcodes.option.group.form stock.barcodes.option.group form New
view_stock_barcodes_option_tree stock.barcodes.option.tree stock.barcodes.option tree New
view_stock_barcodes_read_form stock.barcodes.read.form wiz.stock.barcodes.read form New
view_stock_barcodes_read_form_manual_qty stock.barcodes.read.form.manual_qty wiz.stock.barcodes.read form New
view_stock_barcodes_read_inventory_form stock.barcodes.read.inventory.form wiz.stock.barcodes.read.inventory xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_packaging_form stock.barcodes.read.packaging.form wiz.stock.barcodes.read div Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_form stock.barcodes.read.picking.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_todo_kanban stock.barcodes.todo.kanban wiz.stock.barcodes.read.todo kanban New
view_stock_inventory_kanban stock.inventory xpath Inherits stock.view_stock_inventory_kanban
Models touched (16)

New fields (8)
  • action_window_id Many2one → ir.actions.act_window
    comodel_name='ir.actions.act_window' string='Action window'
  • active Boolean
    default=True
  • context Char
  • icon_class Char
  • key_char_shortcut Char
  • key_shortcut Integer
  • name Char
    translate=True
  • sequence Integer
    default=100 string='Sequence'
Public methods (1)
  • open_action(self)

New fields (11)
  • clean_after_done Boolean
  • field_name Char
  • filled_default Boolean
  • forced Boolean
  • message Char
  • name Char
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' ondelete='cascade'
  • required Boolean
  • sequence Integer
    default=100 string='Sequence'
  • step Integer
  • to_scan Boolean
Public methods (0)

No public methods.

New fields (20)
  • allow_negative_quant Boolean
    help='If it is checked, it will allow the creation of movements that generate negative stock'
  • auto_lot Boolean
    help='If checked the lot will be set automatically with the same removal startegy' string='Get lots automatically'
  • auto_put_in_pack Boolean
    help='Auto put in pack before picking validation' string='Auto put in pack'
  • barcode_guided_mode Selection
    help='When guided mode is selected, information will appear with the movement to be processed' string='Mode' args: [('guided', 'Guided')]
  • code Char
  • confirmed_moves Boolean
    help='It allows to work with movements without reservation (Without detailed operations)' string='Confirmed moves'
  • create_lot Boolean
    help='If checked the lot will created automatically with the scanned barcode if not exists ' string='Create lots if not match'
  • fill_fields_from_lot Boolean
    help='If checked, the fields in the interface will be filled from the scanned lot'
  • group_key_for_todo_records Char
    help='You can establish a list of fields that will act as a grouping key to generate the movements to be process.\nThe object variable is used to refer to the source record\nFor example, object.location_id,object.product_id,object.lot_id'
  • ignore_filled_fields Boolean
    string='Ignore filled fields'
  • is_manual_confirm Boolean
    help='If it is marked, the movement must always be confirmed from a button'
  • is_manual_qty Boolean
    help='If it is checked, it always shows the product quantity field in edit mode'
  • manual_entry Boolean
    help='Default value when open scan interface' string='Manual entry'
  • manual_entry_field_focus Char
    default='location_id' help='Set field to set focus when manual entry mode is enabled'
  • name Char
  • option_ids One2many → stock.barcodes.option
    comodel_name='stock.barcodes.option' copy=True inverse_name='option_group_id'
  • show_detailed_operations Boolean
    help='If checked the picking detailed operations are displayed'
  • show_pending_moves Boolean
    help='Shows a list of movements to process' string='Show pending moves'
  • show_scan_log Boolean
    help='Displays a log of the scans processed' string='Show scan log'
  • source_pending_moves Selection
    default='move_line_ids' help='Origin of the data to generate the movements to process' args: [('move_line_ids', 'Detailed operations'), ('move_lines', 'Operations')]
Public methods (1)
  • get_option_value(self, field_name, attribute)

New fields (12)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • log_line_ids One2many → stock.barcodes.read.log.line
    comodel_name='stock.barcodes.read.log.line' inverse_name='read_log_id' string='Scanning log details'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot' string='Lot scanned'
  • manual_entry Boolean
    string='Manual entry'
  • name Char
    string='Barcode Scanned'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' string='Picking'
  • product_id Many2one → product.product
    comodel_name='product.product' index=True
  • product_qty Float
    digits='Product Unit of Measure' string='Quantity'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
Public methods (0)

No public methods.

New fields (3)
  • move_line_id Many2one → stock.move.line
    comodel_name='stock.move.line' readonly=True string='Stock move lines'
  • product_qty Float
    digits='Product Unit of Measure' readonly=True string='Quantity scanned'
  • read_log_id Many2one → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' ondelete='cascade' readonly=True string='Scanning log'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (1)
  • barcode_scan_state Selection
    compute='_compute_barcode_scan_state' default='pending' readonly=False store=True string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
Public methods (1)
  • action_barcode_detailed_operation_unlink(self)

New fields (0)

No new fields.

Public methods (2)
  • action_barcode_scan(self, option_group=False)
  • button_validate(self)

New fields (2)
  • barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • new_picking_barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' help="This Barcode Option Group will be selected when clicking the 'New' button in an operation type. It will be used to create a non planned picking."
Public methods (2)
  • action_barcode_new_picking(self)
  • action_barcode_scan(self)

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_inventory_quant_unlink(self)

New fields (13)
  • date Datetime
    readonly=True related='picking_id.date' string='Creation Date'
  • is_pending Boolean
    compute='_compute_is_pending'
  • name Char
    readonly=True related='picking_id.name' string='Candidate Picking'
  • note Text
    related='picking_id.note'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='picking_id.partner_id' string='Partner'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • product_qty_done Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Done'
  • product_qty_reserved Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Demand'
  • scan_count Integer
  • state Selection
    readonly=True related='picking_id.state'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking' readonly=True
  • wiz_picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True related='wiz_barcode_id.picking_id' string='Wizard Picking'
Public methods (5)
  • action_lock_picking(self)
  • action_open_picking(self)
  • action_put_in_pack(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)

New fields (2)
  • lot_name Char
    string='Lot name'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
Public methods (5)
  • cancel(self)
  • confirm(self)
  • get_scan_wizard(self)
  • on_barcode_scanned(self, barcode)
  • scan_wizard_action(self)

New fields (40)
  • action_ids Many2many → stock.barcodes.action
    comodel_name='stock.barcodes.action' compute='_compute_action_ids'
  • auto_lot Boolean
    compute='_compute_auto_lot' help='If checked the lot will be set automatically with the same removal startegy' readonly=False store=True string='Get lots automatically'
  • barcode Char
  • confirmed_moves Boolean
    related='option_group_id.confirmed_moves' string='Confirmed moves'
  • create_lot Boolean
    compute='_compute_create_lot' help='Show lot name field' string='Allow create lot'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_menu Boolean
  • guided_location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_location_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • guided_product_id Many2one → product.product
    comodel_name='product.product'
  • is_manual_confirm Boolean
    compute='_compute_is_manual_qty'
  • is_manual_qty Boolean
    compute='_compute_is_manual_qty'
  • keep_result_package Boolean
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location' string='Location dest.'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • lot_name Char
    compute='_compute_lot_name' readonly=False store=True args: 'Lot/Serial Number Name'
  • manual_entry Boolean
    help='Entry manual data' string='Manual'
  • message Char
    readonly=True
  • message_step Char
    readonly=True
  • message_type Selection
    readonly=True args: [('info', 'Barcode read with additional info'), ('not_found', 'No barcode found'), ('more_match', 'More than one matches found'), ('success', 'Barcode read correctly')]
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • owner_id Many2one → res.partner
    comodel_name='res.partner'
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', _allowed_product_types)]
  • product_packaging_ids One2many
    related='product_id.packaging_ids'
  • product_qty Float
    digits='Product Unit of Measure'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • qty_available Float
    compute='_compute_qty_available'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • scan_log_ids Many2many → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' compute='_compute_scan_log_ids'
  • show_scan_log Boolean
    compute='_compute_is_manual_qty'
  • step Integer
  • visible_force_done Boolean
Public methods (46)
  • action_back(self)
  • action_cancel(self)
  • action_clean_lot(self)
  • action_clean_message(self)
  • action_clean_package(self)
  • action_clean_product(self)
  • action_clean_values(self)
  • action_confirm(self)
  • action_create_package(self)
  • action_done(self)
  • action_force_done(self)
  • action_keep_result_package(self)
  • action_lot_scaned_post(self, lot)
  • action_manual_entry(self)
  • action_manual_quantity(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_reopen_wizard(self)
  • action_show_step(self)
    @api.onchange('step')
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • check_location_contidion(self)
  • check_lot_contidion(self)
  • check_option_required(self)
  • create(self, vals)
    @api.model
  • get_option_value(self, field_name, attribute)
  • on_barcode_scanned(self, barcode)
  • onchange_manual_entry(self)
    @api.onchange('manual_entry')
  • onchange_package_id(self)
    @api.onchange('package_id')
  • onchange_packaging_qty(self)
    @api.onchange('packaging_qty')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • open_actions(self)
  • open_records(self)
  • play_sounds(self, res)
  • process_barcode(self, barcode)
  • process_barcode_location_dest_id(self)
  • process_barcode_location_id(self)
  • process_barcode_lot_id(self)
  • process_barcode_package_id(self)
  • process_barcode_packaging_id(self)
  • process_barcode_product_id(self)
  • process_barcode_result_package_id(self)
  • process_lot_before_done(self)
  • reset_qty(self)
  • set_info_from_quants(self, quants)
    Fill wizard fields from stock quants
  • set_product_qty(self)

New fields (3)
  • display_inventory_ids Many2many → stock.inventory
    comodel_name='stock.inventory' compute='_compute_display_inventory_ids'
  • inventory_id Many2one → stock.inventory
    comodel_name='stock.inventory' readonly=True
  • inventory_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Inventory quantities'
Public methods (6)
  • action_clean_values(self)
  • action_done(self)
  • action_manual_entry(self)
  • action_undo_last_scan(self)
  • check_lot_contidion(self)
    Change valuation condition depends if auto_lot is setted
  • name_get(self)

New fields (14)
  • candidate_picking_ids One2many → wiz.candidate.picking
    comodel_name='wiz.candidate.picking' inverse_name='wiz_barcode_id' readonly=True string='Candidate pickings'
  • move_line_ids One2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_move_line_ids'
  • pending_move_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_pending_move_ids'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • picking_ids Many2many → stock.picking
    comodel_name='stock.picking' readonly=True string='Pickings'
  • picking_mode Selection
    args: [('picking', 'Picking mode')]
  • picking_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Picking quantities'
  • picking_state Selection
    related='picking_id.state'
  • picking_type_code Selection
    args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • selected_pending_move_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • show_detailed_operations Boolean
    related='option_group_id.show_detailed_operations'
  • todo_line_display_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_todo_line_display_ids'
  • todo_line_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • todo_line_ids One2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' inverse_name='wiz_barcode_id' string='To Do Lines'
Public methods (23)
  • action_assign_serial(self)
  • action_clean_values(self)
  • action_done(self)
  • action_manual_entry(self)
  • action_product_scaned_post(self, product)
  • action_put_in_pack(self)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • create(self, vals)
    @api.model
  • create_new_stock_move(self, sml)
  • create_new_stock_move_line(self, moves_todo, available_qty)
    Create a new stock move line when a sml is not available for the wizard values.
  • determine_todo_action(self, forced_todo_line=False)
  • fill_pending_moves(self)
  • fill_todo_records(self)
  • filter_sml(self, candidate_lines, lines, sml_vals)
    Empty method that needs to be implemented in other modules.
  • get_lot_by_removal_strategy(self)
  • get_moves_or_move_lines(self)
  • get_sorted_move_lines(self, move_lines)
  • name_get(self)
  • onchange_picking_id(self)
    @api.onchange('picking_id')
  • remove_scanning_log(self, scanning_log)
  • update_fields_after_determine_todo(self, move_line)
  • update_fields_after_process_stock(self, moves)

New fields (23)
  • line_ids Many2many → stock.move.line
    comodel_name='stock.move.line'
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • location_dest_name Char
    related='location_dest_id.name' string='Destinatino Name'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • location_name Char
    related='location_id.name'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • name Char
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • package_product_qty Float
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Partner'
  • picking_code Char
    args: 'Type of Operation'
  • position_index Integer
  • product_id Many2one → product.product
    comodel_name='product.product'
  • product_qty_reserved Float
    digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    digits='Product Unit of Measure' readonly=True args: 'Demand'
  • qty_done Float
    compute='_compute_qty_done' digits='Product Unit of Measure' readonly=False store=True args: 'Done'
  • res_ids Char
  • res_model_id Many2one → ir.model
    comodel_name='ir.model'
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • state Selection
    compute='_compute_state' default='pending' readonly=False string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
  • stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking'
Public methods (7)
  • action_back_line(self)
  • action_next_line(self)
  • action_reset_lines(self)
  • action_todo_next(self)
  • fields_to_fill_from_pending_line(self)
    @api.model
  • fill_from_pending_line(self)
  • fill_records(self, wiz_barcode, lines_list)
    @api.model
    :param lines_list: browse list :return:
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
GIT
GIThttps://github.com/OCA/stock-logistics-barcode.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-barcode/tree/13.0/stock_barcodes
VERSION
VERSION 2.3.4
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, david, Lois Rilo, OCA Transbot, sergio-teruel, Sergio Teruel, oca-travis, Weblate, OCA-git-bot, oca-ci, Alba Riera, Olga Marco
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-barcode
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_widget_numeric_step
odoo/odoo:
    - barcodes
    - web
    - base
    - stock
    - product
    - mail
    - base_setup
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (19)
XML IDNameModelTypeStatus
assets_backend stock_barcodes Assets ir.ui.view qweb Inherits web.assets_backend
stock_location_form_inherit stock.location.inherit stock.location group Inherits stock.view_location_form
stock_picking_kanban stock.picking xpath Inherits stock.stock_picking_kanban
stock_picking_type_kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
view_inventory_form stock.inventory div Inherits stock.view_inventory_form
view_picking_form stock.picking div Inherits stock.view_picking_form
view_picking_type_form stock.picking.type xpath Inherits stock.view_picking_type_form
view_pickingtype_filter stock.picking.type field Inherits stock.view_pickingtype_filter
view_stock_barcodes_action_tree stock.barcodes.action.tree stock.barcodes.action tree New
view_stock_barcodes_new_lot stock.barcodes.new.lot.form wiz.stock.barcodes.new.lot form New
view_stock_barcodes_option_group_form stock.barcodes.option.group.form stock.barcodes.option.group form New
view_stock_barcodes_option_tree stock.barcodes.option.tree stock.barcodes.option tree New
view_stock_barcodes_read_form stock.barcodes.read.form wiz.stock.barcodes.read form New
view_stock_barcodes_read_form_manual_qty stock.barcodes.read.form.manual_qty wiz.stock.barcodes.read form New
view_stock_barcodes_read_inventory_form stock.barcodes.read.inventory.form wiz.stock.barcodes.read.inventory xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_packaging_form stock.barcodes.read.packaging.form wiz.stock.barcodes.read div Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_form stock.barcodes.read.picking.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_todo_kanban stock.barcodes.todo.kanban wiz.stock.barcodes.read.todo kanban New
view_stock_inventory_kanban stock.inventory xpath Inherits stock.view_stock_inventory_kanban
Models touched (16)

New fields (8)
  • action_window_id Many2one → ir.actions.act_window
    comodel_name='ir.actions.act_window' string='Action window'
  • active Boolean
    default=True
  • context Char
  • icon_class Char
  • key_char_shortcut Char
  • key_shortcut Integer
  • name Char
    translate=True
  • sequence Integer
    default=100 string='Sequence'
Public methods (1)
  • open_action(self)

New fields (11)
  • clean_after_done Boolean
  • field_name Char
  • filled_default Boolean
  • forced Boolean
  • message Char
  • name Char
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' ondelete='cascade'
  • required Boolean
  • sequence Integer
    default=100 string='Sequence'
  • step Integer
  • to_scan Boolean
Public methods (0)

No public methods.

New fields (19)
  • allow_negative_quant Boolean
    help='If it is checked, it will allow the creation of movements that generate negative stock'
  • auto_lot Boolean
    help='If checked the lot will be set automatically with the same removal startegy' string='Get lots automatically'
  • auto_put_in_pack Boolean
    help='Auto put in pack before picking validation' string='Auto put in pack'
  • barcode_guided_mode Selection
    help='When guided mode is selected, information will appear with the movement to be processed' string='Mode' args: [('guided', 'Guided')]
  • code Char
  • confirmed_moves Boolean
    help='It allows to work with movements without reservation (Without detailed operations)' string='Confirmed moves'
  • create_lot Boolean
    help='If checked the lot will created automatically with the scanned barcode if not exists ' string='Create lots if not match'
  • fill_fields_from_lot Boolean
    help='If checked, the fields in the interface will be filled from the scanned lot'
  • group_key_for_todo_records Char
    help='You can establish a list of fields that will act as a grouping key to generate the movements to be process.\nThe object variable is used to refer to the source record\nFor example, object.location_id,object.product_id,object.lot_id'
  • ignore_filled_fields Boolean
    string='Ignore filled fields'
  • is_manual_confirm Boolean
    help='If it is marked, the movement must always be confirmed from a button'
  • is_manual_qty Boolean
    help='If it is checked, it always shows the product quantity field in edit mode'
  • manual_entry Boolean
    help='Default value when open scan interface' string='Manual entry'
  • manual_entry_field_focus Char
    default='location_id' help='Set field to set focus when manual entry mode is enabled'
  • name Char
  • option_ids One2many → stock.barcodes.option
    comodel_name='stock.barcodes.option' copy=True inverse_name='option_group_id'
  • show_pending_moves Boolean
    help='Shows a list of movements to process' string='Show pending moves'
  • show_scan_log Boolean
    help='Displays a log of the scans processed' string='Show scan log'
  • source_pending_moves Selection
    default='move_line_ids' help='Origin of the data to generate the movements to process' args: [('move_line_ids', 'Detailed operations'), ('move_lines', 'Operations')]
Public methods (1)
  • get_option_value(self, field_name, attribute)

New fields (12)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • log_line_ids One2many → stock.barcodes.read.log.line
    comodel_name='stock.barcodes.read.log.line' inverse_name='read_log_id' string='Scanning log details'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot' string='Lot scanned'
  • manual_entry Boolean
    string='Manual entry'
  • name Char
    string='Barcode Scanned'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' string='Picking'
  • product_id Many2one → product.product
    comodel_name='product.product' index=True
  • product_qty Float
    digits='Product Unit of Measure' string='Quantity'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
Public methods (0)

No public methods.

New fields (3)
  • move_line_id Many2one → stock.move.line
    comodel_name='stock.move.line' readonly=True string='Stock move lines'
  • product_qty Float
    digits='Product Unit of Measure' readonly=True string='Quantity scanned'
  • read_log_id Many2one → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' ondelete='cascade' readonly=True string='Scanning log'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (2)
  • barcode_scan_state Selection
    compute='_compute_barcode_scan_state' default='pending' readonly=False store=True string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
  • lot_id Many2one
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • action_barcode_scan(self, option_group=False)
  • button_validate(self)

New fields (2)
  • barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • new_picking_barcode_option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group' help="This Barcode Option Group will be selected when clicking the 'New' button in an operation type. It will be used to create a non planned picking."
Public methods (2)
  • action_barcode_new_picking(self)
  • action_barcode_scan(self)

New fields (2)
  • name Char
    index=True
  • product_id Many2one
    index=True
Public methods (0)

No public methods.

New fields (12)
  • date Datetime
    readonly=True related='picking_id.date' string='Creation Date'
  • is_pending Boolean
    compute='_compute_is_pending'
  • name Char
    readonly=True related='picking_id.name' string='Candidate Picking'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='picking_id.partner_id' string='Partner'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • product_qty_done Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Done'
  • product_qty_reserved Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    compute='_compute_picking_quantity' digits='Product Unit of Measure' readonly=True args: 'Demand'
  • scan_count Integer
  • state Selection
    readonly=True related='picking_id.state'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking' readonly=True
  • wiz_picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True related='wiz_barcode_id.picking_id' string='Wizard Picking'
Public methods (5)
  • action_lock_picking(self)
  • action_open_picking(self)
  • action_put_in_pack(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)

New fields (2)
  • lot_name Char
    string='Lot name'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
Public methods (5)
  • cancel(self)
  • confirm(self)
  • get_scan_wizard(self)
  • on_barcode_scanned(self, barcode)
  • scan_wizard_action(self)

New fields (37)
  • action_ids Many2many → stock.barcodes.action
    comodel_name='stock.barcodes.action' compute='_compute_action_ids'
  • auto_lot Boolean
    compute='_compute_auto_lot' help='If checked the lot will be set automatically with the same removal startegy' readonly=False store=True string='Get lots automatically'
  • barcode Char
  • confirmed_moves Boolean
    related='option_group_id.confirmed_moves' string='Confirmed moves'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_menu Boolean
  • guided_location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_location_id Many2one → stock.location
    comodel_name='stock.location'
  • guided_lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • guided_product_id Many2one → product.product
    comodel_name='product.product'
  • is_manual_confirm Boolean
    compute='_compute_is_manual_qty'
  • is_manual_qty Boolean
    compute='_compute_is_manual_qty'
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location' string='Location dest.'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • manual_entry Boolean
    help='Entry manual data' string='Manual'
  • message Char
    readonly=True
  • message_step Char
    readonly=True
  • message_type Selection
    readonly=True args: [('info', 'Barcode read with additional info'), ('not_found', 'No barcode found'), ('more_match', 'More than one matches found'), ('success', 'Barcode read correctly')]
  • option_group_id Many2one → stock.barcodes.option.group
    comodel_name='stock.barcodes.option.group'
  • owner_id Many2one → res.partner
    comodel_name='res.partner'
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits='Product Unit of Measure' string='Package Qty'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', _allowed_product_types)]
  • product_packaging_ids One2many
    related='product_id.packaging_ids'
  • product_qty Float
    digits='Product Unit of Measure'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • qty_available Float
    compute='_compute_qty_available'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • scan_log_ids Many2many → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' compute='_compute_scan_log_ids'
  • show_scan_log Boolean
    compute='_compute_is_manual_qty'
  • step Integer
  • visible_force_done Boolean
Public methods (43)
  • action_back(self)
  • action_cancel(self)
  • action_clean_lot(self)
  • action_clean_message(self)
  • action_clean_package(self)
  • action_clean_product(self)
  • action_clean_values(self)
  • action_confirm(self)
  • action_create_package(self)
  • action_done(self)
  • action_force_done(self)
  • action_lot_scaned_post(self, lot)
  • action_manual_entry(self)
  • action_manual_quantity(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_reopen_wizard(self)
  • action_show_step(self)
    @api.onchange('step')
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • check_location_contidion(self)
  • check_lot_contidion(self)
  • check_option_required(self)
  • create(self, vals)
    @api.model
  • get_option_value(self, field_name, attribute)
  • on_barcode_scanned(self, barcode)
  • onchange_manual_entry(self)
    @api.onchange('manual_entry')
  • onchange_package_id(self)
    @api.onchange('package_id')
  • onchange_packaging_qty(self)
    @api.onchange('packaging_qty')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • open_actions(self)
  • open_records(self)
  • play_sounds(self, res)
  • process_barcode(self, barcode)
  • process_barcode_location_dest_id(self)
  • process_barcode_location_id(self)
  • process_barcode_lot_id(self)
  • process_barcode_package_id(self)
  • process_barcode_packaging_id(self)
  • process_barcode_product_id(self)
  • process_barcode_result_package_id(self)
  • reset_qty(self)
  • set_info_from_quants(self, quants)
    Fill wizard fields from stock quants

New fields (4)
  • display_inventory_ids Many2many → stock.inventory
    comodel_name='stock.inventory' compute='_compute_display_inventory_ids'
  • inventory_id Many2one → stock.inventory
    comodel_name='stock.inventory' readonly=True
  • inventory_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Inventory quantities'
  • product_id Many2one
    domain=[('type', 'in', _allowed_product_types)]
Public methods (6)
  • action_clean_values(self)
  • action_done(self)
  • action_manual_entry(self)
  • action_undo_last_scan(self)
  • check_lot_contidion(self)
    Change valuation condition depends if auto_lot is setted
  • name_get(self)

New fields (12)
  • candidate_picking_ids One2many → wiz.candidate.picking
    comodel_name='wiz.candidate.picking' inverse_name='wiz_barcode_id' readonly=True string='Candidate pickings'
  • move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' readonly=True
  • pending_move_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_pending_move_ids'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • picking_ids Many2many → stock.picking
    comodel_name='stock.picking' readonly=True string='Pickings'
  • picking_mode Selection
    args: [('picking', 'Picking mode')]
  • picking_product_qty Float
    digits='Product Unit of Measure' readonly=True string='Picking quantities'
  • picking_state Selection
    related='picking_id.state'
  • picking_type_code Selection
    args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • todo_line_display_ids Many2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' compute='_compute_todo_line_display_ids'
  • todo_line_id Many2one → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo'
  • todo_line_ids One2many → wiz.stock.barcodes.read.todo
    comodel_name='wiz.stock.barcodes.read.todo' inverse_name='wiz_barcode_id'
Public methods (23)
  • action_assign_serial(self)
  • action_done(self)
  • action_manual_entry(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_put_in_pack(self)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • create(self, vals)
    @api.model
  • create_new_stock_move(self, sml)
  • create_new_stock_move_line(self, moves_todo, available_qty)
    Create a new stock move line when a sml is not available for the wizard values.
  • determine_todo_action(self, forced_todo_line=False)
  • fill_pending_moves(self)
  • fill_todo_records(self)
  • filter_sml(self, candidate_lines, lines, sml_vals)
    Empty method that needs to be implemented in other modules.
  • get_lot_by_removal_strategy(self)
  • get_moves_or_move_lines(self)
  • get_sorted_move_lines(self, move_lines)
  • name_get(self)
  • onchange_picking_id(self)
    @api.onchange('picking_id')
  • remove_scanning_log(self, scanning_log)
  • update_fields_after_determine_todo(self, move_line)
  • update_fields_after_process_stock(self, moves)

New fields (23)
  • line_ids Many2many → stock.move.line
    comodel_name='stock.move.line'
  • location_dest_id Many2one → stock.location
    comodel_name='stock.location'
  • location_dest_name Char
    related='location_dest_id.name'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • location_name Char
    related='location_id.name'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • name Char
  • package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • package_product_qty Float
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Partner'
  • picking_code Char
    args: 'Type of Operation'
  • position_index Integer
  • product_id Many2one → product.product
    comodel_name='product.product'
  • product_qty_reserved Float
    digits='Product Unit of Measure' readonly=True args: 'Reserved'
  • product_uom_qty Float
    digits='Product Unit of Measure' readonly=True args: 'Demand'
  • qty_done Float
    compute='_compute_qty_done' digits='Product Unit of Measure' readonly=False store=True args: 'Done'
  • res_ids Char
  • res_model_id Many2one → ir.model
    comodel_name='ir.model'
  • result_package_id Many2one → stock.quant.package
    comodel_name='stock.quant.package'
  • state Selection
    compute='_compute_state' default='pending' readonly=False string='Scan State' args: [('pending', 'Pending'), ('done', 'Done'), ('done_forced', 'Done forced')]
  • stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking'
Public methods (7)
  • action_back_line(self)
  • action_next_line(self)
  • action_reset_lines(self)
  • action_todo_next(self)
  • fields_to_fill_from_pending_line(self)
    @api.model
  • fill_from_pending_line(self)
  • fill_records(self, wiz_barcode, lines_list)
    @api.model
    :param lines_list: browse list :return:
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
GIT
GIThttps://github.com/OCA/stock-logistics-barcode.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-barcode/tree/12.0/stock_barcodes
VERSION
VERSION 2.3.0
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSCarlos Dauden, Enric Tobella, david, OCA Transbot, sergio-teruel, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes, CarlosRoca13, Alba Riera
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-barcode
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - barcodes
    - web
    - base
    - stock
    - product
    - decimal_precision
    - mail
    - base_setup
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
assets_backend stock_barcodes Assets ir.ui.view qweb Inherits web.assets_backend
missing_moves missing_moves ir.ui.view qweb New
res_config_settings_view_form res.config.settings div Inherits stock.res_config_settings_view_form
stock_picking_type_kanban stock.picking.type xpath Inherits stock.stock_picking_type_kanban
view_inventory_form stock.inventory div Inherits stock.view_inventory_form
view_picking_form stock.picking div Inherits stock.view_picking_form
view_stock_barcodes_new_lot stock.barcodes.new.lot.form wiz.stock.barcodes.new.lot form New
view_stock_barcodes_read_form stock.barcodes.read.form wiz.stock.barcodes.read form New
view_stock_barcodes_read_inventory_form stock.barcodes.read.inventory.form wiz.stock.barcodes.read.inventory field Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_form stock.barcodes.read.picking.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_lot_form stock.barcodes.read.picking.lot.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_picking_form
Models touched (12)

New fields (1)
  • stock_barcodes_auto_lot Boolean
Public methods (0)

No public methods.

New fields (2)
  • group_track_pending_products_picking_barcode_wizard Boolean
    implied_group='stock_barcodes.group_track_pending_products_picking_barcode' string='Track pending products at the picking barcode wizard'
  • stock_barcodes_auto_lot Boolean
    readonly=False related='company_id.stock_barcodes_auto_lot' string='Get lots automatically'
Public methods (0)

No public methods.

New fields (12)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • log_line_ids One2many → stock.barcodes.read.log.line
    comodel_name='stock.barcodes.read.log.line' inverse_name='read_log_id' string='Scanning log details'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot' string='Lot scanned'
  • manual_entry Boolean
    string='Manual entry'
  • name Char
    string='Barcode Scanned'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Package Qty'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' string='Picking'
  • product_id Many2one → product.product
    comodel_name='product.product' index=True
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Quantity'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
Public methods (0)

No public methods.

New fields (3)
  • move_line_id Many2one → stock.move.line
    comodel_name='stock.move.line' readonly=True string='Stock move lines'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') readonly=True string='Quantity scanned'
  • read_log_id Many2one → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' ondelete='cascade' readonly=True string='Scanning log'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (11)
  • date Datetime
    readonly=True related='picking_id.date' string='Creation Date'
  • name Char
    readonly=True related='picking_id.name' string='Candidate Picking'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='picking_id.partner_id' string='Partner'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • product_qty_done Float
    compute='_compute_picking_quantity' digits=dp.get_precision('Product Unit of Measure') readonly=True args: 'Done'
  • product_qty_reserved Float
    compute='_compute_picking_quantity' digits=dp.get_precision('Product Unit of Measure') readonly=True args: 'Reserved'
  • product_uom_qty Float
    compute='_compute_picking_quantity' digits=dp.get_precision('Product Unit of Measure') readonly=True args: 'Demand'
  • scan_count Integer
  • state Selection
    readonly=True related='picking_id.state'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking' readonly=True
  • wiz_picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True related='wiz_barcode_id.picking_id' string='Wizard Picking'
Public methods (3)
  • action_lock_picking(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)

New fields (2)
  • lot_name Char
    required=True string='Lot name'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
Public methods (2)
  • confirm(self)
  • on_barcode_scanned(self, barcode)

New fields (15)
  • auto_lot Boolean
    default=_default_auto_lot help='If checked the lot will be set automatically with the same removal startegy' string='Get lots automatically'
  • barcode Char
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot'
  • manual_entry Boolean
    string='Manual entry data'
  • message Char
    readonly=True
  • message_type Selection
    readonly=True args: [('info', 'Barcode read with additional info'), ('not_found', 'No barcode found'), ('more_match', 'More than one matches found'), ('success', 'Barcode read correctly')]
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging'
  • packaging_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Package Qty'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', _allowed_product_types)]
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure')
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
  • scan_log_ids Many2many → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' compute='_compute_scan_log_ids'
Public methods (14)
  • action_cancel(self)
  • action_clean_lot(self)
  • action_done(self)
  • action_lot_scaned_post(self, lot)
  • action_manual_entry(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • on_barcode_scanned(self, barcode)
  • onchange_location_id(self)
    @api.onchange('location_id')
  • onchange_packaging_qty(self)
    @api.onchange('packaging_qty')
  • process_barcode(self, barcode)
  • reset_qty(self)

New fields (3)
  • inventory_id Many2one → stock.inventory
    comodel_name='stock.inventory' readonly=True
  • inventory_product_qty Float
    digits=dp.get_precision('Product Unit of Measure') readonly=True string='Inventory quantities'
  • product_id Many2one
    domain=[('type', 'in', _allowed_product_types)]
Public methods (6)
  • action_done(self)
  • action_manual_entry(self)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • name_get(self)
  • reset_qty(self)

New fields (6)
  • candidate_picking_ids One2many → wiz.candidate.picking
    comodel_name='wiz.candidate.picking' inverse_name='wiz_barcode_id' readonly=True string='Candidate pickings'
  • confirmed_moves Boolean
    string='Confirmed moves'
  • pending_moves Html
    compute='_compute_pending_move' groups='stock_barcodes.group_track_pending_products_picking_barcode'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • picking_product_qty Float
    digits=dp.get_precision('Product Unit of Measure') readonly=True string='Picking quantities'
  • picking_type_code Selection
    args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
Public methods (10)
  • action_done(self)
  • action_manual_entry(self)
  • action_product_scaned_post(self, product)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • create(self, vals)
    @api.model
  • get_lot_by_removal_strategy(self)
  • name_get(self)
  • onchange_picking_id(self)
    @api.onchange('picking_id')
  • remove_scanning_log(self, scanning_log)
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
GIT
GIThttps://github.com/OCA/stock-logistics-barcode.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-barcode/tree/11.0/stock_barcodes
VERSION
VERSION 2.0.3
CATEGORY
CATEGORYExtra Tools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, david, OCA Transbot, Sergio Teruel, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://odoo-community.org/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - barcodes
    - web
    - base
    - stock
    - product
    - decimal_precision
    - mail
    - base_setup
    - bus
    - web_tour
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
assets_backend stock_barcodes Assets ir.ui.view qweb Inherits web.assets_backend
stock_picking_type_kanban stock.picking.type xpath Inherits stock.stock_picking_type_kanban
view_inventory_form stock.inventory div Inherits stock.view_inventory_form
view_picking_form stock.picking div Inherits stock.view_picking_form
view_stock_barcodes_new_lot stock.barcodes.new.lot.form wiz.stock.barcodes.new.lot form New
view_stock_barcodes_read_form stock.barcodes.read.form wiz.stock.barcodes.read form New
view_stock_barcodes_read_inventory_form stock.barcodes.read.inventory.form wiz.stock.barcodes.read.inventory field Inherits stock_barcodes.view_stock_barcodes_read_form
view_stock_barcodes_read_picking_form stock.barcodes.read.picking.form wiz.stock.barcodes.read.picking xpath Inherits stock_barcodes.view_stock_barcodes_read_form
Models touched (10)

New fields (12)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='Location'
  • log_line_ids One2many → stock.barcodes.read.log.line
    comodel_name='stock.barcodes.read.log.line' inverse_name='read_log_id' string='Scanning log details'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot' string='Lot scanned'
  • manual_entry Boolean
    string='Manual entry'
  • name Char
    string='barcode'
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging' string='Packaging'
  • packaging_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Package Qty'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' string='Picking'
  • product_id Many2one → product.product
    comodel_name='product.product' index=True string='Product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Quantity'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
Public methods (0)

No public methods.

New fields (3)
  • move_line_id Many2one → stock.move.line
    comodel_name='stock.move.line' readonly=True string='Stock move lines'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') readonly=True string='Quantity scanned'
  • read_log_id Many2one → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' ondelete='cascade' readonly=True string='Scanning log'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (0)

No new fields.

Public methods (1)
  • action_barcode_scan(self)

New fields (11)
  • date Datetime
    readonly=True related='picking_id.date' string='Creation Date'
  • name Char
    readonly=True related='picking_id.name' string='Picking'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='picking_id.partner_id' string='Partner'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • product_qty_done Float
    compute='_compute_picking_quantity' digits=dp.get_precision('Product Unit of Measure') readonly=True args: 'Done'
  • product_qty_reserved Float
    compute='_compute_picking_quantity' digits=dp.get_precision('Product Unit of Measure') readonly=True args: 'Reserved'
  • product_uom_qty Float
    compute='_compute_picking_quantity' digits=dp.get_precision('Product Unit of Measure') readonly=True args: 'Demand'
  • scan_count Integer
  • state Selection
    readonly=True related='picking_id.state'
  • wiz_barcode_id Many2one → wiz.stock.barcodes.read.picking
    comodel_name='wiz.stock.barcodes.read.picking' readonly=True
  • wiz_picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True related='wiz_barcode_id.picking_id' string='Picking'
Public methods (3)
  • action_lock_picking(self)
  • action_unlock_picking(self)
  • action_validate_picking(self)

New fields (2)
  • lot_name Char
    required=True string='Lot name'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True string='Product'
Public methods (2)
  • confirm(self)
  • on_barcode_scanned(self, barcode)

New fields (14)
  • barcode Char
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='Location'
  • lot_id Many2one → stock.production.lot
    comodel_name='stock.production.lot' string='Lot'
  • manual_entry Boolean
    string='Manual entry data'
  • message Char
    readonly=True
  • message_type Selection
    readonly=True args: [('info', 'Barcode read with additional info'), ('not_found', 'No barcode found'), ('more_match', 'More than one matches found'), ('success', 'Barcode read correctly')]
  • packaging_id Many2one → product.packaging
    comodel_name='product.packaging' string='Packaging'
  • packaging_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Package Qty'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Product Qty'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • res_id Integer
    index=True
  • res_model_id Many2one → ir.model
    comodel_name='ir.model' index=True
  • scan_log_ids Many2many → stock.barcodes.read.log
    comodel_name='stock.barcodes.read.log' compute='_compute_scan_log_ids'
Public methods (14)
  • action_cancel(self)
  • action_clean_lot(self)
  • action_done(self)
  • action_lot_scaned_post(self, lot)
  • action_manual_entry(self)
  • action_packaging_scaned_post(self, packaging)
  • action_product_scaned_post(self, product)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • on_barcode_scanned(self, barcode)
  • onchange_location_id(self)
    @api.onchange('location_id')
  • onchange_packaging_qty(self)
    @api.onchange('packaging_qty')
  • process_barcode(self, barcode)
  • reset_qty(self)

New fields (2)
  • inventory_id Many2one → stock.inventory
    comodel_name='stock.inventory' readonly=True string='Inventory'
  • inventory_product_qty Float
    digits=dp.get_precision('Product Unit of Measure') readonly=True string='Inventory quantities'
Public methods (6)
  • action_done(self)
  • action_manual_entry(self)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • name_get(self)
  • reset_qty(self)

New fields (5)
  • candidate_picking_ids One2many → wiz.candidate.picking
    comodel_name='wiz.candidate.picking' inverse_name='wiz_barcode_id' readonly=True string='Candidate pickings'
  • confirmed_moves Boolean
    string='Confirmed moves'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' readonly=True string='Picking'
  • picking_product_qty Float
    digits=dp.get_precision('Product Unit of Measure') readonly=True string='Picking quantities'
  • picking_type_code Selection
    args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
Public methods (8)
  • action_done(self)
  • action_manual_entry(self)
  • action_undo_last_scan(self)
  • check_done_conditions(self)
  • create(self, vals)
    @api.model
  • name_get(self)
  • onchange_picking_id(self)
    @api.onchange('picking_id')
  • remove_scanning_log(self, scanning_log)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
PULL REQUEST
PULL REQUEST[18.0][MIG] stock_barcodes: Migration to v18 (#725)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/stock-logistics-barcode
PULL REQUEST
PULL REQUEST[19.0][MIG] stock_barcodes: Migration to 19.0 (#742)