Stock Picking Batch Creation

stock_picking_batch_creation
REPOSITORY
REPOSITORYOCA/stock-logistics-workflow
GIT
GIThttps://github.com/OCA/stock-logistics-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_picking_batch_creation
VERSION
VERSION 1.5.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
COMMITTERS
COMMITTERSJacques-Etienne Baudoux, Denis Roussel, Akim Juillerat, Thierry Ducrest, Weblate, OCA-git-bot, Iván Todorovich, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:15
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_dimension
OCA/stock-logistics-warehouse:
    - stock_picking_volume
OCA/stock-logistics-workflow:
    - stock_split_picking_dimension
    - stock_split_picking
odoo/odoo:
    - delivery
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - stock_picking_batch
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Odoo allows you to create batches of pickings by hand or automatically
by specifying some criteria on the picking type definition.

The approach in this addon is slightly different. It doesn't depend on
the picking type and is triggered on demand by the user with the use of
a specialized wizard.

The creation of the batch is based on the following criteria:

- A list of picking types to consider
- A list of stock device types available to the operator to process the
  batch.
- A maximum number of lines in the batch

## Stock device types

A stock device type is a new concept that allows to define a type of
device that can be used by an operator to process operations into the
warehouse (like a forklift, a compartmentalized trolleys, ...).

Depending on the device type, the resources available to complete the
job will be different. A this stage, 3 main criteria are considered:

- The maximum weight that can be handled by the device
- The maximum volume that can be handled by the device
- The number of bins/compartments available on the device

In addition to these criteria, 2 others criteria can be defined that
will be evaluated to select the appropriate device type at the start of
the batch creation process if more than one device type is available:

- A minimum picking volume to consider the device type,
- A sequence to define the order in which the device type will be
  considered.

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
make_picking_batch_form_view make.picking.batch.form (in stock_picking_batch_creation) make.picking.batch form New
stock_device_type_form_view stock.device.type.form (in stock_picking_batch_creation) stock.device.type form New
stock_device_type_tree_view stock.device.type.tree (in stock_picking_batch_creation) stock.device.type list New
stock_picking_batch_form_view stock.picking.batch.form (in stock_picking_batch_creation) stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_form
stock_picking_form_view stock.picking.form (in stock_picking_batch_creation) stock.picking xpath Inherits stock.view_picking_form
view_picking_tree_batch_view stock.picking.tree.batch (in stock_picking_batch_creation) stock.picking field Inherits stock_picking_batch.vpicktree
Models touched (4)

New fields (10)
  • add_picking_list_in_error Boolean
    default=False help="If not suitable device is provided for the pickings candidates, the error message will contain the list of the pickings names. In somecases, this list can be very long. That's why this option is uncheckedby default." string='Add all the names of the pickings in error message'
  • group_pickings_by_partner Boolean
    default=False help='All the pickings related to one partner will be put into the same bins' string='Group pickings by partner'
  • maximum_number_of_preparation_lines Integer
    default=20 help='Set to 0 to disable.' required=True string='Maximum number of preparation lines for the batch.'
  • picking_locking_mode Selection
    default=<expr> help='Define the way the system will search and lock the pickings. In the same time, picking already locked by another transaction will be skipped. This should reduce the risk of deadlocks if 2 users try to create a batch at the same time.' selection=[('sql_for_update_skip_locked', 'SQL FOR UPDATE SKIP LOCKED')] string='Picking locking mode'
  • picking_type_ids Many2many → stock.picking.type
    column1='batch_id' column2='picking_type_id' comodel_name='stock.picking.type' help='Default list of eligible operation types when creating a batch transfer' relation='make_picking_batch_picking_type_rel' string='Default operation types'
  • restrict_to_same_partner Boolean
    default=False help='Only the pickings with the same partner will be selected for this batch.' string='Restrict to the same partner'
  • restrict_to_same_priority Boolean
    default=False help='Only the pickings with the same priority will be selected for this batch.' string='Restrict to the same priority'
  • split_picking_exceeding_limits Boolean
    default=False help='If checked, the pickings exceeding the maximum number of lines, volume or weight of available devices will be split into multiple pickings to respect the limits. If unchecked, the pickings exceeding the limits will not be added to the batch. The limits are defined by the limits of the last available devices.' string='Split pickings exceeding limits'
  • stock_device_type_ids Many2many → stock.device.type
    column1='batch_id' column2='device_type_id' comodel_name='stock.device.type' help='Default list of eligible device types when creating a batch transfer' relation='make_picking_batch_device_type_rel' string='Default device types'
  • user_id Many2one → res.users
    default=<expr> string='Responsible' args: 'res.users'
