Stock batch picking extended

stock_picking_batch_extended
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_extended
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Carlos Roca
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:15
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_picking_batch
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - stock_delivery
    - sale_stock
    - sale
    - sales_team
    - account_payment
    - account
    - onboarding
    - analytic
    - payment
    - utm
    - stock_account
    - delivery
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module:

Adds extra fields to the batch picking creation wizard Adds extra fields
and functionalities to the batch picking form.

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
product_normal_form_view product.normal.form product.product field Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.batch.picking res.config.settings field Inherits stock.res_config_settings_view_form
stock_picking_batch_filter stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_filter
stock_picking_batch_form stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_form
stock_picking_batch_tree stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_tree
stock_picking_to_batch_form stock.picking.to.batch field Inherits stock_picking_batch.stock_picking_to_batch_form
view_move_line_tree stock.move.line field Inherits stock_picking_batch.view_move_line_tree
view_picking_form stock.picking field Inherits stock_picking_batch.stock_picking_form_inherit
view_picking_internal_search stock.picking filter Inherits stock.view_picking_internal_search
view_warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (10)

New fields (1)
  • description_warehouse Text
    translate=True args: 'Warehouse Description'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (7)
  • key_level_0(self, operation)
    @api.model
  • key_level_1(self, operation)
    @api.model
  • new_level_0(self, operation)
    @api.model
  • new_level_1(self, operation)
    @api.model
  • sort_level_0(self, rec_list)
    @api.model
  • sort_level_1(self, rec_list)
    @api.model
  • update_level_1(self, group_dict, operation)
    @api.model

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

No public methods.

New fields (1)
  • use_oca_batch_validation Boolean
    readonly=False related='company_id.use_oca_batch_validation' string='Use OCA approach to validate Picking Batch'
Public methods (0)

No public methods.

New fields (1)
  • batch_id Many2one → stock.picking.batch
    comodel_name='stock.picking.batch' index=True related='picking_id.batch_id' store=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • active_picking_ids One2many → stock.picking
    comodel_name='stock.picking' domain=[('state', 'not in', ('cancel', 'done'))] help='List of active picking managed by this batch.' inverse_name='batch_id' readonly=True string='Active Pickings'
  • date Date
    default=fields.Date.context_today help='date on which the batch picking is to be processed' index=True required=True
  • name Char
    index=True
  • notes Text
    help='free form remarks'
  • picking_count Integer
    compute='_compute_picking_count' string='# Pickings'
  • use_oca_batch_validation Boolean
    copy=False default=<expr>
  • user_id Many2one
    index=True
Public methods (6)
  • action_cancel(self)
    Call action_cancel for all batches pickings and set batches states to cancel too only if user set OCA batch validation approach.
  • action_picking_move_line_tree(self)
  • action_picking_move_tree(self)
  • action_print_picking(self)
  • action_view_stock_picking(self)
    This function returns an action that display existing pickings of given batch picking.
  • remove_undone_pickings(self)
    Remove of this batch all pickings which state is not done / cancel.

New fields (3)
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain=[('model', '=', 'stock.picking'), ('store', '=', True)] required=True string='Field to group'
  • picking_to_batch_id Many2one → stock.picking.to.batch
    comodel_name='stock.picking.to.batch' ondelete='cascade' required=True
  • sequence Integer
    default=0 help='Group by picking field'
Public methods (0)

No public methods.

New fields (6)
  • batch_by_group Boolean
    string='Create batch pickings grouped by fields'
  • batch_max_pickings Integer
    help="A transfer will not be added to batches that will exceed this number of transfers.\nLeave this value as '0' if no transfer limit." args: 'Maximum transfers'
  • group_field_ids One2many → stock.picking.batch.creator.group.field
    comodel_name='stock.picking.batch.creator.group.field' help='If set any, multiple batch picking will be created, one per group field' inverse_name='picking_to_batch_id' string='Group by field'
  • name Char
    help='Name of the batch picking'
  • notes Text
    help='Free form remarks'
  • user_id Many2one
    default=<expr>
