Stock batch picking

stock_batch_picking
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/11.0/stock_batch_picking
VERSION
VERSION 1.4.0
CATEGORY
CATEGORYInventory
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, OCA Transbot, Sergio Teruel, oca-travis, Weblate, OCA-git-bot, Isaac Gallart Bochons
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - delivery
    - sale_stock
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account
    - product
    - decimal_precision
    - analytic
    - web_planner
    - portal
    - http_routing
    - account_invoicing
    - stock_account
    - stock
    - barcodes
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 field Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
stock_batch_picking_form stock.batch.picking.form stock.batch.picking form New
stock_batch_picking_search batch.picking.search stock.batch.picking search New
stock_batch_picking_tree stock.batch.picking.tree stock.batch.picking tree New
view_create_batch_picking batch_picking_create_form stock.batch.picking.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 (7)

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 (8)
  • get_report_values(self, docids, data=None)
    @api.model
  • 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 (11)
  • active_picking_ids One2many → stock.picking
    domain=[('state', 'not in', ('cancel', 'done'))] readonly=True args: 'stock.picking', 'batch_picking_id', '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)], 'assigned': [('readonly', False)]} args: '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
    compute='_compute_move_line_ids' inverse=<expr> string='Related pack operations' args: 'stock.move.line'
  • move_lines Many2many → stock.move
    compute='_compute_move_lines' readonly=True string='Related stock moves' args: 'stock.move'
  • name Char
    copy=False default=<expr> index=True required=True states={'draft': [('readonly', False)]} unique=True args: 'Name'
  • notes Text
    help='free form remarks' args: 'Notes'
  • picker_id Many2one → res.users
    help='the user to which the pickings are assigned' index=True readonly=True states={'draft': [('readonly', False)], 'assigned': [('readonly', False)]} args: 'res.users', 'Picker'
  • picking_ids One2many → stock.picking
    help='List of picking managed by this batch.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.picking', 'batch_picking_id', 'Pickings'
  • state Selection
    copy=False default='draft' help='the state of the batch picking. Workflow is draft -> assigned -> done or cancel' index=True readonly=True string='State' args: [('draft', 'Draft'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (7)
  • 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_transfer(self)
    @api.multi
    Make the transfer for all active pickings in these batches and set state to done all picking are done.
  • 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.batch.picking.creator.group.field
    comodel_name='stock.batch.picking.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'
  • picker_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)
    @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.batch.picking.creator
    comodel_name='stock.batch.picking.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
    help='Group by picking field'
Public methods (0)

No public methods.

New fields (1)
  • batch_picking_id Many2one → stock.batch.picking
    comodel_name='stock.batch.picking' copy=False domain="[('state', '=', 'draft')]" help='In which batch picking this picking will be processed.' 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 (1)
  • default_picker_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/10.0/stock_batch_picking
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYInventory
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSCamptocamp
COMMITTERS
COMMITTERSPedro M. Baeza
WEBSITE
WEBSITEhttp://www.camptocamp.com/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - delivery
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_planner
    - procurement
    - stock_account
    - stock
    - barcodes
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 field Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
stock_batch_picking_form stock.batch.picking.form stock.batch.picking form New
stock_batch_picking_search batch.picking.search stock.batch.picking search New
stock_batch_picking_tree stock.batch.picking.tree stock.batch.picking tree New
view_create_batch_picking batch_picking_create_form stock.batch.picking.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
vpicktree stock.picking.tree stock.picking tree New
Models touched (6)

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 (0)

No public methods.

New fields (11)
  • active_picking_ids One2many → stock.picking
    domain=[('state', 'not in', ('cancel', 'done'))] readonly=True args: 'stock.picking', 'batch_picking_id', '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)], 'assigned': [('readonly', False)]} args: 'Date'
  • move_ids One2many → stock.move
    compute='_compute_move_ids' readonly=True string='Related stock moves' args: 'stock.move'
  • name Char
    copy=False default=<expr> index=True required=True states={'draft': [('readonly', False)]} unique=True args: 'Name'
  • notes Text
    help='free form remarks' args: 'Notes'
  • pack_operation_ids One2many → stock.pack.operation
    compute='_compute_pack_operation_ids' readonly=True string='Related pack operations' args: 'stock.pack.operation'
  • pack_operation_pack_ids One2many → stock.pack.operation
    compute='_compute_pack_operation_pack_ids' inverse=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} string='Related pack operations' args: 'stock.pack.operation'
  • pack_operation_product_ids One2many → stock.pack.operation
    compute='_compute_pack_operation_product_ids' inverse=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} string='Related pack operations' args: 'stock.pack.operation'
  • picker_id Many2one → res.users
    help='the user to which the pickings are assigned' index=True readonly=True states={'draft': [('readonly', False)], 'assigned': [('readonly', False)]} args: 'res.users', 'Picker'
  • picking_ids One2many → stock.picking
    help='List of picking managed by this batch.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.picking', 'batch_picking_id', 'Pickings'
  • state Selection
    copy=False default='draft' help='the state of the batch picking. Workflow is draft -> assigned -> done or cancel' index=True readonly=True string='State' args: [('draft', 'Draft'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (6)
  • 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_transfer(self)
    @api.multi
    Make the transfer for all active pickings in these batches and set state to done all picking are done.
  • 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 (4)
  • date Date
    default=fields.Date.context_today help='Date on which the batch picking is to be processed' required=True select=True args: 'Date'
  • name Char
    default=<expr> help='Name of the batch picking' required=True args: 'Name'
  • notes Text
    help='free form remarks' args: 'Notes'
  • picker_id Many2one → res.users
    default=<expr> help='The user to which the pickings are assigned' string='Picker' args: 'res.users'
Public methods (1)
  • 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.

New fields (1)
  • batch_picking_id Many2one → stock.batch.picking
    comodel_name='stock.batch.picking' copy=False domain="[('state', '=', 'draft')]" help='In which batch picking this picking will be processed.' 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
  • do_transfer(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 do_transfer) If *force_qty* is True, force the transfer for all product_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 (1)
  • default_picker_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/9.0/stock_batch_picking
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYInventory
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSCamptocamp
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, sebalix, Carlos Dauden, OCA Transbot, mdietrichc2c, oca-travis, Weblate, OCA-git-bot, Cyril Gaudin, mpanarin, Iryna Vyshnevska
WEBSITE
WEBSITEhttp://www.camptocamp.com/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - delivery
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_tip
    - web_planner
    - procurement
    - stock_account
    - stock
    - barcodes
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 field Inherits product.product_normal_form_view
report_batch_picking report_batch_picking ir.ui.view qweb New
stock_batch_picking_form stock.batch.picking.form stock.batch.picking form New
stock_batch_picking_search batch.picking.search stock.batch.picking search New
stock_batch_picking_tree stock.batch.picking.tree stock.batch.picking tree New
view_create_batch_picking batch_picking_create_form stock.batch.picking.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 (6)

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 (0)

No public methods.

New fields (11)
  • active_picking_ids One2many → stock.picking
    domain=[('state', 'not in', ('cancel', 'done'))] readonly=True args: 'stock.picking', 'batch_picking_id', '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)], 'assigned': [('readonly', False)]} args: 'Date'
  • move_ids One2many → stock.move
    compute='_compute_move_ids' readonly=True string='Related stock moves' args: 'stock.move'
  • name Char
    copy=False default=<expr> index=True required=True states={'draft': [('readonly', False)]} unique=True args: 'Name'
  • notes Text
    help='free form remarks' args: 'Notes'
  • pack_operation_ids One2many → stock.pack.operation
    compute='_compute_pack_operation_ids' readonly=True string='Related pack operations' args: 'stock.pack.operation'
  • pack_operation_pack_ids One2many → stock.pack.operation
    compute='_compute_pack_operation_pack_ids' inverse=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} string='Related pack operations' args: 'stock.pack.operation'
  • pack_operation_product_ids One2many → stock.pack.operation
    compute='_compute_pack_operation_product_ids' inverse=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} string='Related pack operations' args: 'stock.pack.operation'
  • picker_id Many2one → res.users
    help='the user to which the pickings are assigned' index=True readonly=True states={'draft': [('readonly', False)], 'assigned': [('readonly', False)]} args: 'res.users', 'Picker'
  • picking_ids One2many → stock.picking
    help='List of picking managed by this batch.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.picking', 'batch_picking_id', 'Pickings'
  • state Selection
    copy=False default='draft' help='the state of the batch picking. Workflow is draft -> assigned -> done or cancel' index=True readonly=True string='State' args: [('draft', 'Draft'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (6)
  • 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_transfer(self)
    @api.multi
    Make the transfer for all active pickings in these batches and set state to done all picking are done.
  • 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 (4)
  • date Date
    default=fields.Date.context_today help='Date on which the batch picking is to be processed' required=True select=True args: 'Date'
  • name Char
    default=<expr> help='Name of the batch picking' required=True args: 'Name'
  • notes Text
    help='free form remarks' args: 'Notes'
  • picker_id Many2one → res.users
    default=<expr> help='The user to which the pickings are assigned' string='Picker' args: 'res.users'
Public methods (1)
  • 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.

New fields (1)
  • batch_picking_id Many2one → stock.batch.picking
    comodel_name='stock.batch.picking' copy=False domain="[('state', '=', 'draft')]" help='In which batch picking this picking will be processed.' 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
  • do_transfer(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 do_transfer) If *force_qty* is True, force the transfer for all product_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 (1)
  • default_picker_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.