Public methods (1)
  • create_batch(self) -> dict

New fields (15)
  • max_volume Float
    help='Volume in default system volume unit of measure. Set to 0 to disable.' string='Maximum total net volume for this device'
  • max_weight Float
    help='Weight in default system weight unit of measure. Set to 0 to disable.' string='Maximum total net weight for this device'
  • min_volume Float
    help='Volume in default system volume unit of measure. Set to 0 to disable.' string='Minimum total net volume for this device'
  • name Char
    required=True
  • nbr_bins Integer
    string='Number of compartments'
  • sequence Integer
    string='Priority'
  • split_mode Selection
    default='dimension' required=True selection=[('dimension', 'Dimension')]
  • user_max_volume Float
    compute='_compute_user_max_volume' inverse='_inverse_user_max_volume' readonly=False string='Maximum total net volume for electing this device'
  • user_max_weight Float
    compute='_compute_user_max_weight' inverse='_inverse_user_max_weight' readonly=False string='Maximum total net weight for electing this device'
  • user_min_volume Float
    compute='_compute_user_min_volume' inverse='_inverse_user_min_volume' readonly=False string='Minimum total net volume for electing this device'
  • user_volume_uom_id Many2one → uom.uom
    default=<expr> domain=<expr> help='Packaging volume unit of measure' required=True string='Volume Units of Measure' args: 'uom.uom'
  • user_volume_uom_name Char
    readonly=True related='user_volume_uom_id.display_name' required=True string='Volume Unit of Measure label'
  • user_weight_uom_id Many2one → uom.uom
    compute=False default=<expr> domain=<expr> help='Weight Unit of Measure' string='Weight Units of Measure' args: 'uom.uom'
  • user_weight_uom_name Char
    readonly=True related='user_weight_uom_id.display_name' string='Weight unit of measure label'
  • volume_per_bin Float
    compute='_compute_volume_per_bin' string='Max volume per bin'
Public methods (0)

No public methods.

New fields (2)
  • nbr_picking_lines Integer
    compute='_compute_nbr_picking_lines' help='Indicates the picking lines ready for preparation.' store=True string='Number of lines'
  • picking_device_id Many2one → stock.device.type
    readonly=True related='batch_id.picking_device_id' string='Device for the picking' args: 'stock.device.type'
Public methods (0)

No public methods.

New fields (5)
  • batch_nbr_bins Integer
    help='Indicates the bins occupied by the pickings on the device.' string='Number of compartments'
  • batch_nbr_lines Integer
    help='Indicates the picking lines ready for preparation.' string='Number of picking lines'
  • batch_volume Float
    help='Indicates total volume of transfers included.' string='Total volume'
  • batch_weight Float
    help='Indicates total weight of transfers included.' string='Total weight'
  • picking_device_id Many2one → stock.device.type
    string='Device' args: 'stock.device.type'
Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/wms
GIT
GIThttps://github.com/OCA/wms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/wms/tree/16.0/stock_picking_batch_creation
VERSION
VERSION 2.2.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ACSONE SA/NV, BCIM
COMMITTERS
COMMITTERSLaurent Mignon (ACSONE), Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/wms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_dimension
OCA/stock-logistics-warehouse:
    - stock_picking_volume
OCA/stock-logistics-workflow:
    - stock_split_picking_dimension
    - stock_split_picking
odoo/odoo:
    - delivery
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - stock_account
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - sale_management
    - stock_picking_batch
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
make_picking_batch_form_view make.picking.batch.form (in stock_picking_batch_creation) make.picking.batch form New
stock_device_type_form_view stock.device.type.form (in stock_picking_batch_creation) stock.device.type form New
stock_device_type_tree_view stock.device.type.tree (in stock_picking_batch_creation) stock.device.type tree New
stock_picking_batch_form_view stock.picking.batch.form (in stock_picking_batch_creation) stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_form
stock_picking_form_view stock.picking.form (in stock_picking_batch_creation) stock.picking xpath Inherits stock.view_picking_form
view_picking_tree_batch_view stock.picking.tree.batch (in stock_picking_batch_creation) stock.picking field Inherits stock_picking_batch.view_picking_tree_batch
Models touched (4)