Public methods (10)
  • action_create_batch(self)
    For OCA approach: Create a batch picking with selected pickings after having checked that they are not already in another batch or done/cancel. For non OCA approach or add to existing batch picking: Call to original method
  • action_view_batch_picking(self, batch_pickings)
    @api.model
  • confirm_batch_picking(self, batch)
  • create_batch_picking(self)
  • create_multiple_batch(self, domain)
    Create n batch pickings by grouped fields selected
  • create_simple_batch(self, domain)
    Create one batch picking with all pickings
  • default_get(self, fields)
    @api.model
    Set last grouped fields used that are stored in config parameters
  • load_store_fields(self)
  • onchange_batch_by_group(self)
    @api.onchange('batch_by_group')
  • split_chunks(self, pickings)
    Split pickings in n chunks

New fields (1)
  • default_user_id Many2one → res.users
    help='the user to which the batch pickings are assigned by default' index=True args: 'res.users', 'Default Picker'
Public methods (0)

No public methods.

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/16.0/stock_picking_batch_extended
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSsergio-teruel, Weblate, OCA-git-bot, Rodrigo, oca-ci, Eduardo De Miguel
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:51
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_picking_batch
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - delivery
    - sale_stock
    - sale
    - sales_team
    - account_payment
    - account
    - analytic
    - payment
    - utm
    - stock_account
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
product_normal_form_view product.normal.form product.product xpath Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.batch.picking res.config.settings xpath Inherits stock.res_config_settings_view_form
stock_picking_batch_filter stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_filter
stock_picking_batch_form stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_form
stock_picking_batch_tree stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_tree
stock_picking_to_batch_form stock.picking.to.batch field Inherits stock_picking_batch.stock_picking_to_batch_form
view_picking_form stock.picking field Inherits stock.view_picking_form
view_warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (8)

New fields (1)
  • description_warehouse Text
    translate=True args: 'Warehouse Description'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (7)
  • key_level_0(self, operation)
    @api.model
  • key_level_1(self, operation)
    @api.model
  • new_level_0(self, operation)
    @api.model
  • new_level_1(self, operation)
    @api.model
  • sort_level_0(self, rec_list)
    @api.model
  • sort_level_1(self, rec_list)
    @api.model
  • update_level_1(self, group_dict, operation)
    @api.model

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

No public methods.

New fields (1)
  • use_oca_batch_validation Boolean
    readonly=False related='company_id.use_oca_batch_validation' string='Use OCA approach to validate Picking Batch'
Public methods (0)

No public methods.

New fields (7)
  • active_picking_ids One2many → stock.picking
    comodel_name='stock.picking' domain=[('state', 'not in', ('cancel', 'done'))] help='List of active picking managed by this batch.' inverse_name='batch_id' readonly=True string='Active Pickings'
  • date Date
    default=fields.Date.context_today help='date on which the batch picking is to be processed' index=True readonly=True required=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]}
  • name Char
    index=True states={'draft': [('readonly', False)]}
  • notes Text
    help='free form remarks'
  • picking_count Integer
    compute='_compute_picking_count' string='# Pickings'
  • use_oca_batch_validation Boolean
    copy=False default=<expr>
  • user_id Many2one
    index=True
Public methods (4)
  • action_cancel(self)
    Call action_cancel for all batches pickings and set batches states to cancel too only if user set OCA batch validation approach.
  • action_print_picking(self)
  • action_view_stock_picking(self)
    This function returns an action that display existing pickings of given batch picking.
  • remove_undone_pickings(self)
    Remove of this batch all pickings which state is not done / cancel.

New fields (3)
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain=[('model', '=', 'stock.picking'), ('store', '=', True)] required=True string='Field to group'
  • picking_to_batch_id Many2one → stock.picking.to.batch
    comodel_name='stock.picking.to.batch' ondelete='cascade' required=True
  • sequence Integer
    default=0 help='Group by picking field'
Public methods (0)

No public methods.

New fields (5)
  • batch_by_group Boolean
    string='Create batch pickings grouped by fields'
  • group_field_ids One2many → stock.picking.batch.creator.group.field
    comodel_name='stock.picking.batch.creator.group.field' help='If set any, multiple batch picking will be created, one per group field' inverse_name='picking_to_batch_id' string='Group by field'
  • name Char
    help='Name of the batch picking'
  • notes Text
    help='Free form remarks'
  • user_id Many2one
    default=<expr>
Public methods (9)
  • action_create_batch(self)
    For OCA approach: Create a batch picking with selected pickings after having checked that they are not already in another batch or done/cancel. For non OCA approach or add to existing batch picking: Call to original method
  • action_view_batch_picking(self, batch_pickings)
  • confirm_batch_picking(self, batch)
  • create_batch_picking(self)
  • create_multiple_batch(self, domain)
    Create n batch pickings by grouped fields selected
  • create_simple_batch(self, domain)
    Create one batch picking with all pickings
  • default_get(self, fields)
    @api.model
    Set last grouped fields used that are stored in config parameters
  • load_store_fields(self)
  • onchange_batch_by_group(self)
    @api.onchange('batch_by_group')

New fields (1)
  • default_user_id Many2one → res.users
    help='the user to which the batch pickings are assigned by default' index=True args: 'res.users', 'Default Picker'
Public methods (0)

No public methods.

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/15.0/stock_picking_batch_extended
VERSION
VERSION 2.5.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSCarlos Dauden, sergio-teruel, Weblate, OCA-git-bot, David, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:37
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_picking_batch
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - delivery
    - sale_stock
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - utm
    - stock_account
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
product_normal_form_view product.normal.form product.product xpath Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.batch.picking res.config.settings div Inherits stock.res_config_settings_view_form
stock_picking_batch_filter stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_filter
stock_picking_batch_form stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_form
stock_picking_batch_tree stock.picking.batch field Inherits stock_picking_batch.stock_picking_batch_tree
stock_picking_to_batch_form stock.picking.to.batch field Inherits stock_picking_batch.stock_picking_to_batch_form
view_move_line_tree stock.move.line field Inherits stock_picking_batch.view_move_line_tree
view_picking_form stock.picking field Inherits stock.view_picking_form
view_warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (10)

New fields (1)
  • description_warehouse Text
    translate=True args: 'Warehouse Description'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (7)
  • key_level_0(self, operation)
    @api.model
  • key_level_1(self, operation)
    @api.model
  • new_level_0(self, operation)
    @api.model
  • new_level_1(self, operation)
    @api.model
  • sort_level_0(self, rec_list)
    @api.model
  • sort_level_1(self, rec_list)
    @api.model
  • update_level_1(self, group_dict, operation)
    @api.model

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

No public methods.

New fields (1)
  • use_oca_batch_validation Boolean
    readonly=False related='company_id.use_oca_batch_validation' string='Use OCA approach to validate Picking Batch'
Public methods (0)

No public methods.

New fields (1)
  • batch_id Many2one → stock.picking.batch
    comodel_name='stock.picking.batch' related='picking_id.batch_id' store=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • active_picking_ids One2many → stock.picking
    comodel_name='stock.picking' domain=[('state', 'not in', ('cancel', 'done'))] help='List of active picking managed by this batch.' inverse_name='batch_id' readonly=True string='Active Pickings'
  • date Date
    default=fields.Date.context_today help='date on which the batch picking is to be processed' index=True readonly=True required=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]}
  • entire_package_detail_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of detailed operations'
  • entire_package_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of operations'
  • name Char
    index=True states={'draft': [('readonly', False)]}
  • notes Text
    help='free form remarks'
  • picking_count Integer
    compute='_compute_picking_count' string='# Pickings'
  • use_oca_batch_validation Boolean
    copy=False default=<expr>
  • user_id Many2one
    index=True
Public methods (6)
  • action_cancel(self)
    Call action_cancel for all batches pickings and set batches states to cancel too only if user set OCA batch validation approach.
  • action_picking_move_line_tree(self)
  • action_picking_move_tree(self)
  • action_print_picking(self)
  • action_view_stock_picking(self)
    This function returns an action that display existing pickings of given batch picking.
  • remove_undone_pickings(self)
    Remove of this batch all pickings which state is not done / cancel.

New fields (3)
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain=[('model', '=', 'stock.picking'), ('store', '=', True)] required=True string='Field to group'
  • picking_to_batch_id Many2one → stock.picking.to.batch
    comodel_name='stock.picking.to.batch' ondelete='cascade' required=True
  • sequence Integer
    default=0 help='Group by picking field'
Public methods (0)

No public methods.