New fields (10)
  • add_picking_list_in_error Boolean
    default=False help="If not suitable device is provided for the pickings candidates, the error message will contain the list of the pickings names. In somecases, this list can be very long. That's why this option is uncheckedby default." string='Add all the names of the pickings in error message'
  • group_pickings_by_partner Boolean
    default=False help='All the pickings related to one partner will be put into the same bins' string='Group pickings by partner'
  • maximum_number_of_preparation_lines Integer
    default=20 help='Set to 0 to disable.' required=True string='Maximum number of preparation lines for the batch.'
  • picking_locking_mode Selection
    default=<expr> help='Define the way the system will search and lock the pickings. In the same time, picking already locked by another transaction will be skipped. This should reduce the risk of deadlocks if 2 users try to create a batch at the same time.' selection=[('sql_for_update_skip_locked', 'SQL FOR UPDATE SKIP LOCKED')] string='Picking locking mode'
  • picking_type_ids Many2many → stock.picking.type
    column1='batch_id' column2='picking_type_id' comodel_name='stock.picking.type' help='Default list of eligible operation types when creating a batch transfer' relation='make_picking_batch_picking_type_rel' string='Default operation types'
  • restrict_to_same_partner Boolean
    default=False help='Only the pickings with the same partner will be selected for this batch.' string='Restrict to the same partner'
  • restrict_to_same_priority Boolean
    default=False help='Only the pickings with the same priority will be selected for this batch.' string='Restrict to the same priority'
  • split_picking_exceeding_limits Boolean
    default=False help='If checked, the pickings exceeding the maximum number of lines, volume or weight of available devices will be split into multiple pickings to respect the limits. If unchecked, the pickings exceeding the limits will not be added to the batch. The limits are defined by the limits of the last available devices.' string='Split pickings exceeding limits'
  • stock_device_type_ids Many2many → stock.device.type
    column1='batch_id' column2='device_type_id' comodel_name='stock.device.type' help='Default list of eligible device types when creating a batch transfer' relation='make_picking_batch_device_type_rel' string='Default device types'
  • user_id Many2one → res.users
    default=<expr> string='Responsible' args: 'res.users'
Public methods (1)
  • create_batch(self) -> dict

New fields (15)
  • max_volume Float
    help='Volume in default system volume unit of measure. Set to 0 to disable.' string='Maximum total net volume for this device'
  • max_weight Float
    help='Weight in default system weight unit of measure. Set to 0 to disable.' string='Maximum total net weight for this device'
  • min_volume Float
    help='Volume in default system volume unit of measure. Set to 0 to disable.' string='Minimum total net volume for this device'
  • name Char
    required=True
  • nbr_bins Integer
    string='Number of compartments'
  • sequence Integer
    string='Priority'
  • split_mode Selection
    default='dimension' required=True selection=[('dimension', 'Dimension')]
  • user_max_volume Float
    compute='_compute_user_max_volume' inverse='_inverse_user_max_volume' readonly=False string='Maximum total net volume for electing this device'
  • user_max_weight Float
    compute='_compute_user_max_weight' inverse='_inverse_user_max_weight' readonly=False string='Maximum total net weight for electing this device'
  • user_min_volume Float
    compute='_compute_user_min_volume' inverse='_inverse_user_min_volume' readonly=False string='Minimum total net volume for electing this device'
  • user_volume_uom_id Many2one → uom.uom
    default=<expr> domain=<expr> help='Packaging volume unit of measure' required=True string='Volume Units of Measure' args: 'uom.uom'
  • user_volume_uom_name Char
    readonly=True related='user_volume_uom_id.display_name' required=True string='Volume Unit of Measure label'
  • user_weight_uom_id Many2one → uom.uom
    compute=False default=<expr> domain=<expr> help='Weight Unit of Measure' string='Weight Units of Measure' args: 'uom.uom'
  • user_weight_uom_name Char
    readonly=True related='user_weight_uom_id.display_name' string='Weight unit of measure label'
  • volume_per_bin Float
    compute='_compute_volume_per_bin' string='Max volume per bin'
Public methods (0)

No public methods.

New fields (2)
  • nbr_picking_lines Integer
    compute='_compute_nbr_picking_lines' help='Indicates the picking lines ready for preparation.' store=True string='Number of lines'
  • picking_device_id Many2one → stock.device.type
    readonly=True related='batch_id.picking_device_id' string='Device for the picking' args: 'stock.device.type'
Public methods (0)

No public methods.

New fields (5)
  • batch_nbr_bins Integer
    help='Indicates the bins occupied by the pickings on the device.' string='Number of compartments'
  • batch_nbr_lines Integer
    help='Indicates the picking lines ready for preparation.' string='Number of picking lines'
  • batch_volume Float
    help='Indicates total volume of transfers included.' string='Total volume'
  • batch_weight Float
    help='Indicates total weight of transfers included.' string='Total weight'
  • picking_device_id Many2one → stock.device.type
    string='Device' args: 'stock.device.type'
Public methods (1)
  • write(self, vals)