New fields (5)
  • batch_by_group Boolean
    string='Create batch pickings grouped by fields'
  • group_field_ids One2many → stock.picking.batch.creator.group.field
    comodel_name='stock.picking.batch.creator.group.field' help='If set any, multiple batch picking will be created, one per group field' inverse_name='picking_to_batch_id' string='Group by field'
  • name Char
    help='Name of the batch picking'
  • notes Text
    help='Free form remarks'
  • user_id Many2one
    default=<expr>
Public methods (7)
  • action_create_batch(self)
    For OCA approach: Create a batch picking with selected pickings after having checked that they are not already in another batch or done/cancel. For non OCA approach or add to existing batch picking: Call to original method
  • action_view_batch_picking(self, batch_pickings)
    @api.model
  • create_multiple_batch(self, domain)
    Create n batch pickings by grouped fields selected
  • create_simple_batch(self, domain)
    Create one batch picking with all pickings
  • default_get(self, fields)
    @api.model
    Set last grouped fields used that are stored in config parameters
  • load_store_fields(self)
  • onchange_batch_by_group(self)
    @api.onchange('batch_by_group')

New fields (1)
  • default_user_id Many2one → res.users
    help='the user to which the batch pickings are assigned by default' index=True args: 'res.users', 'Default Picker'
Public methods (0)

No public methods.

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/14.0/stock_picking_batch_extended
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSOCA Transbot, oca-travis, Weblate, OCA-git-bot, sergiocorato, oca-ci, Kevin Luna, oca-git-bot, sonhd
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_picking_batch
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - delivery
    - sale_stock
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - utm
    - stock_account
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
product_normal_form_view product.normal.form product.product xpath Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.batch.picking res.config.settings div Inherits stock.res_config_settings_view_form
stock_batch_picking_form stock.picking.batch.form stock.picking.batch form New
stock_batch_picking_search batch.picking.search stock.picking.batch search New
stock_batch_picking_tree stock.picking.batch.tree stock.picking.batch tree New
view_create_batch_picking batch_picking_create_form stock.picking.batch.creator form New
view_picking_form stock.picking.form.batch stock.picking field Inherits stock.view_picking_form
view_picking_internal_search stock.picking.search.batch_picking stock.picking field Inherits stock.view_picking_internal_search
view_warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (9)

New fields (1)
  • description_warehouse Text
    translate=True args: 'Warehouse Description'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (7)
  • key_level_0(self, operation)
    @api.model
  • key_level_1(self, operation)
    @api.model
  • new_level_0(self, operation)
    @api.model
  • new_level_1(self, operation)
    @api.model
  • sort_level_0(self, rec_list)
    @api.model
  • sort_level_1(self, rec_list)
    @api.model
  • update_level_1(self, group_dict, operation)
    @api.model

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

No public methods.

New fields (1)
  • use_oca_batch_validation Boolean
    readonly=False related='company_id.use_oca_batch_validation' string='Use OCA approach to validate Picking Batch'
Public methods (0)

No public methods.

New fields (1)
  • batch_id Many2one
    domain="[('state', '=', 'draft')]" string='Batch'
Public methods (3)
  • action_assign(self)
    In addition to what the method in the parent class does, Changed batches states to assigned if all picking are assigned.
  • action_cancel(self)
    In addition to what the method in the parent class does, cancel the batches for which all pickings are cancelled
  • force_transfer(self, force_qty=True)
    Do the picking transfer (by calling action_done) If *force_qty* is True, force the transfer for all product_uom_qty when qty_done is 0. Otherwise, process only pack operation with qty_done. If a picking has no qty_done filled, we released it from his batch

New fields (13)
  • active_picking_ids One2many → stock.picking
    comodel_name='stock.picking' domain=[('state', 'not in', ('cancel', 'done'))] help='List of active picking managed by this batch.' inverse_name='batch_id' readonly=True string='Active Pickings'
  • date Date
    default=fields.Date.context_today help='date on which the batch picking is to be processed' index=True readonly=True required=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]} string='Date'
  • entire_package_detail_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of detailed operations'
  • entire_package_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of operations'
  • move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_move_line_ids' readonly=False string='Detailed operations'
  • move_lines Many2many → stock.move
    comodel_name='stock.move' compute='_compute_move_lines' string='Operations'
  • name Char
    default=<expr> index=True states={'draft': [('readonly', False)]}
  • notes Text
    help='free form remarks' args: 'Notes'
  • picking_count Integer
    compute='_compute_picking_count' string='# Pickings'
  • picking_ids One2many
    help='List of picking managed by this batch.' readonly=True states={'draft': [('readonly', False)]} string='Pickings'
  • state Selection
    help='the state of the batch picking. Workflow is draft -> in_progress/assigned -> done or cancel' index=True ondelete={'assigned': 'set default'} readonly=True selection_add=[('assigned', 'Available')]
  • use_oca_batch_validation Boolean
    copy=False default=<expr>
  • user_id Many2one → res.users
    comodel_name='res.users' help='the user to which the pickings are assigned' index=True readonly=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]} string='Picker'
Public methods (8)
  • action_assign(self)
    Check if batches pickings are available.
  • action_cancel(self)
    Call action_cancel for all batches pickings and set batches states to cancel too.
  • action_print_picking(self)
  • action_transfer(self)
    Create wizard to process all active pickings in these batches
  • action_view_stock_picking(self)
    This function returns an action that display existing pickings of given batch picking.
  • get_not_empties(self)
    Return all batches in this recordset for which picking_ids is not empty. :raise UserError: If all batches are empty.
  • remove_undone_pickings(self)
    Remove of this batch all pickings which state is not done / cancel.
  • verify_state(self, expected_state=None)
    Check if batches states must be changed based on pickings states. If all pickings are canceled, batch must be canceled. If all pickings are canceled or done, batch must be done. If all pickings are canceled or done or *expected_state*, batch must be *expected_state*. :return: True if batches states has been changed.

New fields (6)
  • batch_by_group Boolean
    string='Create batch pickings grouped by fields'
  • date Date
    default=fields.Date.context_today help='Date on which the batch picking is to be processed' index=True required=True args: 'Date'
  • group_field_ids One2many → stock.picking.batch.creator.group.field
    comodel_name='stock.picking.batch.creator.group.field' help='If set any, multiple batch picking will be created, one per group field' inverse_name='batch_picking_creator_id' string='Group by field'
  • name Char
    default=<expr> help='Name of the batch picking' required=True args: 'Name'
  • notes Text
    help='Free form remarks' args: 'Notes'
  • user_id Many2one → res.users
    default=<expr> help='The user to which the pickings are assigned' string='Picker' args: 'res.users'
Public methods (7)
  • action_create_batch(self)
    Create a batch picking with selected pickings after having checked that they are not already in another batch or done/cancel.
  • action_view_batch_picking(self, batch_pickings)
  • create_multiple_batch(self, domain)
    Create n batch pickings by grouped fields selected
  • create_simple_batch(self, domain)
    Create one batch picking with all pickings
  • default_get(self, fields)
    @api.model
    Set last grouped fields used that are stored in config parameters
  • load_store_fields(self)
  • onchange_batch_by_group(self)
    @api.onchange('batch_by_group')

New fields (3)
  • batch_picking_creator_id Many2one → stock.picking.batch.creator
    comodel_name='stock.picking.batch.creator' ondelete='cascade' required=True
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain=[('model', '=', 'stock.picking'), ('store', '=', True)] required=True string='Field to group'
  • sequence Integer
    default=0 help='Group by picking field'
Public methods (0)

No public methods.

New fields (1)
  • default_user_id Many2one → res.users
    help='the user to which the batch pickings are assigned by default' index=True args: 'res.users', 'Default Picker'
Public methods (0)

No public methods.

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/13.0/stock_picking_batch_extended
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSPedro M. Baeza, Carlos Dauden, OCA Transbot, sergio-teruel, Víctor Martínez, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_picking_batch
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - delivery
    - sale_stock
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
    - stock_account
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
product_normal_form_view product.normal.form product.product xpath Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.batch.picking res.config.settings div Inherits stock.res_config_settings_view_form
stock_batch_picking_form stock.picking.batch.form stock.picking.batch form New
stock_batch_picking_search batch.picking.search stock.picking.batch search New
stock_batch_picking_tree stock.picking.batch.tree stock.picking.batch tree New
view_create_batch_picking batch_picking_create_form stock.picking.batch.creator form New
view_picking_form stock.picking.form.batch stock.picking field Inherits stock.view_picking_form
view_picking_internal_search stock.picking.search.batch_picking stock.picking field Inherits stock.view_picking_internal_search
view_warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (9)

New fields (1)
  • description_warehouse Text
    translate=True args: 'Warehouse Description'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (7)
  • key_level_0(self, operation)
    @api.model
  • key_level_1(self, operation)
    @api.model
  • new_level_0(self, operation)
    @api.model
  • new_level_1(self, operation)
    @api.model
  • sort_level_0(self, rec_list)
    @api.model
  • sort_level_1(self, rec_list)
    @api.model
  • update_level_1(self, group_dict, operation)
    @api.model

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

No public methods.

New fields (1)
  • use_oca_batch_validation Boolean
    readonly=False related='company_id.use_oca_batch_validation' string='Use OCA approach to validate Picking Batch'
Public methods (0)

No public methods.

New fields (1)
  • batch_id Many2one
    domain="[('state', '=', 'draft')]" string='Batch'
Public methods (4)
  • action_assign(self)
    In addition to what the method in the parent class does, Changed batches states to assigned if all picking are assigned.
  • action_cancel(self)
    In addition to what the method in the parent class does, cancel the batches for which all pickings are cancelled
  • action_done(self)
    In addition to what the method in the parent class does, Changed batches states to done if all picking are done.
  • force_transfer(self, force_qty=True)
    Do the picking transfer (by calling action_done) If *force_qty* is True, force the transfer for all product_uom_qty when qty_done is 0. Otherwise, process only pack operation with qty_done. If a picking has no qty_done filled, we released it from his batch

New fields (13)
  • active_picking_ids One2many → stock.picking
    comodel_name='stock.picking' domain=[('state', 'not in', ('cancel', 'done'))] inverse_name='batch_id' readonly=True string='Active Pickings'
  • date Date
    default=fields.Date.context_today help='date on which the batch picking is to be processed' index=True readonly=True required=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]} string='Date'
  • entire_package_detail_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of detailed operations'
  • entire_package_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of operations'
  • move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_move_line_ids' readonly=False string='Detailed operations'
  • move_lines Many2many → stock.move
    comodel_name='stock.move' compute='_compute_move_lines' string='Operations'
  • name Char
    default=<expr> index=True states={'draft': [('readonly', False)]} unique=True
  • notes Text
    help='free form remarks' args: 'Notes'
  • picking_count Integer
    compute='_compute_picking_count' string='# Pickings'
  • picking_ids One2many
    help='List of picking managed by this batch.' readonly=True states={'draft': [('readonly', False)]} string='Pickings'
  • state Selection
    help='the state of the batch picking. Workflow is draft -> in_progress/assigned -> done or cancel' index=True readonly=True selection_add=[('assigned', 'Available')]
  • use_oca_batch_validation Boolean
    copy=False default=<expr>
  • user_id Many2one → res.users
    comodel_name='res.users' help='the user to which the pickings are assigned' index=True old_name='picker_id' readonly=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]} string='Picker'
Public methods (8)
  • action_assign(self)
    Check if batches pickings are available.
  • action_cancel(self)
    Call action_cancel for all batches pickings and set batches states to cancel too.
  • action_print_picking(self)
  • action_transfer(self)
    Create wizard to process all active pickings in these batches
  • action_view_stock_picking(self)
    This function returns an action that display existing pickings of given batch picking.
  • get_not_empties(self)
    Return all batches in this recordset for which picking_ids is not empty. :raise UserError: If all batches are empty.
  • remove_undone_pickings(self)
    Remove of this batch all pickings which state is not done / cancel.
  • verify_state(self, expected_state=None)
    Check if batches states must be changed based on pickings states. If all pickings are canceled, batch must be canceled. If all pickings are canceled or done, batch must be done. If all pickings are canceled or done or *expected_state*, batch must be *expected_state*. :return: True if batches states has been changed.

New fields (6)
  • batch_by_group Boolean
    string='Create batch pickings grouped by fields'
  • date Date
    default=fields.Date.context_today help='Date on which the batch picking is to be processed' index=True required=True args: 'Date'
  • group_field_ids One2many → stock.picking.batch.creator.group.field
    comodel_name='stock.picking.batch.creator.group.field' help='If set any, multiple batch picking will be created, one per group field' inverse_name='batch_picking_creator_id' string='Group by field'
  • name Char
    default=<expr> help='Name of the batch picking' required=True args: 'Name'
  • notes Text
    help='Free form remarks' args: 'Notes'
  • user_id Many2one → res.users
    default=<expr> help='The user to which the pickings are assigned' string='Picker' args: 'res.users'
Public methods (7)
  • action_create_batch(self)
    Create a batch picking with selected pickings after having checked that they are not already in another batch or done/cancel.
  • action_view_batch_picking(self, batch_pickings)
  • create_multiple_batch(self, domain)
    Create n batch pickings by grouped fields selected
  • create_simple_batch(self, domain)
    Create one batch picking with all pickings
  • default_get(self, fields)
    @api.model
    Set last grouped fields used that are stored in config parameters
  • load_store_fields(self)
  • onchange_batch_by_group(self)
    @api.onchange('batch_by_group')

New fields (3)
  • batch_picking_creator_id Many2one → stock.picking.batch.creator
    comodel_name='stock.picking.batch.creator' ondelete='cascade' required=True
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain=[('model', '=', 'stock.picking'), ('store', '=', True)] required=True string='Field to group'
  • sequence Integer
    default=0 help='Group by picking field'
Public methods (0)

No public methods.

New fields (1)
  • default_user_id Many2one → res.users
    help='the user to which the batch pickings are assigned by default' index=True args: 'res.users', 'Default Picker'
Public methods (0)

No public methods.

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/12.0/stock_picking_batch_extended
VERSION
VERSION 1.3.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSPedro M. Baeza, Denis Roussel, Carlos Dauden, OCA Transbot, sergio-teruel, oca-travis, Weblate, OCA-git-bot, Iryna Vushnevska, Adrià Gil Sorribes
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:21
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/stock-logistics-workflow:
    - stock_picking_mass_action
odoo/odoo:
    - stock_picking_batch
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - delivery
    - sale_stock
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - portal
    - http_routing
    - digest
    - stock_account
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
product_normal_form_view product.normal.form product.product xpath Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.batch.picking res.config.settings div Inherits stock.res_config_settings_view_form
stock_batch_picking_form stock.picking.batch.form stock.picking.batch form New
stock_batch_picking_search batch.picking.search stock.picking.batch search New
stock_batch_picking_tree stock.picking.batch.tree stock.picking.batch tree New
view_create_batch_picking batch_picking_create_form stock.picking.batch.creator form New
view_picking_form stock.picking.form.batch stock.picking field Inherits stock.view_picking_form
view_picking_internal_search stock.picking.search.batch_picking stock.picking field Inherits stock.view_picking_internal_search
view_warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (9)

New fields (1)
  • description_warehouse Text
    translate=True args: 'Warehouse Description'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (7)
  • key_level_0(self, operation)
    @api.model
  • key_level_1(self, operation)
    @api.model
  • new_level_0(self, operation)
    @api.model
  • new_level_1(self, operation)
    @api.model
  • sort_level_0(self, rec_list)
    @api.model
  • sort_level_1(self, rec_list)
    @api.model
  • update_level_1(self, group_dict, operation)
    @api.model

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

No public methods.

New fields (1)
  • use_oca_batch_validation Boolean
    readonly=False related='company_id.use_oca_batch_validation' string='Use OCA approach to validate Picking Batch'
Public methods (0)

No public methods.

New fields (1)
  • batch_id Many2one
    domain="[('state', '=', 'draft')]" string='Batch'
Public methods (4)
  • action_assign(self)
    @api.multi
    In addition to what the method in the parent class does, Changed batches states to assigned if all picking are assigned.
  • action_cancel(self)
    @api.multi
    In addition to what the method in the parent class does, cancel the batches for which all pickings are cancelled
  • action_done(self)
    @api.multi
    In addition to what the method in the parent class does, Changed batches states to done if all picking are done.
  • force_transfer(self, force_qty=True)
    Do the picking transfer (by calling action_done) If *force_qty* is True, force the transfer for all product_uom_qty when qty_done is 0. Otherwise, process only pack operation with qty_done. If a picking has no qty_done filled, we released it from his batch

New fields (13)
  • active_picking_ids One2many → stock.picking
    comodel_name='stock.picking' domain=[('state', 'not in', ('cancel', 'done'))] inverse_name='batch_id' readonly=True string='Active Pickings'
  • date Date
    default=fields.Date.context_today help='date on which the batch picking is to be processed' index=True readonly=True required=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]} string='Date'
  • entire_package_detail_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of detailed operations'
  • entire_package_ids Many2many → stock.quant.package
    comodel_name='stock.quant.package' compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of operations'
  • move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_move_line_ids' inverse=<expr> string='Detailed operations'
  • move_lines Many2many → stock.move
    comodel_name='stock.move' compute='_compute_move_lines' readonly=True string='Operations'
  • name Char
    default=<expr> index=True states={'draft': [('readonly', False)]} unique=True
  • notes Text
    help='free form remarks' args: 'Notes'
  • picking_count Integer
    compute='_compute_picking_count' string='# Pickings'
  • picking_ids One2many
    help='List of picking managed by this batch.' readonly=True states={'draft': [('readonly', False)]} string='Pickings'
  • state Selection
    help='the state of the batch picking. Workflow is draft -> in_progress/assigned -> done or cancel' index=True readonly=True selection_add=[('assigned', 'Available')]
  • use_oca_batch_validation Boolean
    copy=False default=<expr>
  • user_id Many2one → res.users
    comodel_name='res.users' help='the user to which the pickings are assigned' index=True old_name='picker_id' readonly=True states={'draft': [('readonly', False)], 'in_progress': [('readonly', False)]} string='Picker'
Public methods (8)
  • action_assign(self)
    @api.multi
    Check if batches pickings are available.
  • action_cancel(self)
    @api.multi
    Call action_cancel for all batches pickings and set batches states to cancel too.
  • action_print_picking(self)
    @api.multi
  • action_transfer(self)
    @api.multi
    Create wizard to process all active pickings in these batches
  • action_view_stock_picking(self)
    @api.multi
    This function returns an action that display existing pickings of given batch picking.
  • get_not_empties(self)
    Return all batches in this recordset for which picking_ids is not empty. :raise UserError: If all batches are empty.
  • remove_undone_pickings(self)
    @api.multi
    Remove of this batch all pickings which state is not done / cancel.
  • verify_state(self, expected_state=None)
    Check if batches states must be changed based on pickings states. If all pickings are canceled, batch must be canceled. If all pickings are canceled or done, batch must be done. If all pickings are canceled or done or *expected_state*, batch must be *expected_state*. :return: True if batches states has been changed.

New fields (6)
  • batch_by_group Boolean
    string='Create batch pickings grouped by fields'
  • date Date
    default=fields.Date.context_today help='Date on which the batch picking is to be processed' index=True required=True args: 'Date'
  • group_field_ids One2many → stock.picking.batch.creator.group.field
    comodel_name='stock.picking.batch.creator.group.field' help='If set any, multiple batch picking will be created, one per group field' inverse_name='batch_picking_creator_id' string='Group by field'
  • name Char
    default=<expr> help='Name of the batch picking' required=True args: 'Name'
  • notes Text
    help='Free form remarks' args: 'Notes'
  • user_id Many2one → res.users
    default=<expr> help='The user to which the pickings are assigned' oldname='picker_id' string='Picker' args: 'res.users'
Public methods (7)
  • action_create_batch(self)
    @api.multi
    Create a batch picking with selected pickings after having checked that they are not already in another batch or done/cancel.
  • action_view_batch_picking(self, batch_pickings)
    @api.multi
  • create_multiple_batch(self, domain)
    Create n batch pickings by grouped fields selected
  • create_simple_batch(self, domain)
    Create one batch picking with all pickings
  • default_get(self, fields)
    @api.model
    Set last grouped fields used that are stored in config parameters
  • load_store_fields(self)
  • onchange_batch_by_group(self)
    @api.onchange('batch_by_group')

New fields (3)
  • batch_picking_creator_id Many2one → stock.picking.batch.creator
    comodel_name='stock.picking.batch.creator' ondelete='cascade' required=True
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain=[('model', '=', 'stock.picking'), ('store', '=', True)] required=True string='Field to group'
  • sequence Integer
    default=0 help='Group by picking field'
Public methods (0)

No public methods.

New fields (1)
  • default_user_id Many2one → res.users
    help='the user to which the batch pickings are assigned by default' index=True args: 'res.users', 'Default Picker'
Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/stock-logistics-workflow
PULL REQUEST
PULL REQUEST[17.0][MIG] stock_picking_batch_extended: Migration to version 17.0 (#1997)