Inventory

stock
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYSupply Chain/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Atul Patel, Aaron Bohy, Adrien Dieudonne, Christophe Monniez, Arnold Moyaux, Julien Castiaux, Denis Roussel, Victor Feyens, William Henrotin, svs-odoo, Lois Rilo, Alvaro Fuentes, std-odoo, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Ashmawy Walid (was), Miquel Raïch, David (dafr), JF Aubert, Abdelouahab (abla), Aurelien van Delft (avd), Hubert Van De Walle, luvi, Renaud Thiry, Vincent Larcin, alsh-odoo, Louis Wicket (wil), Adrien Widart (awt), Victor Piryns (pivi), clesgow, Djamel Touati, Pieter Claeys (clpi), Andrew Gavgavian, Levi Siuzdak (sile), Naman Shah, Dylan Kiss (dyki), Jinane Maksoud, ノウラ, kir-odoo, Odoo, bram1000, Martin Maes, tanghulu0608, Xavier Bol (xbo), Paweł Fertyk, adda-odoo, omra-odoo, Walid (wasa), sesn-odoo, stefanorigano (SRI), aktr-odoo, Ethan Vincent, lase@odoo.com, Quentin Wolfs, Aurelien MARIE (auma), reka-odoo, Nathaniel (naja), vava-odoo, Bastien Fafchamps (bafa), Julien Carion (juca), kcv-odoo, Ritika Rathore, Louis Gobert, nihp-odoo, Chrysanthe (chgo), sami odoo, =, asno-odoo, Junqi Wu, mano-odoo, Max Whale, Hussein Ebrahim(hyhe), Patricia Daloze (pda), yagp-odoo, Stéphane Diez, dhpa-odoo, Mohammad Abdulmoneim, dhha-odoo, Mathias Mathy (MAMA), Edoardo Piroli, komugi-al, kawkb, gteboul, Hammad Arif, Pierre Pulinckx (PIPU), Jitendra Prajapat, Ian, Victor Miguel Armenta Carrillo, st-yes, Arthur Nanson, David Van Droogenbroeck (DROD), elhayyany, pkgu-odoo, Mohammad Abdulmoneim (abdu), djameltouati, khsr-odoo, Pierre Lamotte (pila), Michaël Mattiello, Pierre Pulinckx, Bastien PIERRE, Corentin Heinix (cohe), Corentin Lombard, kasm, chha-odoo, MaximeNoirhomme, plha-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), Omar (OSAH), Ajit Singh, joseph, BT-anieto, krip-odoo, Basioni (basm), utma-odoo, Robin Engels (roen), Hadi El Yakhni, vlst-odoo, Maeva De Keyser (MDEK), sagu-odoo, Ester Andreetto, nsirjacobs, defl, bhna-odoo, MAGREMENT, rare-odoo, sawer, depr-odoo, kinhosz, agbr-odoo, aksi-odoo, Ze Chen (zeche), mohannedah, Junqi, Lulu Grimalkin (lugr), temo-odoo, Lancelot Semal, Laetitia (ldau), adip-odoo, Quentin Colla (qucol), ABE-Mark45, path-odoo, Amr Elkhatieb, Cooper Spinelli, Robert Smith (rosm), Elliot ELCO, hossamelgendy1, damrOdoo, Joe Wesnofske, YoussefM890, srap-odoo, saurabh, Nguyen Nguyen (ngtpn), tpma-odoo, sako-odoo, Jonathan Swales, Youssef (abyo), Zachary (zavan), msho-odoo, chpa-odoo, hapt-odoo, Joseph Nechleba (jonec), ddba-odoo, Shiv Bhadaniya (sbha), Sanket Tank(stan), Antonio Pimentel, Mathias Mathy, Youssef, Thomas Schneider, qucol-odoo, kush-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/inventory
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 20:50:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (177)
XML IDNameModelTypeStatus
alternative_zpl_label alternative_zpl_label ir.ui.view qweb New
exception_on_picking exception_on_picking ir.ui.view qweb New
help_message_template Help Message ir.ui.view qweb New
inventory_warning_reset_view inventory.reset.warning.view stock.inventory.warning form New
inventory_warning_set_view inventory.set.warning.view stock.inventory.warning form New
jewelry_zpl_label jewelry_zpl_label ir.ui.view qweb New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_history_template_view label_package_history_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_packaging_barcode_view label_packaging_barcode_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
lot_label_layout_form_picking lot.label.layout.form lot.label.layout form New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
normal_zpl_label normal_zpl_label ir.ui.view qweb New
package_history_search_view stock.package.history.search stock.package.history search New
picking_label_type_form picking.label.type.form picking.label.type form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_label_layout_form_picking product.label.layout.form product.label.layout xpath Inherits product.product_label_layout_form
product_label_layout_form_stock product.label.layout.form.stock product.label.layout xpath Inherits product.product_label_layout_form
product_product_stock_tree product.product.stock.list product.product list New
product_search_form_view_stock product.search.stock.form product.product filter Inherits product.product_search_form_view
product_search_form_view_stock_report product.product.search.stock.form.stock.report product.product filter Inherits stock_product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template field Inherits product.product_template_search_view
product_template_search_view_inherit_stock product.template.search.inherit.stock product.template filter Inherits product.product_template_search_view
product_uom_form_view_inherit uom.uom.form.inherit uom.uom div Inherits uom.product_uom_form_view
product_uom_tree_view_inherit uom.uom.list.inherit uom.uom field Inherits uom.product_uom_tree_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.stock product.product field Inherits product.product_view_kanban_catalog
quant_search_view stock.quant.search stock.quant search New
replenishment_option_tree_view stock.replenishment.option.list.view stock.replenishment.option list New
replenishment_option_warning_view stock.replenishment.warning.view stock.replenishment.option form New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_generic_barcode report_generic_barcode ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_content report_package_barcode_content ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_package_history_barcode report_package_history_barcode ir.ui.view qweb New
report_package_history_barcode_small report_package_history_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_packages report_picking_packages ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_reception report_reception ir.ui.view qweb New
report_reception_body report_reception_body ir.ui.view qweb New
report_reception_report_label report_reception_report_label ir.ui.view qweb New
report_return_document report_return_document ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.lot search New
small_zpl_label small_zpl_label ir.ui.view qweb New
stock.report_return_slip stock.report_return_slip ir.ui.view qweb New
stock_inventory_adjustment_name_form_view stock.inventory.adjustment.name.form.view stock.inventory.adjustment.name form New
stock_inventory_conflict_form_view stock.inventory.conflict.form.view stock.inventory.conflict form New
stock_inventory_request_count_form_view stock.request.count.form.view stock.request.count form New
stock_location_route_form_view stock.location.route.form stock.route form New
stock_location_route_tree stock.location.route.list stock.route list New
stock_location_route_view_search stock.location.route.search stock.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.list2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_package_type_form stock.package.type.form stock.package.type form New
stock_package_type_tree stock.package.type.list stock.package.type list New
stock_package_view_add_list stock.package.add.package.list stock.package list New
stock_package_view_form stock.package.form stock.package form New
stock_package_view_kanban stock.package.kanban stock.package kanban New
stock_package_view_list stock.package.list stock.package list New
stock_package_view_list_editable stock.package.list.editable stock.package list New
stock_package_view_search stock.package.search stock.package search New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_picking_view_activity stock.picking.view.activity stock.picking activity New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_put_in_pack_form stock.put.in.pack.form stock.put.in.pack form New
stock_putaway_list stock.putaway.rule.list stock.putaway.rule list New
stock_quant_relocate_view_form Stock Relocation stock.quant.relocate form New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_reference_form_view stock.reference.form stock.reference form New
stock_reference_search_view stock.reference.search stock.reference search New
stock_reference_tree_view stock.reference.list stock.reference list New
stock_reorder_report_search stock.warehouse.orderpoint.reorder.search stock.warehouse.orderpoint search New
stock_report_delivery_aggregated_move_lines stock_report_delivery_aggregated_move_lines ir.ui.view qweb New
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb New
stock_report_delivery_no_package_section_line stock_report_delivery_no_package_section_line ir.ui.view qweb New
stock_report_delivery_package_section_line stock_report_delivery_package_section_line ir.ui.view qweb New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.list stock.scrap list New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_storage_category_capacity_tree stock.storage.category.capacity.list stock.storage.category.capacity list New
stock_storage_category_form stock.storage.category.form stock.storage.category form New
stock_storage_category_tree stock.storage.category.list stock.storage.category list New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.list stock.location list New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_mobile_form stock.move.line.mobile.form stock.move.line xpath Inherits stock.view_move_line_form
view_move_line_tree stock.move.line.list stock.move.line list New
view_move_line_tree_detailed stock.move.line.list.detailed stock.move.line list New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.list stock.move list New
view_move_tree_receipt_picking stock.move.tree2 stock.move list New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner group Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.list stock.move list New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_tree Operation types stock.picking.type list New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.lot form New
view_production_lot_kanban stock.production.lot.kanban stock.lot kanban New
view_production_lot_tree stock.production.lot.list stock.lot list New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_move_line_detailed_operation_tree stock.move.line.operations.list stock.move.line list New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.list stock.move.line list New
view_stock_move_line_pivot stock.move.line.pivot stock.move.line pivot New
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_orderpoint_snooze Stock Orderpoint Snooze stock.orderpoint.snooze form New
view_stock_package_history_list stock.package.history.list stock.package.history list New
view_stock_product_template_tree product.template.stock.list.inherit product.template field Inherits product.product_template_tree_view
view_stock_product_tree product.stock.list.inherit product.product field Inherits product.product_product_tree_view
view_stock_quant_form view.stock.quant.form stock.quant form New
view_stock_quant_form_editable stock.quant.form.editable stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.list stock.quant xpath Inherits stock.view_stock_quant_tree_simple
view_stock_quant_tree_editable stock.quant.list.editable stock.quant list New
view_stock_quant_tree_inventory_editable stock.quant.inventory.list.editable stock.quant list New
view_stock_quant_tree_simple stock.quant.list stock.quant list New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_replenishment_info Stock Replenishment Information stock.replenishment.info form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.list stock.rule list New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template field Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree_editable stock.warehouse.orderpoint.list.editable stock.warehouse.orderpoint list New
view_warehouse_orderpoint_tree_editable_show_trigger stock.warehouse.orderpoint.list.editable.inherit.show_trigger stock.warehouse.orderpoint xpath Inherits stock.view_warehouse_orderpoint_tree_editable
view_warehouse_tree stock.warehouse.list stock.warehouse list New
vpicktree stock.picking.list stock.picking list New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (63)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'location': 'set default', 'lot': 'set default', 'package': 'set default'} selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • label_quantity Selection
    default='lots' help="If the UoM of a lot is not 'units', the lot will be considered as a unit and only one label will be printed for this lot." required=True string='Quantity to print' args: [('lots', 'One per lot/SN'), ('units', 'One per unit')]
  • move_line_ids Many2many → stock.move.line
    args: 'stock.move.line'
  • print_format Selection
    default='4x12' required=True string='Format' args: [('4x12', '4 x 12'), ('zpl', 'ZPL Labels')]
Public methods (1)
  • process(self)

New fields (2)
  • label_type Selection
    default='products' required=True string='Labels to print' args: [('products', 'Product Labels'), ('lots', 'Lot/SN Labels')]
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
Public methods (1)
  • process(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • filter_for_stock_putaway_rule Boolean
    search='_search_filter_for_stock_putaway_rule' store=False args: 'stock.putaway.rule'
  • packaging_reserve_method Selection
    default='partial' help='Reserve Only Full Packagings: will not reserve partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then only 1000 will be reserved\nReserve Partial Packagings: allow reserving partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then 1600 will be reserved' string='Reserve Packagings' args: [('full', 'Reserve Only Full Packagings'), ('partial', 'Reserve Partial Packagings')]
  • parent_route_ids Many2many → stock.route
    compute='_compute_parent_route_ids' string='Parent Routes' args: 'stock.route'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nClosest location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).\nLeast Packages: FIFO but with the least number of packages possible when there are several packages containing the same product.' tracking=True args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.route', 'stock_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.route
    compute='_compute_total_route_ids' readonly=True search='_search_total_route_ids' string='Total routes' args: 'stock.route'
Public methods (0)

No public methods.

New fields (5)
  • move_ids Many2many → stock.move
    args: 'stock.move'
  • move_quantity Selection
    default='custom' required=True string='Quantity to print' args: [('move', 'Operation Quantities'), ('custom', 'Custom')]
  • print_format Selection
    ondelete={'zpl': 'set default', 'zplxprice': 'set default'} selection_add=[('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
  • zpl_preview Image
    default=_get_zpl_label_placeholder readonly=True args: 'ZPL Preview'
  • zpl_template Selection
    default='normal' required=True string='ZPL Template' args: [('normal', 'Normal (2.25" x 1.25")'), ('small', 'Small (1.25" x 1.00")'), ('alternative', 'Alternative (2.00" x 1.00")'), ('jewelry', 'Jewelry (2.20" x 0.50")')]
Public methods (0)

No public methods.

New fields (20)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' help="Available quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • lot_properties_definition PropertiesDefinition
    args: 'Lot Properties'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." inverse='_inverse_qty_available' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_qty_update_button Boolean
    compute='_compute_show_qty_update_button'
  • stock_move_ids One2many → stock.move
    args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    args: 'stock.quant', 'product_id'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    args: 'stock.storage.category.capacity', 'product_id', 'Storage Category Capacity'
  • valid_ean Boolean
    compute='_compute_valid_ean' args: 'Barcode is valid EAN'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecasted Quantity'
Public methods (14)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • filter_has_routes(self)
    Return products with route_ids or whose categ_id has total_route_ids.
  • get_components(self)
  • get_total_routes(self)
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, vals)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True translate=True args: 'Method'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (11)
  • allowed_uom_ids Many2many → uom.uom
    compute='_compute_allowed_uom_ids' args: 'uom.uom'
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    compute='_compute_date_planned' help='Date at which the replenishment should take place.' precompute=True readonly=False required=True store=True args: 'Scheduled Date'
  • forecast_uom_id Many2one
    related='product_id.uom_id'
  • forecasted_quantity Float
    compute='_compute_forecasted_quantity' string='Forecasted Quantity'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    domain="[('id', 'in', allowed_uom_ids)]" required=True string='Unity of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • warehouse_id Many2one → stock.warehouse
    check_company=True required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (29)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • has_available_route_ids Boolean
    compute='_compute_has_available_route_ids' default=<expr> args: 'Routes can be selected on this product'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' search='_search_incoming_qty' args: 'Incoming'
  • is_storable Boolean
    compute='compute_is_storable' default=False help='A storable product is a product for which you manage stock.' precompute=True readonly=False store=True tracking=True args: 'Track Inventory'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • lot_sequence_id Many2one → ir.sequence
    default=<expr> help='Technical Field: The Ir.Sequence record that is used to generate serial/lot numbers for this product' args: 'ir.sequence', 'Serial/Lot Numbers Sequence'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • next_serial Char
    compute='_compute_next_serial'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' inverse='_inverse_qty_available' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' related_sudo=False string='Category Routes'
  • route_ids Many2many → stock.route
    depends_context=['company', 'allowed_companies'] domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Integer
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • serial_prefix_format Char
    compute='_compute_serial_prefix_format' help=SERIAL_PREFIX_FORMAT_HELP_TEXT inverse='_inverse_serial_prefix_format' args: 'Custom Lot/Serial'
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_qty_update_button Boolean
    compute='_compute_show_qty_update_button'
  • tracking Selection
    compute='_compute_tracking' default='none' help='Ensure the traceability of a storable product in your warehouse.' precompute=True readonly=False required=True store=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'By Quantity')]
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (12)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_open_routes_diagram(self)
  • action_product_tmpl_forecast_report(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • compute_is_storable(self)
    @api.depends('type')
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (1)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse

New fields (0)

No new fields.

Public methods (3)
  • action_assign(self, move_ids, qtys, in_ids)
    Assign picking move(s) [i.e. link] to other moves (i.e. make them MTO) :param move_id ids: the ids of the moves to make MTO :param qtys list: the quantities that are being assigned to the move_ids (in same order as move_ids) :param in_ids ids: the ids of the moves that are to be assigned to move_ids
  • action_unassign(self, move_id, qty, in_ids)
    Unassign moves [i.e. unlink] from a move (i.e. make non-MTO) :param move_id id: the id of the move to make non-MTO :param qty float: the total quantity that is being unassigned from move_id :param in_ids ids: the ids of the moves that are to be unassigned from move_id
  • get_report_data(self, docids, data)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (8)
  • annual_inventory_day Integer
    default=31 help='Day of the month when the annual inventory should occur. If zero or negative, then the first day of the month will be selected instead.\n If greater than the last day of a month, then the last day of the month will be selected instead.' string='Day of the month'
  • annual_inventory_month Selection
    default='12' help='Annual inventory month for products not in a location with a cyclic inventory date. Set to no month if no automatic annual inventory.' string='Annual Inventory Month' args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • horizon_days Float
    default=365 help="Configure your horizon to trigger reordering rules earlier to get\n a head start on replenishment and avoid delays, or trigger it just-in-time\n ('0 days') to avoid overstocking." required=True string='Replenishment Horizon'
  • internal_transit_location_id Many2one → stock.location
    check_company=True ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_confirmation_type Selection
    default='sms' args: [('sms', 'SMS')]
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
  • stock_text_confirmation Boolean
    args: 'Stock Text Confirmation'
Public methods (7)
  • create(self, vals_list)
    @api.model_create_multi
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on the first company of the database

New fields (38)
  • annual_inventory_day Integer
    readonly=False related='company_id.annual_inventory_day'
  • annual_inventory_month Selection
    readonly=False related='company_id.annual_inventory_month'
  • barcode_separator Char
    config_parameter='stock.barcode_separator' help='Character(s) used to separate data contained within an aggregate barcode (i.e. a barcode containing multiple barcode encodings)' args: 'Separator'
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_lot_print_gs1 Boolean
    implied_group='stock.group_stock_lot_print_gs1' args: 'Print GS1 Barcodes for Lots & Serial Numbers'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_production_lot Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_reception_report Boolean
    implied_group='stock.group_reception_report' args: 'Reception Report'
  • group_stock_sign_delivery Boolean
    implied_group='stock.group_stock_sign_delivery' args: 'Signature'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • horizon_days Float
    readonly=False related='company_id.horizon_days'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_envia Boolean
    args: 'Envia.com Connector'
  • module_delivery_fedex_rest Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_shiprocket Boolean
    args: 'Shiprocket Connector'
  • module_delivery_starshipit Boolean
    args: 'Starshipit Connector'
  • module_delivery_ups_rest Boolean
    args: 'UPS Connector'
  • module_delivery_usps_rest Boolean
    args: 'USPS Connector'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_barcode_barcodelookup Boolean
    args: 'Stock Barcode Database'
  • module_stock_dropshipping Boolean
    args: 'Dropshipping'
  • module_stock_fleet Boolean
    args: 'Dispatch Management System'
  • module_stock_picking_batch Boolean
    args: 'Batch, Wave & Cluster Transfers'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • replenish_on_order Boolean
    compute='_compute_replenish_on_order' inverse='_inverse_replenish_on_order' args: 'Replenish on Order (MTO)'
  • stock_confirmation_type Selection
    readonly=False related='company_id.stock_confirmation_type' string='Stock Text Validation type'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
  • stock_text_confirmation Boolean
    readonly=False related='company_id.stock_text_confirmation' string='Stock Text Validation with stock move'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (3)
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (1)
  • action_view_stock_serial(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • backorder_confirmation_line_ids One2many → stock.backorder.confirmation.line
    string='Backorder Confirmation Lines' args: 'stock.backorder.confirmation.line', 'backorder_confirmation_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
  • show_transfers Boolean
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
  • process_cancel_backorder(self)

New fields (3)
  • backorder_confirmation_id Many2one → stock.backorder.confirmation
    args: 'stock.backorder.confirmation', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Transfer'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • action_reserve_linked_picks(self, move_id)
    @api.model
  • action_unreserve_linked_picks(self, move_id)
    @api.model
  • get_report_values(self, docids, data=None)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, docids, data=None)
    @api.model

New fields (3)
  • counting_date Datetime
    default=fields.Datetime.now help='Date at which the resulting moves will be dated.'
  • inventory_adjustment_name Char
    default='Physical Inventory' string='Inventory Reason'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (1)
  • action_apply(self)

New fields (2)
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant', 'stock_conflict_quant_rel'
  • quant_to_fix_ids Many2many → stock.quant
    string='Conflicts' args: 'stock.quant'
Public methods (2)
  • action_keep_counted_quantity(self)
  • action_keep_difference(self)

New fields (1)
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (2)
  • action_reset(self)
  • action_set(self)

New fields (25)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • child_internal_location_ids Many2many → stock.location
    compute='_compute_child_internal_location_ids' help="This location (if it's internal) and all its descendants filtered by type=Internal." recursive=True string='Internal locations among descendants' args: 'stock.location'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True args: 'Full Location Name'
  • cyclic_inventory_frequency Integer
    default=0 help=' When different than 0, inventory count date for products stored at this location will be automatically set at the defined frequency.' args: 'Inventory Frequency'
  • forecast_weight Float
    compute='_compute_weight' args: 'Forecasted Weight'
  • incoming_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_dest_id'
  • is_empty Boolean
    compute='_compute_is_empty' search='_search_is_empty' args: 'Is Empty'
  • last_inventory_date Date
    help='Date of the last inventory at this location.' readonly=True args: 'Last Inventory'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • net_weight Float
    compute='_compute_weight' args: 'Net Weight'
  • next_inventory_date Date
    compute='_compute_next_inventory_date' help='Date for next planned inventory based on cyclic schedule.' store=True args: 'Next Expected'
  • outgoing_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_id'
  • parent_path Char
    index=True
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nClosest Location: products/lots closest to the target location will be moved out first.\nLeast Packages: products/lots that were stocked in package with least amount of qty will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Removal Strategy'
  • replenish_location Boolean
    compute='_compute_replenish_location' copy=False help='Trigger replenishment suggestions for this location when required' readonly=False store=True args: 'Replenishments'
  • storage_category_id Many2one → stock.storage.category
    check_company=True index='btree_not_null' string='Storage Category' args: 'stock.storage.category'
  • usage Selection
    default='internal' help="* Vendor: Virtual location representing the source location for products coming from your vendors\n* Virtual: Virtual location used to create a hierarchical structure for your warehouse by aggregating its child locations. Can't directly contain products\n* Internal: Physical locations inside your warehouses,\n* Customer: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as the counterpart for inventory operations done to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations. I.e. This location consumes components and produces finished products\n* Transit: Counterpart location that should be used for inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor'), ('view', 'Virtual'), ('internal', 'Internal'), ('customer', 'Customer'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit')]
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' store=True args: 'stock.warehouse'
  • warehouse_view_ids One2many → stock.warehouse
    readonly=True args: 'stock.warehouse', 'view_location_id'
Public methods (7)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • name_create(self, name)
    @api.model
  • should_bypass_reservation(self)
  • unlink(self)
  • write(self, vals)

New fields (14)
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True args: 'res.company', 'Company'
  • delivery_count Integer
    compute='_compute_delivery_ids' args: 'Delivery order count'
  • delivery_ids Many2many → stock.picking
    compute='_compute_delivery_ids' string='Transfers' args: 'stock.picking'
  • display_complete Boolean
    compute='_compute_display_complete'
  • location_id Many2one → stock.location
    compute='_compute_single_location' domain="[('usage', '!=', 'view')]" group_expand='_read_group_location_id' inverse='_set_single_location' readonly=False store=True args: 'stock.location', 'Location'
  • lot_properties Properties
    copy=True definition='product_id.lot_properties_definition' args: 'Properties'
  • name Char
    compute='_compute_name' help='Unique Lot/Serial Number' index='trigram' precompute=True readonly=False required=True store=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • partner_ids Many2many → res.partner
    compute='_compute_partner_ids' search='_search_partner_ids' args: 'res.partner'
  • product_id Many2one → product.product
    check_company=True domain="[('tracking', '!=', 'none'), ('is_storable', '=', True)] + ([('product_tmpl_id', '=', context['default_product_tmpl_id'])] if context.get('default_product_tmpl_id') else [])" index=True required=True tracking=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' search='_search_product_qty' args: 'On Hand Quantity'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (7)
  • action_lot_open_quants(self)
  • action_lot_open_transfers(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • generate_lot_names(self, first_lot, count)
    @api.model
    Generate `lot_names` from a string.
  • write(self, vals)

New fields (74)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • allowed_uom_ids Many2many → uom.uom
    compute='_compute_allowed_uom_ids' args: 'uom.uom'
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Scheduled date until move is done, then date of actual move processing' index=True required=True args: 'Date Scheduled'
  • date_deadline Datetime
    copy=False help='In case of outgoing flow, validate the transfer before this date to allow to deliver at promised date to the customer.\n In case of incoming flow, validate the transfer before this date in order to have these products in stock at the date promised by the supplier' readonly=True args: 'Deadline'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' help='Process at this date to be on time' store=True args: 'Delay Alert Date'
  • description_picking Text
    compute='_compute_description_picking' compute_sudo=True inverse='_inverse_description_picking' string='Description Of Picking'
  • description_picking_manual Text
    readonly=True
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_import_lot Boolean
    compute='_compute_display_assign_serial'
  • forecast_availability Float
    compute='_compute_forecast_information' compute_sudo=True digits='Product Unit' args: 'Forecast Availability'
  • forecast_expected_date Datetime
    compute='_compute_forecast_information' compute_sudo=True args: 'Forecasted Expected date'
  • has_lines_without_result_package Boolean
    compute='_compute_has_lines_without_result_package'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • inventory_name Char
    readonly=True
  • is_date_editable Boolean
    compute='_compute_is_date_editable' args: 'Is Date Editable'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_inventory Boolean
    args: 'Inventory'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • is_storable Boolean
    related='product_id.is_storable'
  • location_dest_id Many2one → stock.location
    compute='_compute_location_dest_id' help='The operations brings product to this location' index=True inverse='_set_location_dest_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Intermediate Location'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_final_id Many2one → stock.location
    bypass_search_access=True check_company=True help='The operation brings the products to the intermediate location.But this operation is part of a chain of operations targeting the final location.' index=True readonly=False store=True args: 'stock.location', 'Final Location'
  • location_id Many2one → stock.location
    bypass_search_access=True check_company=True compute='_compute_location_id' help='The operation takes and suggests products from this location.' index=True precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_ids Many2many → stock.lot
    compute='_compute_lot_ids' inverse='_set_lot_ids' readonly=False string='Serial Numbers' args: 'stock.lot'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_lines_count Integer
    compute='_compute_move_lines_count'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • never_product_template_attribute_value_ids Many2many → product.template.attribute.value
    string='Never attribute Values' args: 'product.template.attribute.value', 'template_attribute_value_stock_move_rel', 'move_id', 'template_attribute_value_id'
  • next_serial Char
    args: 'First SN/Lot'
  • next_serial_count Integer
    args: 'Number of SN/Lots'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    index=True args: 'stock.warehouse.orderpoint', 'Original Reordering Rule'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_ids One2many → stock.package
    compute='_compute_package_ids' string='Packages' args: 'stock.package'
  • packaging_uom_id Many2one → uom.uom
    compute='_compute_packaging_uom_id' help='Packaging unit from sale or purchase orders' precompute=True store=True args: 'uom.uom', 'Packaging'
  • packaging_uom_qty Float
    compute='_compute_packaging_uom_qty' help='Quantity in the packaging unit' store=True args: 'Packaging Quantity'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' help='Optional address where goods are to be delivered, specifically used for allotment' index='btree_not_null' readonly=False store=True args: 'res.partner', 'Destination Address '
  • picked Boolean
    compute='_compute_picked' copy=False default=False help="This checkbox is just indicative, it doesn't validate or generate any product moves." inverse='_inverse_picked' readonly=False store=True args: 'Picked'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True args: 'stock.picking', 'Transfer'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' readonly=False store=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False args: 'Unit Price'
  • priority Selection
    compute='_compute_priority' default='0' store=True args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    copy=False default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • procurement_values Json
    help='Dummy field to store procurement values to propagate them to later steps' store=False
  • product_category_id Many2one → product.category
    related='product_id.categ_id' args: 'product.category', 'Product Category'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '=', 'consu')]" index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' domain="[('id', 'in', allowed_uom_ids)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • product_uom_qty Float
    default=0 digits='Product Unit' help='This is the quantity of product that is planned to be moved.Lowering this quantity does not generate a backorder.Changing this quantity on assigned moves affects the product reservation, and should be done with care.' required=True args: 'Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity Float
    compute='_compute_quantity' digits='Product Unit' inverse='_set_quantity' store=True args: 'Quantity'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reference_ids Many2many → stock.reference
    string='References' args: 'stock.reference', 'stock_reference_move_rel', 'move_id', 'reference_id'
  • reservation_date Date
    compute='_compute_reservation_date' help='Computes when a move should be reserved' store=True args: 'Date to Reserve'
  • restrict_partner_id Many2one → res.partner
    check_company=True index='btree_not_null' args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.route
    help='Preferred route' args: 'stock.route', 'stock_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_id Many2one → stock.scrap
    check_company=True index='btree_not_null' readonly=True args: 'stock.scrap', 'Scrap operation'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_lots_m2o Boolean
    compute='_compute_show_info' args: 'Show lot_id'
  • show_lots_text Boolean
    compute='_compute_show_info' args: 'Show lot_name'
  • show_operations Boolean
    related='picking_id.picking_type_id.show_operations'
  • show_quant Boolean
    compute='_compute_show_info' args: 'Show Quant'
  • state Selection
    copy=False default='draft' help="* New: The stock move is created but not confirmed.\n* Waiting Another Move: A linked stock move should be done before this one.\n* Waiting: The stock move is confirmed but the product can't be reserved.\n* Available: The product of the stock move is reserved.\n* Done: The product has been transferred and the transfer has been confirmed." index=True readonly=True string='Status' args: [('draft', 'New'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • warehouse_id Many2one → stock.warehouse
    help='the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (10)
  • action_add_packages(self)
    Opens a list of suitable packages to add to a picking.
  • action_generate_lot_line_vals(self, context_data, mode, first_lot, count, lot_text)
    @api.model
  • action_open_reference(self)
    Open the form view of the move's reference document, if one exists, otherwise open form view of self
  • action_product_forecast_report(self)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • split_lots(self, lots)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (44)
  • allowed_uom_ids Many2many → uom.uom
    compute='_compute_allowed_uom_ids' args: 'uom.uom'
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now help="Creation date of this move line until updated due to: quantity being increased, 'picked' status has updated, or move line is done." required=True args: 'Date'
  • description_picking Text
    related='move_id.description_picking'
  • is_entire_pack Boolean
    args: 'Is added through entire package'
  • is_inventory Boolean
    related='move_id.is_inventory'
  • is_locked Boolean
    readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" index=True precompute=True readonly=False required=True store=True args: 'stock.location', 'To'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" index=True precompute=True readonly=False required=True store=True args: 'stock.location', 'From'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" index=True args: 'stock.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True index=True args: 'stock.move', 'Stock Operation'
  • move_partner_id Many2one
    readonly=True related='move_id.partner_id'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' index='btree_not_null' args: 'res.partner', 'From Owner'
  • package_history_id Many2one → stock.package.history
    index='btree_not_null' string='Package History' args: 'stock.package.history'
  • package_id Many2one → stock.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.package', 'Source Package'
  • picked Boolean
    compute='_compute_picked' copy=False readonly=False store=True args: 'Picked'
  • picking_code Selection
    readonly=True related='picking_type_id.code'
  • picking_id Many2one → stock.picking
    bypass_search_access=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Transfer'
  • picking_location_dest_id Many2one
    related='picking_id.location_dest_id'
  • picking_location_id Many2one
    related='picking_id.location_id'
  • picking_partner_id Many2one
    readonly=True related='picking_id.partner_id'
  • picking_type_id Many2one → stock.picking.type
    compute='_compute_picking_type_id' search='_search_picking_type_id' args: 'stock.picking.type', 'Operation type'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_category_name Char
    related='product_id.categ_id.complete_name' string='Product Category'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service')]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('id', 'in', allowed_uom_ids)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • quant_id Many2one → stock.quant
    store=False args: 'stock.quant', 'Pick From'
  • quantity Float
    compute='_compute_quantity' copy=False digits='Product Unit' readonly=False store=True args: 'Quantity'
  • quantity_product_uom Float
    compute='_compute_quantity_product_uom' copy=False digits='Product Unit' store=True args: 'Quantity in Product UoM'
  • reference Char
    related='move_id.reference'
  • result_package_dest_name Char
    related='result_package_id.dest_complete_name' args: 'Destination Package Name'
  • result_package_id Many2one → stock.package
    check_company=True domain="['|', '|', ('location_id', '=', location_dest_id), ('id', '=', package_id), '&', ('location_id', '=', False), '|', ('move_line_ids', '=', False), ('move_line_ids.location_dest_id', '=', location_dest_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.package', 'Destination Package'
  • scheduled_date Datetime
    related='move_id.date' args: 'Scheduled Date'
  • scrap_id Many2one
    related='move_id.scrap_id'
  • state Selection
    related='move_id.state' store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (7)
  • action_open_reference(self)
  • action_put_in_pack(self, *, package_id=False, package_type_id=False, package_name=False)
  • action_revert_inventory(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_move_line_quant_match(self, move_id, dirty_move_line_ids, dirty_quant_ids)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • predefined_date Selection
    default='day' string='Snooze for' args: [('day', '1 Day'), ('week', '1 Week'), ('month', '1 Month'), ('custom', 'Custom')]
  • snoozed_until Date
    args: 'Snooze Date'
Public methods (1)
  • action_snooze(self)

New fields (24)
  • all_children_package_ids One2many → stock.package
    compute='_compute_all_children_package_ids' search='_search_all_children_package_ids' args: 'stock.package'
  • child_package_dest_ids One2many → stock.package
    args: 'stock.package', 'package_dest_id', 'Assigned Contained Packages'
  • child_package_ids One2many → stock.package
    string='Contained Packages' args: 'stock.package', 'parent_package_id'
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True recursive=True store=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True args: 'Full Package Name'
  • contained_quant_ids One2many → stock.quant
    compute='_compute_contained_quant_ids' search='_search_contained_quant_ids' args: 'stock.quant'
  • content_description Char
    compute='_compute_content_description' args: 'Contents'
  • dest_complete_name Char
    compute='_compute_dest_complete_name' recursive=True args: 'Package Name At Destination'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for popover widget'
  • location_dest_id Many2one → stock.location
    compute='_compute_location_dest_id' search='_search_location_dest_id' args: 'stock.location', 'Destination location'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=False recursive=True store=True args: 'stock.location', 'Location'
  • move_line_ids One2many → stock.move.line
    compute='_compute_move_line_ids' search='_search_move_line_ids' args: 'stock.move.line'
  • name Char
    copy=False index='trigram' required=True args: 'Package Reference'
  • outermost_package_id Many2one → stock.package
    compute='_compute_outermost_package_id' recursive=True search='_search_outermost_package_id' args: 'stock.package', 'Outermost Destination Container'
  • owner_id Many2one → res.partner
    compute='_compute_owner_id' compute_sudo=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • pack_date Date
    default=fields.Date.today args: 'Pack Date'
  • package_dest_id Many2one → stock.package
    index='btree_not_null' args: 'stock.package', 'Destination Container'
  • package_type_id Many2one → stock.package.type
    index=True args: 'stock.package.type', 'Package Type'
  • parent_package_id Many2one → stock.package
    index='btree_not_null' args: 'stock.package', 'Container'
  • parent_path Char
    index=True
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' help='Transfers in which the Package is set as Destination Package' search='_search_picking_ids' string='Transfers' args: 'stock.picking'
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
  • shipping_weight Float
    help='Total weight of the package.' string='Shipping Weight'
  • valid_sscc Boolean
    compute='_compute_valid_sscc' args: 'Package name is valid SSCC'
Public methods (7)
  • action_add_to_picking(self)
  • action_put_in_pack(self, *, package_id=False, package_type_id=False, package_name=False)
  • action_remove_package(self)
    Removes all packages in self from the destination container tree. For move lines directly linked to a package (through result_package_id) - If the entire package is moved, remove the move lines entirely from the picking - Otherwise, just unset the packages as destination package
  • action_view_picking(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unpack(self)
    Unpacks quants directly inside the container, and remove contained packages from this package.
  • write(self, vals)

New fields (3)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_compute_filtered_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    required=True args: 'stock.move.line', 'Products'
Public methods (1)
  • action_done(self)

New fields (13)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • location_dest_id Many2one → stock.location
    args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    args: 'stock.location', 'Origin Location'
  • move_line_ids One2many → stock.move.line
    required=True string='Move Lines' args: 'stock.move.line', 'package_history_id'
  • outermost_dest_id Many2one → stock.package
    args: 'stock.package', 'Outermost Destination Container'
  • package_id Many2one → stock.package
    ondelete='cascade' required=True args: 'stock.package', 'Package'
  • package_name Char
    required=True args: 'Package Name'
  • package_type_id Many2one → stock.package.type
    related='package_id.package_type_id' args: 'stock.package.type'
  • parent_dest_id Many2one → stock.package
    args: 'stock.package', 'Destination Container'
  • parent_dest_name Char
    args: 'Destination Container Name'
  • parent_orig_id Many2one → stock.package
    args: 'stock.package', 'Origin Container'
  • parent_orig_name Char
    args: 'Origin Container Name'
  • picking_ids Many2many → stock.picking
    string='Transfers' args: 'stock.picking'
Public methods (1)
  • action_show_package(self)

New fields (17)
  • barcode Char
    copy=False args: 'Barcode'
  • base_weight Float
    help='Weight of the package type' string='Weight'
  • company_id Many2one → res.company
    index=True args: 'res.company', 'Company'
  • has_quants Boolean
    compute='_compute_has_quants' args: 'Has Contents'
  • height Float
    help='Packaging Height' args: 'Height'
  • length_uom_name Char
    compute='_compute_length_uom_name' default=_get_default_length_uom string='Length unit of measure label'
  • max_weight Float
    help='Maximum weight shippable in this packaging' args: 'Max Weight'
  • name Char
    required=True args: 'Package Type'
  • package_use Selection
    default='disposable' help="Reusable boxes are used for batch picking and emptied afterwards to be reused. In the barcode application, scanning a reusable box will add the products in this box.\n Disposable boxes aren't reused, when scanning a disposable box in the barcode application, the contained products are added to the transfer." required=True string='Package Use' args: [('disposable', 'Disposable Box'), ('reusable', 'Reusable Box (totes)')]
  • packaging_length Float
    help='Packaging Length' args: 'Length'
  • route_ids Many2many → stock.route
    domain="[('package_type_selectable', '=', True)]" string='Routes' args: 'stock.route'
  • sequence Integer
    default=1 help='The first in the sequence is the default one.' args: 'Sequence'
  • sequence_code Char
    readonly=False related='sequence_id.code' args: 'Sequence Prefix'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'package_type_id', 'Storage Category Capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' default=_get_default_weight_uom string='Weight unit of measure label'
  • width Float
    help='Packaging Width' args: 'Width'
Public methods (3)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (57)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index='btree_not_null' readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date_deadline Datetime
    compute='_compute_date_deadline' help='In case of outgoing flow, validate the transfer before this date to allow to deliver at promised date to the customer.\n In case of incoming flow, validate the transfer before this date in order to have these products in stock at the date promised by the supplier' store=True args: 'Deadline'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' args: 'Date of Transfer'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • has_deadline_issue Boolean
    compute='_compute_has_deadline_issue' default=False help='Is late or will be late depending on the deadline and scheduled date' store=True args: 'Is late'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • is_date_editable Boolean
    compute='_compute_is_date_editable' args: 'Is Scheduled Date Editable'
  • is_locked Boolean
    copy=False default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • is_signed Boolean
    compute='_compute_is_signed' args: 'Is Signed'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    readonly=True related='move_line_ids.lot_id' args: 'stock.lot', 'Lot/Serial Number'
  • move_ids One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_type Selection
    compute='_compute_move_type' help='It specifies goods to be deliver partially or all at once' precompute=True readonly=False required=True store=True args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index='trigram' readonly=True args: 'Reference'
  • note Html
    args: 'Notes'
  • origin Char
    help='Reference of the document' index='trigram' args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' index='btree_not_null' args: 'res.partner', 'Assign Owner'
  • package_history_ids Many2many → stock.package.history
    copy=False string='Transfered Packages' args: 'stock.package.history'
  • packages_count Integer
    compute='_compute_packages_count' args: 'Packages Count'
  • partner_country_id Many2one → res.country
    related='partner_id.country_id' args: 'res.country'
  • partner_id Many2one → res.partner
    check_company=True index='btree_not_null' args: 'res.partner', 'Contact'
  • picking_properties Properties
    copy=True definition='picking_type_id.picking_properties_definition' args: 'Properties'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code'
  • picking_type_entire_packs Boolean
    related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id index=True required=True tracking=True args: 'stock.picking.type', 'Operation Type'
  • picking_warning_text Text
    compute='_compute_picking_warning_text' help='Internal instructions for the partner or its parent company as set by the user.' args: 'Picking Instructions'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    default='0' help='Products will be reserved first for the transfers with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_ids.product_id' args: 'product.product', 'Product'
  • products_availability Char
    compute='_compute_products_availability' help='Latest product availability status of the picking' string='Product Availability'
  • products_availability_state Selection
    compute='_compute_products_availability' search='_search_products_availability_state' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • reference_ids Many2many → stock.reference
    readonly=True related='move_ids.reference_ids' string='References' args: 'stock.reference'
  • return_count Integer
    compute='_compute_return_count' compute_sudo=False args: '# Returns'
  • return_id Many2one → stock.picking
    check_company=True copy=False help='If this picking was created as a return of another picking, this field links to the original picking.' index='btree_not_null' readonly=True args: 'stock.picking', 'Return of'
  • return_ids One2many → stock.picking
    args: 'stock.picking', 'return_id', 'Returns'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' store=True tracking=True args: 'Scheduled Date'
  • search_date_category Selection
    readonly=True search='_search_date_category' store=False string='Date Category' args: [('before', 'Before'), ('yesterday', 'Yesterday'), ('today', 'Today'), ('day_1', 'Tomorrow'), ('day_2', 'The day after tomorrow'), ('after', 'After')]
  • shipping_volume Float
    compute='_compute_shipping_volume' args: 'Volume for Shipping'
  • shipping_weight Float
    compute='_compute_shipping_weight' digits='Stock Weight' help="Total weight of packages and products not in a package. Packages with no shipping weight specified will default to their products' total weight. This is the weight used to compute the cost of the shipping." readonly=False store=True args: 'Weight for Shipping'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the button "Check Availability" should be displayed.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_next_pickings Boolean
    compute='_compute_show_next_pickings'
  • show_operations Boolean
    related='picking_type_id.show_operations'
  • signature Image
    attachment=True copy=False help='Signature' args: 'Signature'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • use_existing_lots Boolean
    related='picking_type_id.use_existing_lots'
  • user_id Many2one → res.users
    copy=False default=<expr> domain=<expr> tracking=True args: 'res.users', 'Responsible'
  • warehouse_address_id Many2one → res.partner
    related='picking_type_id.warehouse_id.partner_id' args: 'res.partner'
  • weight_bulk Float
    compute='_compute_bulk_weight' help='Total weight of products which are not in a package.' args: 'Bulk Weight'
Public methods (32)
  • action_add_entire_packs(self, package_ids)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_cancel(self)
  • action_confirm(self)
  • action_detailed_operations(self)
  • action_next_transfer(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_picking_move_tree(self)
  • action_put_in_pack(self, *, package_id=False, package_type_id=False, package_name=False)
  • action_see_move_scrap(self)
  • action_see_package_histories(self)
  • action_see_packages(self)
  • action_see_returns(self)
  • action_split_transfer(self)
  • action_toggle_is_locked(self)
  • action_view_reception_report(self)
  • button_scrap(self)
  • button_validate(self)
  • calculate_date_category(self, datetime)
    @api.model
    Assigns given datetime to one of the following categories: - "before" - "yesterday" - "today" - "day_1" (tomorrow) - "day_2" (the day after tomorrow) - "after" The categories are based on current user's timezone (e.g. "today" will last between 00:00 and 23:59 local time). The datetime itself is assumed to be in UTC. If the datetime is falsy, this function returns "".
  • create(self, vals_list)
    @api.model_create_multi
  • date_category_to_domain(self, field_name, date_category)
    @api.model
    Given a date category, returns a list of tuples of operator and value that can be used in a domain to filter records based on their scheduled date. Args: date_category (str): The date category to use for the computation. Allowed values are: * "before" * "yesterday" * "today" * "day_1" * "day_2" * "after" Returns: a list of tuples: each tuple consists of an operator and a value that can be used in a domain to filter records based on their scheduled date. The operator can be "<" or ">=". The value is a datetime object. If an incorrect date category is passed, this method returns None.
  • do_print_picking(self)
  • do_unreserve(self)
  • get_action_click_graph(self)
    @api.model
  • get_action_picking_tree_incoming(self)
    @api.model
  • get_action_picking_tree_internal(self)
    @api.model
  • get_action_picking_tree_outgoing(self)
    @api.model
  • get_empty_list_help(self, help_message)
    @api.model
  • should_print_delivery_address(self)
  • unlink(self)
  • write(self, vals)

New fields (49)
  • active Boolean
    default=True args: 'Active'
  • auto_print_delivery_slip Boolean
    help='If this checkbox is ticked, Odoo will automatically print the delivery slip of a picking when it is validated.' args: 'Auto Print Delivery Slip'
  • auto_print_lot_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the lot/SN labels of a picking when it is validated.' args: 'Auto Print Lot/SN Labels'
  • auto_print_package_label Boolean
    help='If this checkbox is ticked, Odoo will automatically print the package label when "Put in Pack" button is used.' args: 'Auto Print Package Label'
  • auto_print_packages Boolean
    help='If this checkbox is ticked, Odoo will automatically print the packages and their contents of a picking when it is validated.' args: 'Auto Print Packages'
  • auto_print_product_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the product labels of a picking when it is validated.' args: 'Auto Print Product Labels'
  • auto_print_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically print the reception report of a picking when it is validated and has assigned moves.' args: 'Auto Print Reception Report'
  • auto_print_reception_report_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the reception report labels of a picking when it is validated.' args: 'Auto Print Reception Report Labels'
  • auto_print_return_slip Boolean
    help='If this checkbox is ticked, Odoo will automatically print the return slip of a picking when it is validated.' args: 'Auto Print Return Slip'
  • auto_show_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically show the reception report (if there are moves to allocate to) when validating.' args: 'Show Reception Report at Validation'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    default='incoming' required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_move_ready Integer
    compute='_compute_move_count'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • create_backorder Selection
    default='ask' help='When validating a transfer:\n * Ask: users are asked to choose if they want to make a backorder for remaining products\n * Always: a backorder is automatically created for the remaining products\n * Never: remaining products are cancelled' required=True args: [('ask', 'Ask'), ('always', 'Always'), ('never', 'Never')], 'Create Backorder'
  • default_location_dest_id Many2one → stock.location
    check_company=True compute='_compute_default_location_dest_id' help='This is the default destination location when this operation is manually created. However, it is possible to change it afterwards or that the routes use another one by default.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Destination Location'
  • default_location_src_id Many2one → stock.location
    check_company=True compute='_compute_default_location_src_id' help='This is the default source location when this operation is manually created. However, it is possible to change it afterwards or that the routes use another one by default.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • favorite_user_ids Many2many → res.users
    args: 'res.users', 'picking_type_favorite_user_rel', 'picking_type_id', 'user_id'
  • hide_reservation_method Boolean
    compute='_compute_hide_reservation_method'
  • is_favorite Boolean
    compute='_compute_is_favorite' compute_sudo=True inverse='_inverse_is_favorite' search='_search_is_favorite' string='Show Operation in Overview'
  • kanban_dashboard_graph Text
    compute='_compute_kanban_dashboard_graph'
  • lot_label_format Selection
    default='4x12_lots' string='Lot Label Format to auto-print' args: [('4x12_lots', '4 x 12 - One per lot/SN'), ('4x12_units', '4 x 12 - One per unit'), ('zpl_lots', 'ZPL Labels - One per lot/SN'), ('zpl_units', 'ZPL Labels - One per unit')]
  • move_type Selection
    default='direct' help='It specifies goods to be transferred partially or all at once' required=True args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    required=True translate=True args: 'Operation Type'
  • package_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Package Label to Print'
  • picking_properties_definition PropertiesDefinition
    args: 'Picking Properties'
  • print_label Boolean
    compute='_compute_print_label' help='Check this box if you want to generate shipping label in this operation.' readonly=False store=True args: 'Generate Shipping Labels'
  • product_label_format Selection
    default='2x7xprice' string='Product Label Format to auto-print' args: [('dymo', 'Dymo'), ('2x7xprice', '2 x 7 with price'), ('4x7xprice', '4 x 7 with price'), ('4x12', '4 x 12'), ('4x12xprice', '4 x 12 with price'), ('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
  • reservation_days_before Integer
    help='Maximum number of days before scheduled date that products should be reserved.' args: 'Days'
  • reservation_days_before_priority Integer
    help='Maximum number of days before scheduled date that priority picking products should be reserved.' args: 'Days when starred'
  • reservation_method Selection
    default='at_confirm' help='How products in transfers of this operation type should be reserved.' required=True args: [('at_confirm', 'At Confirmation'), ('manual', 'Manually'), ('by_date', 'Before scheduled date')], 'Reservation Method'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True index='btree_not_null' args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Sequence Prefix'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • set_package_type Boolean
    default=False help='If ticked, you will be able to select which package or package type to use in a put in pack' args: 'Set Package Type'
  • show_entire_packs Boolean
    default=False help='If ticked, packages to move will be directly displayed in Barcode instead of the products they contain' args: 'Move Entire Packages'
  • show_operations Boolean
    default=False help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_picking_type Boolean
    compute='_compute_show_picking_type'
  • use_create_lots Boolean
    compute='_compute_use_create_lots' default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' readonly=False store=True args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    compute='_compute_use_existing_lots' default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' readonly=False store=True args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' ondelete='cascade' readonly=False store=True args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_redirect_to_barcode_installation(self)
    @api.model
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_action_picking_type_moves_analysis(self)
  • get_action_picking_type_ready_moves(self)
  • get_stock_picking_action_picking_type(self)
  • write(self, vals)

New fields (7)
  • location_dest_id Many2one → stock.location
    args: 'stock.location', 'Destination'
  • move_line_ids Many2many → stock.move.line
    string='Move lines' args: 'stock.move.line'
  • origin_package_ids Many2many → stock.package
    compute='_compute_origin_package_ids' args: 'stock.package'
  • package_ids Many2many → stock.package
    string='Packages' args: 'stock.package'
  • package_type_id Many2one → stock.package.type
    args: 'stock.package.type', 'Package Type'
  • package_type_sequence_id Many2one
    related='package_type_id.sequence_id'
  • result_package_id Many2one → stock.package
    args: 'stock.package', 'Package'
Public methods (1)
  • action_put_in_pack(self)

New fields (10)
  • active Boolean
    default=True args: 'Active'
  • category_id Many2one → product.category
    default=_default_category_id domain=[('filter_for_stock_putaway_rule', '=', True)] index='btree_not_null' ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False)]" index=True ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to sublocation'
  • package_type_ids Many2many → stock.package.type
    check_company=True string='Package Type' args: 'stock.package.type'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('type', '!=', 'service')]" index='btree_not_null' ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
  • storage_category_id Many2one → stock.storage.category
    check_company=True compute='_compute_storage_category' ondelete='cascade' readonly=False store=True args: 'stock.storage.category', 'Storage Category'
  • sublocation Selection
    default='no' args: [('no', 'No'), ('last_used', 'Last Used'), ('closest_location', 'Closest Location')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (29)
  • available_quantity Float
    compute='_compute_available_quantity' digits='Product Unit' help="On hand quantity which hasn't been reserved on a transfer, in the default unit of measure of the product" args: 'Available Quantity'
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • cyclic_inventory_frequency Integer
    related='location_id.cyclic_inventory_frequency'
  • in_date Datetime
    default=fields.Datetime.now readonly=True required=True args: 'Incoming Date'
  • inventory_date Date
    compute='_compute_inventory_date' help='Next date the On Hand Quantity should be counted.' readonly=False store=True args: 'Scheduled'
  • inventory_diff_quantity Float
    compute='_compute_inventory_diff_quantity' digits='Product Unit' help="Indicates the gap between the product's theoretical quantity and its counted quantity." readonly=True store=True args: 'Difference'
  • inventory_quantity Float
    digits='Product Unit' help="The product's counted quantity." args: 'Counted'
  • inventory_quantity_auto_apply Float
    compute='_compute_inventory_quantity_auto_apply' digits='Product Unit' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • inventory_quantity_set Boolean
    compute='_compute_inventory_quantity_set' readonly=False store=True
  • is_favorite Boolean
    related='product_tmpl_id.is_favorite'
  • is_outdated Boolean
    compute='_compute_is_outdated' search='_search_is_outdated' args: 'Quantity has been moved since last count'
  • last_count_date Date
    compute='_compute_last_count_date' help='Last time the Quantity was Updated'
  • location_id Many2one → stock.location
    bypass_search_access=True domain=<expr> index=True ondelete='restrict' required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.lot
    check_company=True domain=<expr> index=True ondelete='restrict' args: 'stock.lot', 'Lot/Serial Number'
  • lot_properties Properties
    definition='product_id.lot_properties_definition' readonly=True related='lot_id.lot_properties'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' index='btree_not_null' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.package
    check_company=True domain="['|', ('location_id', '=', location_id), '&', ('location_id', '=', False), ('quant_ids', '=', False)]" help='The package containing this quant' index=True ondelete='restrict' args: 'stock.package', 'Package'
  • product_categ_id Many2one
    related='product_tmpl_id.categ_id'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit'
  • quantity Float
    digits='Product Unit' help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 digits='Product Unit' help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • sn_duplicated Boolean
    compute='_compute_sn_duplicated' help='If the same SN is in another Quant' string='Duplicated Serial Number'
  • storage_category_id Many2one
    related='location_id.storage_category_id'
  • tracking Selection
    readonly=True related='product_id.tracking'
  • user_id Many2one → res.users
    domain=<expr> help='User assigned to do product count.' args: 'res.users', 'Assigned To'
  • warehouse_id Many2one → stock.warehouse
    related='location_id.warehouse_id' args: 'stock.warehouse'
Public methods (23)
  • action_apply_all(self)
  • action_apply_inventory(self, date=None)
  • action_clear_inventory_quantity(self)
  • action_inventory_history(self)
  • action_reset(self)
  • action_set_inventory_quantity(self)
  • action_set_inventory_quantity_zero(self)
  • action_stock_quant_relocate(self)
  • action_view_inventory(self)
    @api.model
    Similar to _get_quants_action except specific for inventory adjustments (i.e. inventory counts).
  • action_view_orderpoints(self)
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_lot_id(self)
    @api.constrains('lot_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • get_aggregate_barcodes(self)
    Generates and aggregates quants' barcodes. This method uses the config parameters `stock.agg_barcode_max_length` to determine the length limit of a single aggregate barcode (400 by default) and `stock.barcode_separator` to determine which character to use to separate individual encodings (this method can't work without this parameter and will return an empty list.) Depending on the number of quants, those parameters and the length of their barcode encodings, there can be one or more aggregate barcodes. :return: list
  • get_import_templates(self)
    @api.model
  • move_quants(self, location_dest_id=False, package_dest_id=False, message=False, unpack=False, up_to_parent_packages=False)
    Directly move a stock.quant to another location and/or package by creating a stock.move. :param location_dest_id: `stock.location` destination location for the quants :param package_dest_id: `stock.package` destination package for the quants :param message: String to fill the reference field on the generated stock.move :param unpack: set to True when needing to unpack the quant :param up_to_parent_packages: `stock.package` that are the upper limit to keep the parents
  • name_create(self, name)
    @api.model
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (9)
  • company_id Many2one
    related='quant_ids.company_id'
  • dest_location_id Many2one → stock.location
    domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" args: 'stock.location'
  • dest_package_id Many2one → stock.package
    compute='_compute_dest_package_id' domain='dest_package_id_domain' store=True args: 'stock.package'
  • dest_package_id_domain Char
    compute='_compute_dest_package_id_domain'
  • is_multi_location Boolean
    compute='_compute_is_multi_location'
  • is_partial_package Boolean
    compute='_compute_is_partial_package'
  • message Text
    args: 'Reason for relocation'
  • partial_package_names Char
    compute='_compute_is_partial_package'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (1)
  • action_relocate_quants(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (3)
  • move_ids Many2many → stock.move
    string='Stock Moves' args: 'stock.move', 'stock_reference_move_rel', 'reference_id', 'move_id'
  • name Char
    readonly=True required=True args: 'Reference'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' readonly=True string='Transfers' args: 'stock.picking'
Public methods (0)

No public methods.

New fields (2)
  • allowed_route_ids Many2many → stock.route
    compute='_compute_allowed_route_ids' args: 'stock.route'
  • route_id Many2one → stock.route
    check_company=True help="Apply specific route for the replenishment instead of product's default routes." string='Preferred Route' args: 'stock.route'
Public methods (0)

No public methods.

New fields (12)
  • based_on Selection
    default='one_month' help='Estimate the sales volume for the period based on past period or order the forecasted quantity for that period.' required=True selection=[('one_week', 'Last 7 days'), ('one_month', 'Last 30 days'), ('three_months', 'Last 3 months'), ('one_year', 'Last 12 months'), ('last_year', 'Same month last year'), ('last_year_2', 'Next month last year'), ('last_year_3', 'After next month last year'), ('last_year_quarter', 'Last year quarter')] string='Based on'
  • json_lead_days Char
    compute='_compute_json_lead_days'
  • json_replenishment_graph Char
    compute='_compute_json_replenishment_graph'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • percent_factor Integer
    default=100 required=True
  • product_id Many2one → product.product
    related='orderpoint_id.product_id' args: 'product.product'
  • product_max_qty Float
    readonly=False related='orderpoint_id.product_max_qty' related_sudo=False required=True args: 'Max'
  • product_min_qty Float
    readonly=False related='orderpoint_id.product_min_qty' related_sudo=False required=True args: 'Min'
  • product_uom_name Char
    related='orderpoint_id.product_uom_name'
  • qty_to_order Float
    related='orderpoint_id.qty_to_order'
  • warehouseinfo_ids One2many
    related='orderpoint_id.warehouse_id.resupply_route_ids'
  • wh_replenishment_option_ids One2many → stock.replenishment.option
    compute='_compute_wh_replenishment_options' args: 'stock.replenishment.option', 'replenishment_info_id'
Public methods (0)

No public methods.

New fields (10)
  • free_qty Float
    compute='_compute_free_qty'
  • lead_time Char
    compute='_compute_lead_time'
  • location_id Many2one → stock.location
    related='warehouse_id.lot_stock_id' args: 'stock.location'
  • product_id Many2one → product.product
    args: 'product.product'
  • qty_to_order Float
    related='replenishment_info_id.qty_to_order'
  • replenishment_info_id Many2one → stock.replenishment.info
    args: 'stock.replenishment.info'
  • route_id Many2one → stock.route
    args: 'stock.route'
  • uom Char
    related='product_id.uom_name'
  • warehouse_id Many2one → stock.warehouse
    related='route_id.supplier_wh_id' args: 'stock.warehouse'
  • warning_message Char
    compute='_compute_warning_message'
Public methods (3)
  • order_all(self)
  • order_avbl(self)
  • select_route(self)

New fields (4)
  • inventory_date Date
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' required=True args: 'Scheduled at'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • show_expected_quantity Boolean
    compute='_compute_show_expected_quantity' help='If the user can see the expected quantity or not' inverse='_set_show_expected_quantity'
  • user_id Many2one → res.users
    domain=<expr> string='Assign to' args: 'res.users'
Public methods (1)
  • action_request_count(self)

New fields (4)
  • company_id Many2one
    related='picking_id.company_id'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • picking_type_code Selection
    readonly=True related='picking_id.picking_type_code'
  • product_return_moves One2many → stock.return.picking.line
    compute='_compute_moves_locations' precompute=True readonly=False store=True args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (4)
  • action_create_exchanges(self)
    Create a return for the active picking, then create a return of the return for the exchange picking and open it.
  • action_create_returns(self)
  • action_create_returns_all(self)
    Create a return matching the total delivered quantity and open it.
  • default_get(self, fields)
    @api.model

New fields (6)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • move_quantity Float
    related='move_id.quantity' string='Move Quantity'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • quantity Float
    default=1 digits='Product Unit' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    compute='_compute_uom_id' string='Unit' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (15)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • package_type_selectable Boolean
    help='When checked, the route will be selectable on package types' args: 'Applicable on Package Type'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    index='btree_not_null' args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (2)
  • copy_data(self, default=None)
  • write(self, vals)

New fields (22)
  • action Selection
    default='pull' index=True required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> domain="[('id', '=?', route_company_id)]" index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this lead time.' args: 'Lead Time'
  • location_dest_from_rule Boolean
    default=False help='When set to True the destination location of the stock.move will be the rule.Otherwise, it takes it from the picking type.' args: 'Destination location origin from rule'
  • location_dest_id Many2one → stock.location
    check_company=True index=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True index=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_code_domain Json
    compute='_compute_picking_type_code_domain'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', 'in', picking_type_code_domain)] if picking_type_code_domain else []" required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_carrier Boolean
    default=False help='When ticked, carrier of shipment will be propagated.' args: 'Propagation of carrier'
  • push_domain Char
    args: 'Push Applicability'
  • route_company_id Many2one
    related='route_id.company_id' string='Route Company'
  • route_id Many2one → stock.route
    index=True ondelete='cascade' required=True args: 'stock.route', 'Route'
  • route_sequence Integer
    compute_sudo=True related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True args: 'stock.warehouse', 'Warehouse'
Public methods (4)
  • copy_data(self, default=None)
  • default_get(self, fields)
    @api.model
  • run(self, procurements, raise_user_error=True)
    @api.model
    Fulfil `procurements` with the help of stock rules. Procurements are needs of products at a certain location. To fulfil these needs, we need to create some sort of documents (`stock.move` by default, but extensions of `_run_` methods allow to create every type of documents). :param procurements: the description of the procurement :type procurements: list of `~odoo.addons.stock.models.stock_rule.ProcurementGroup.Procurement` :param raise_user_error: will raise either an UserError or a ProcurementException :type raise_user_error: boolan, optional :raises UserError: if `raise_user_error` is True and a procurement isn't fulfillable :raises ProcurementException: if `raise_user_error` is False and a procurement isn't fulfillable
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (19)
  • allowed_uom_ids Many2many → uom.uom
    compute='_compute_allowed_uom_ids' args: 'uom.uom'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '=', 'internal')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" args: 'stock.lot', 'Lot/Serial'
  • move_ids One2many → stock.move
    args: 'stock.move', 'scrap_id'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.package
    check_company=True args: 'stock.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '=', 'consu')]" required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('id', 'in', allowed_uom_ids)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • scrap_location_id Many2one → stock.location
    check_company=True compute='_compute_scrap_location_id' domain="[('usage', '=', 'inventory')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    compute='_compute_scrap_qty' default=1.0 digits='Product Unit' readonly=False required=True store=True args: 'Quantity'
  • scrap_reason_tag_ids Many2many → stock.scrap.reason.tag
    comodel_name='stock.scrap.reason.tag' string='Scrap Reason'
  • should_replenish Boolean
    help='Trigger replenishment for scrapped products' string='Replenish Quantities'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' string='Product Tracking'
Public methods (6)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • check_available_qty(self)
  • do_replenish(self, values=False)
  • do_scrap(self)

New fields (3)
  • color Char
    default='#3C3C3C' string='Color'
  • name Char
    required=True string='Name' translate=True
  • sequence Integer
    default=10
Public methods (0)

No public methods.

New fields (9)
  • allow_new_product Selection
    default='mixed' required=True args: [('empty', 'If the location is empty'), ('same', 'If all products are same'), ('mixed', 'Allow mixed products')]
  • capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'storage_category_id'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • location_ids One2many → stock.location
    args: 'stock.location', 'storage_category_id'
  • max_weight Float
    digits='Stock Weight' args: 'Max Weight'
  • name Char
    required=True args: 'Storage Category'
  • package_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • product_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' string='Weight unit'
Public methods (1)
  • copy_data(self, default=None)

New fields (6)
  • company_id Many2one → res.company
    related='storage_category_id.company_id' args: 'res.company', 'Company'
  • package_type_id Many2one → stock.package.type
    check_company=True index='btree_not_null' ondelete='cascade' args: 'stock.package.type', 'Package Type'
  • product_id Many2one → product.product
    check_company=True domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('id', '=', context.get('default_product_id', False))] if context.get('default_product_id') else [('is_storable', '=', True)]" index='btree_not_null' ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_id Many2one
    related='product_id.uom_id'
  • quantity Float
    required=True args: 'Quantity'
  • storage_category_id Many2one → stock.storage.category
    index=True ondelete='cascade' required=True args: 'stock.storage.category'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • get_lines(self, line_id=False, **kw)
    @api.model
  • get_main_lines(self, given_context=None)
    @api.model
  • get_pdf(self, line_data=None)
  • get_pdf_lines(self, line_data=[])

New fields (28)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' readonly=True required=True args: 'res.company', 'Company'
  • delivery_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver (1 step)'), ('pick_ship', 'Pick then Deliver (2 steps)'), ('pick_pack_ship', 'Pick, Pack, then Deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'MTO rule'
  • name Char
    default=_default_name required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Pick Type'
  • qc_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Quality Control Type'
  • reception_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive and Store (1 step)'), ('two_steps', 'Receive then Store (2 steps)'), ('three_steps', 'Receive, Quality Control, then Store (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.route
    copy=False help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • route_ids Many2many → stock.route
    check_company=True copy=False domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • store_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Storage Type'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" index=True required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
  • xdock_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Cross Dock Type'
Public methods (8)
  • action_view_all_routes(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_resupply_routes(self, supplier_warehouses)
  • get_current_warehouses(self)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • unlink(self)
  • write(self, vals)

New fields (33)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • allowed_replenishment_uom_ids Many2many → uom.uom
    compute='_compute_allowed_replenishment_uom_ids' args: 'uom.uom'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • days_to_order Float
    compute='_compute_days_to_order' help='Numbers of days in advance that replenishments demands are created.'
  • deadline_date Date
    compute='_compute_deadline_date' help='Date before which you should order to avoid falling below the minimum. If you have nothing to order while a deadline is found, it may be because a future arrival is expected after the minimum quantity is reached (potential stockout). Check the Forecast Report.' readonly=True store=True args: 'Deadline'
  • effective_route_id Many2one → stock.route
    compute='_compute_effective_route_id' help='Either the route set directly or the one computed to be used by this replenishment' search='_search_effective_route_id' store=False args: 'stock.route'
  • lead_days Float
    compute='_compute_lead_days'
  • lead_horizon_date Date
    compute='_compute_lead_days'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_category_id Many2one → product.category
    name='Product Category' related='product_id.categ_id' args: 'product.category'
  • product_id Many2one → product.product
    check_company=True domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('id', '=', context.get('default_product_id', False))] if context.get('default_product_id') else [('is_storable', '=', True)]" index=True ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    compute='_compute_product_max_qty' default=0.0 digits='Product Unit' help='Stock level to reach when replenishing.' readonly=False required=True store=True args: 'Max Quantity'
  • product_min_qty Float
    default=0.0 digits='Product Unit' help='The minimum Stock level that will trigger a replenishment.' required=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_forecast Float
    compute='_compute_qty' digits='Product Unit' readonly=True args: 'Forecast'
  • qty_on_hand Float
    compute='_compute_qty' digits='Product Unit' readonly=True args: 'On Hand'
  • qty_to_order Float
    compute='_compute_qty_to_order' digits='Product Unit' inverse='_inverse_qty_to_order' search='_search_qty_to_order' args: 'To Order'
  • qty_to_order_computed Float
    compute='_compute_qty_to_order_computed' digits='Product Unit' store=True args: 'To Order Computed'
  • qty_to_order_manual Float
    digits='Product Unit' args: 'To Order Manual'
  • replenishment_uom_id Many2one → uom.uom
    domain="[('id', 'in', allowed_replenishment_uom_ids)]" help='The procurement quantity will be rounded up to a multiple of this unit/packaging. If it is not set, it is not rounded.' args: 'uom.uom', 'Multiple'
  • replenishment_uom_id_placeholder Char
    compute='_compute_replenishment_uom_id_placeholder'
  • route_id Many2one → stock.route
    domain="['|', ('product_selectable', '=', True), ('rule_ids.action', 'in', ['buy', 'manufacture'])]" inverse='_inverse_route_id' string='Route' args: 'stock.route'
  • route_id_placeholder Char
    compute='_compute_route_id_placeholder'
  • rule_ids Many2many → stock.rule
    compute='_compute_rules' string='Rules used' args: 'stock.rule'
  • show_supply_warning Boolean
    compute='_compute_show_supply_warning'
  • snoozed_until Date
    help='Hidden until next scheduler.' args: 'Snoozed'
  • trigger Selection
    default='auto' required=True string='Trigger' args: [('auto', 'Auto'), ('manual', 'Manual')]
  • unwanted_replenish Boolean
    compute='_compute_unwanted_replenish' args: 'Unwanted Replenish'
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.warehouse', 'Warehouse'
Public methods (9)
  • action_open_orderpoints(self)
    @api.model
  • action_product_forecast_report(self)
  • action_remove_manual_qty_to_order(self)
  • action_replenish(self, force_to_max=False)
  • action_replenish_auto(self)
  • action_stock_replenishment_info(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_horizon_days(self)
    Return the value for Horizon. This can be (in order of priority): - the value set in context in the replenishment view - the value set on the company of the all the records in self. There should be at most 1 company_id on self. - the value set on the company of the user if all else fail.
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_uom_name Char
    required=True args: 'Unit'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
  • quantity Float
    required=True string='Quantity'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (2)
  • package_type_id Many2one → stock.package.type
    string='Package Type' args: 'stock.package.type'
  • route_ids Many2many
    help='Routes propagated from the package type' related='package_type_id.route_ids' string='Routes'
Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Christophe Simonis, Xavier Morel, Alexandre Fayolle, Atul Patel, Aaron Bohy, Pedro M. Baeza, GitHub, Damien Bouvy, Wolfgang Taferner, Yannick Tivisse, Odoo Online, Pierre Masereel, Jorge Pinna Puissant, Lucas Perais, Arnold Moyaux, Xavier-Do, Denis Roussel, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, William Henrotin, Anh Thao Pham (pta), svs-odoo, Lois Rilo, Alvaro Fuentes, Brice bib Bartoletti, Prakash Prajapati, Tiffany Chang (tic), Nathan Marotte (nama), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, snd, William Braeckman, Yann Papouin, Ashmawy Walid (was), Richard deMeester, roen-odoo, Miquel Raïch, David (dafr), JF Aubert, PNO, yhu-odoo, Bruno Zanotti, Krzysztof Magusiak, Thierry Ducrest, Abdelouahab (abla), Aurelien van Delft (avd), Hubert Van De Walle, Mathieu Walravens, Renaud Thiry, Vincent Larcin, niyasraphy, Thomas Lefebvre (thle), alsh-odoo, Louis Wicket (wil), Walid, Adrien Widart (awt), nda, Victor Piryns (pivi), amdi-odoo, clesgow, Michele, Djamel Touati, Pieter Claeys (clpi), Levi Siuzdak (sile), Dylan Kiss (dyki), Jinane Maksoud, Antoine (ande), ノウラ, kir-odoo, FrancoisGe, Chong Wang (cwg), Odoo, bram1000, Martin Maes, Ahmed Khalaf, tanghulu0608, Brieuc-brd, micheledic, Vincent Van Rossem, Paweł Fertyk, AH-Yussef, adda-odoo, Zachary Hanham, omra-odoo, Andrzej(pian), Nicolas Viseur (vin), Walid (wasa), kdeb@odoo.com, Paul Stroobant, stefanorigano (SRI), Adam Heinz, Dang Van Loc, Mattis Megevand, Youssef Bashandy, OmarAbosamaha, Eduardo De Miguel, Ethan Vincent, lase@odoo.com, Benjamin Hanquin (beha), Quentin Wolfs, Aurelien MARIE (auma), bary, Maryam Kia, Louis (loti), Maxime de Neuville, reka-odoo, “Beekan”, Nathaniel (naja), vava-odoo, jobl, Bastien Fafchamps (bafa), Julien Carion (juca), kcv-odoo, adsh-odoo, mega, Tanguy Quéguineur, Louis Gobert, Chrysanthe (chgo), sami odoo, Louis (wil), asno-odoo, Junqi Wu, mano-odoo, Max Whale, aamo-odoo, Jonathan, Hussein Ebrahim(hyhe), mathysPaul, Stéphane Diez, dhpa-odoo, Mohammad Abdulmoneim, dhha-odoo, mhch-odoo, Mathias Mathy (MAMA), Edoardo Piroli, Simon Wydooghe, komugi-al, gteboul, Hammad Arif, Mohammed Basioni, Pierre Pulinckx (PIPU), Evgeniia Kotova, Jitendra Prajapat, Ian, jepbarasgarov, st-yes, Arthur Nanson, David Van Droogenbroeck (DROD), elhayyany, pkgu-odoo, djameltouati, khsr-odoo, Pierre Lamotte (pila), Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, Corentin Heinix (cohe), Corentin Lombard, kasm, MaximeNoirhomme, plha-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), Omar (OSAH), rupa-odoo, Ajit Singh, joseph, PaoloYam, BT-anieto, krip-odoo, Hadi El Yakhni, vevi-odoo, Maeva De Keyser (MDEK), sagu-odoo, Ester Andreetto, defl, raju kumar thakur, rare-odoo, sawer, depr-odoo, kinhosz, agbr-odoo, aksi-odoo, Ze Chen (zeche), mohannedah, Junqi, Ian Cioppa (iacio), Lulu Grimalkin (lugr), temo-odoo, Lancelot Semal, sjai-odoo, adip-odoo, ABE-Mark45, path-odoo, Amr Elkhatieb, hossamelgendy1, damrOdoo, YoussefM890, srap-odoo, tpma-odoo, sako-odoo, Kamran Poladov, Jonathan Swales, Gendi (HOELG), Youssef (abyo)
WEBSITE
WEBSITEhttps://www.odoo.com/app/inventory
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (168)
XML IDNameModelTypeStatus
duplicated_sn_warning stock.quant.duplicated.sn.warning stock.quant form New
exception_on_picking exception_on_picking ir.ui.view qweb New
help_message_template Help Message ir.ui.view qweb New
inventory_warning_reset_view inventory.reset.warning.view stock.inventory.warning form New
inventory_warning_set_view inventory.set.warning.view stock.inventory.warning form New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_packaging_view label_product_packaging_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
lot_label_layout_form_picking lot.label.layout.form lot.label.layout form New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_edit_view Package Level stock.package_level xpath Inherits stock.package_level_form_view
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level List Picking stock.package_level list New
picking_label_type_form picking.label.type.form picking.label.type form New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_label_layout_form_picking product.label.layout.form product.label.layout xpath Inherits product.product_label_layout_form
product_packaging_form_view product.packaging.form.view.stock product.packaging xpath Inherits product.product_packaging_form_view
product_packaging_tree_view product.packaging.list.view.stock product.packaging xpath Inherits product.product_packaging_tree_view
product_product_stock_tree product.product.stock.list product.product list New
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product xpath Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product filter Inherits product.product_search_form_view
product_search_form_view_stock_report product.product.search.stock.form.stock.report product.product filter Inherits stock_product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
product_template_search_view_inherit_stock product.template.search.inherit.stock product.template filter Inherits product.product_template_search_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.stock product.product field Inherits product.product_view_kanban_catalog
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
replenishment_option_tree_view stock.replenishment.option.list.view stock.replenishment.option list New
replenishment_option_warning_view stock.replenishment.warning.view stock.replenishment.option form New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_generic_barcode report_generic_barcode ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_packages report_picking_packages ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_reception report_reception ir.ui.view qweb New
report_reception_body report_reception_body ir.ui.view qweb New
report_reception_report_label report_reception_report_label ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_customer_lot_filter Customer Lots Filter stock.lot.report search New
search_product_lot_filter Production Lots Filter stock.lot search New
stock.report_return_slip stock.report_return_slip ir.ui.view qweb New
stock_inventory_adjustment_name_form_view stock.inventory.adjustment.name.form.view stock.inventory.adjustment.name form New
stock_inventory_conflict_form_view stock.inventory.conflict.form.view stock.inventory.conflict form New
stock_inventory_request_count_form_view stock.request.count.form.view stock.request.count form New
stock_location_route_form_view stock.location.route.form stock.route form New
stock_location_route_tree stock.location.route.list stock.route list New
stock_location_route_view_search stock.location.route.search stock.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.list2.editable stock.location xpath Inherits stock.view_location_tree2
stock_lot_customer_report_view_list stock.lot.report.view.list stock.lot.report list New
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_package_type_form stock.package.type.form stock.package.type form New
stock_package_type_tree stock.package.type.list stock.package.type list New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_picking_view_activity stock.picking.view.activity stock.picking activity New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_putaway_list stock.putaway.rule.list stock.putaway.rule list New
stock_quant_relocate_view_form Stock Relocation stock.quant.relocate form New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_reorder_report_search stock.warehouse.orderpoint.reorder.search stock.warehouse.orderpoint search New
stock_report_delivery_aggregated_move_lines stock_report_delivery_aggregated_move_lines ir.ui.view qweb New
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb New
stock_report_delivery_no_package_section_line stock_report_delivery_no_package_section_line ir.ui.view qweb New
stock_report_delivery_package_section_line stock_report_delivery_package_section_line ir.ui.view qweb New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.list stock.scrap list New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_storage_category_capacity_tree stock.storage.category.capacity.list stock.storage.category.capacity list New
stock_storage_category_form stock.storage.category.form stock.storage.category form New
stock_storage_category_tree stock.storage.category.list stock.storage.category list New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.list stock.location list New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_mobile_form stock.move.line.mobile.form stock.move.line xpath Inherits stock.view_move_line_form
view_move_line_tree stock.move.line.list stock.move.line list New
view_move_line_tree_detailed stock.move.line.list.detailed stock.move.line list New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.list stock.move list New
view_move_tree_receipt_picking stock.move.tree2 stock.move list New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.list stock.move list New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_tree Operation types stock.picking.type list New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.lot form New
view_production_lot_kanban stock.production.lot.kanban stock.lot kanban New
view_production_lot_tree stock.production.lot.list stock.lot list New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.list stock.quant.package list New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_move_line_detailed_operation_tree stock.move.line.operations.list stock.move.line list New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.list stock.move.line list New
view_stock_move_line_pivot stock.move.line.pivot stock.move.line pivot New
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_orderpoint_snooze Stock Orderpoint Snooze stock.orderpoint.snooze form New
view_stock_product_template_tree product.template.stock.list.inherit product.template field Inherits product.product_template_tree_view
view_stock_product_tree product.stock.list.inherit product.product field Inherits product.product_product_tree_view
view_stock_quant_form view.stock.quant.form stock.quant form New
view_stock_quant_form_editable stock.quant.form.editable stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.list stock.quant xpath Inherits stock.view_stock_quant_tree_simple
view_stock_quant_tree_editable stock.quant.list.editable stock.quant list New
view_stock_quant_tree_inventory_editable stock.quant.inventory.list.editable stock.quant list New
view_stock_quant_tree_simple stock.quant.list stock.quant list New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_replenishment_info Stock Replenishment Information stock.replenishment.info form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.list stock.rule list New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree_editable stock.warehouse.orderpoint.list.editable stock.warehouse.orderpoint list New
view_warehouse_tree stock.warehouse.list stock.warehouse list New
vpicktree stock.picking.list stock.picking list New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (66)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'location': 'set default', 'lot': 'set default', 'package': 'set default'} selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • label_quantity Selection
    default='lots' help="If the UoM of a lot is not 'units', the lot will be considered as a unit and only one label will be printed for this lot." required=True string='Quantity to print' args: [('lots', 'One per lot/SN'), ('units', 'One per unit')]
  • move_line_ids Many2many → stock.move.line
    args: 'stock.move.line'
  • print_format Selection
    default='4x12' required=True string='Format' args: [('4x12', '4 x 12'), ('zpl', 'ZPL Labels')]
Public methods (1)
  • process(self)

New fields (2)
  • label_type Selection
    default='products' required=True string='Labels to print' args: [('products', 'Product Labels'), ('lots', 'Lot/SN Labels')]
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
Public methods (1)
  • process(self)

New fields (4)
  • move_type Selection
    string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
  • stock_move_ids One2many → stock.move
    string='Related Stock Moves' args: 'stock.move', 'group_id'
Public methods (2)
  • run(self, procurements, raise_user_error=True)
    @api.model
    Fulfil `procurements` with the help of stock rules. Procurements are needs of products at a certain location. To fulfil these needs, we need to create some sort of documents (`stock.move` by default, but extensions of `_run_` methods allow to create every type of documents). :param procurements: the description of the procurement :type list: list of `~odoo.addons.stock.models.stock_rule.ProcurementGroup.Procurement` :param raise_user_error: will raise either an UserError or a ProcurementException :type raise_user_error: boolan, optional :raises UserError: if `raise_user_error` is True and a procurement isn't fulfillable :raises ProcurementException: if `raise_user_error` is False and a procurement isn't fulfillable
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (7)
  • filter_for_stock_putaway_rule Boolean
    search='_search_filter_for_stock_putaway_rule' store=False args: 'stock.putaway.rule'
  • packaging_reserve_method Selection
    default='partial' help='Reserve Only Full Packagings: will not reserve partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then only 1000 will be reserved\nReserve Partial Packagings: allow reserving partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then 1600 will be reserved' string='Reserve Packagings' args: [('full', 'Reserve Only Full Packagings'), ('partial', 'Reserve Partial Packagings')]
  • parent_route_ids Many2many → stock.route
    compute='_compute_parent_route_ids' string='Parent Routes' args: 'stock.route'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nClosest location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).\nLeast Packages: FIFO but with the least number of packages possible when there are several packages containing the same product.' tracking=True args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.route', 'stock_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.route
    compute='_compute_total_route_ids' readonly=True search='_search_total_route_ids' string='Total routes' args: 'stock.route'
Public methods (0)

No public methods.

New fields (3)
  • move_ids Many2many → stock.move
    args: 'stock.move'
  • move_quantity Selection
    default='custom' required=True string='Quantity to print' args: [('move', 'Operation Quantities'), ('custom', 'Custom')]
  • print_format Selection
    ondelete={'zpl': 'set default', 'zplxprice': 'set default'} selection_add=[('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
Public methods (0)

No public methods.

New fields (2)
  • package_type_id Many2one → stock.package.type
    args: 'stock.package.type', 'Package Type'
  • route_ids Many2many → stock.route
    domain=[('packaging_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product in this packaging: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_packaging', 'packaging_id', 'route_id', 'Routes'
Public methods (0)

No public methods.

New fields (19)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • lot_properties_definition PropertiesDefinition
    args: 'Lot Properties'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • stock_move_ids One2many → stock.move
    args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    args: 'stock.quant', 'product_id'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    args: 'stock.storage.category.capacity', 'product_id', 'Storage Category Capacity'
  • valid_ean Boolean
    compute='_compute_valid_ean' args: 'Barcode is valid EAN'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecasted Quantity'
Public methods (14)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • filter_has_routes(self)
    Return products with route_ids or whose categ_id has total_route_ids.
  • get_components(self)
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True translate=True args: 'Method'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    compute='_compute_date_planned' help='Date at which the replenishment should take place.' precompute=True readonly=False required=True store=True args: 'Scheduled Date'
  • forecast_uom_id Many2one
    related='product_id.uom_id'
  • forecasted_quantity Float
    compute='_compute_forecasted_quantity' string='Forecasted Quantity'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unity of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • warehouse_id Many2one → stock.warehouse
    check_company=True required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (25)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • has_available_route_ids Boolean
    compute='_compute_has_available_route_ids' default=<expr> args: 'Routes can be selected on this product'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_incoming_qty' args: 'Incoming'
  • is_storable Boolean
    compute='compute_is_storable' default=False help='A storable product is a product for which you manage stock.' precompute=True readonly=False store=True args: 'Track Inventory'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' related_sudo=False string='Category Routes'
  • route_ids Many2many → stock.route
    depends_context=['company', 'allowed_companies'] domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Integer
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • tracking Selection
    compute='_compute_tracking' default='none' help='Ensure the traceability of a storable product in your warehouse.' precompute=True readonly=False required=True store=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'By Quantity')]
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (12)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_open_routes_diagram(self)
  • action_product_tmpl_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • compute_is_storable(self)
    @api.depends('type')
  • copy(self, default=None)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (1)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse

New fields (0)

No new fields.

Public methods (3)
  • action_assign(self, move_ids, qtys, in_ids)
    Assign picking move(s) [i.e. link] to other moves (i.e. make them MTO) :param move_id ids: the ids of the moves to make MTO :param qtys list: the quantities that are being assigned to the move_ids (in same order as move_ids) :param in_ids ids: the ids of the moves that are to be assigned to move_ids
  • action_unassign(self, move_id, qty, in_ids)
    Unassign moves [i.e. unlink] from a move (i.e. make non-MTO) :param move_id id: the id of the move to make non-MTO :param qty float: the total quantity that is being unassigned from move_id :param in_ids ids: the ids of the moves that are to be unassigned from move_id
  • get_report_data(self, docids, data)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • annual_inventory_day Integer
    default=31 help='Day of the month when the annual inventory should occur. If zero or negative, then the first day of the month will be selected instead.\n If greater than the last day of a month, then the last day of the month will be selected instead.' string='Day of the month'
  • annual_inventory_month Selection
    default='12' help='Annual inventory month for products not in a location with a cyclic inventory date. Set to no month if no automatic annual inventory.' string='Annual Inventory Month' args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • internal_transit_location_id Many2one → stock.location
    check_company=True ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
Public methods (7)
  • create(self, vals_list)
    @api.model_create_multi
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on the first company of the database

New fields (33)
  • annual_inventory_day Integer
    readonly=False related='company_id.annual_inventory_day'
  • annual_inventory_month Selection
    readonly=False related='company_id.annual_inventory_month'
  • barcode_separator Char
    config_parameter='stock.barcode_separator' help='Character(s) used to separate data contained within an aggregate barcode (i.e. a barcode containing multiple barcode encodings)' args: 'Separator'
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_lot_print_gs1 Boolean
    implied_group='stock.group_stock_lot_print_gs1' args: 'Print GS1 Barcodes for Lots & Serial Numbers'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_production_lot Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_reception_report Boolean
    implied_group='stock.group_reception_report' args: 'Reception Report'
  • group_stock_sign_delivery Boolean
    implied_group='stock.group_stock_sign_delivery' args: 'Signature'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_shiprocket Boolean
    args: 'Shiprocket Connector'
  • module_delivery_starshipit Boolean
    args: 'Starshipit Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_barcode_barcodelookup Boolean
    args: 'Stock Barcode Database'
  • module_stock_dropshipping Boolean
    args: 'Dropshipping'
  • module_stock_fleet Boolean
    args: 'Dispatch Management System'
  • module_stock_picking_batch Boolean
    args: 'Batch, Wave & Cluster Transfers'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (1)
  • action_view_stock_lots(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • backorder_confirmation_line_ids One2many → stock.backorder.confirmation.line
    string='Backorder Confirmation Lines' args: 'stock.backorder.confirmation.line', 'backorder_confirmation_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
  • show_transfers Boolean
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
  • process_cancel_backorder(self)

New fields (3)
  • backorder_confirmation_id Many2one → stock.backorder.confirmation
    args: 'stock.backorder.confirmation', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Transfer'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (5)
  • new_quantity Float
    default=1 digits='Product Unit of Measure' help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_uom_id Many2one
    related='product_tmpl_id.uom_id'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (2)
  • change_product_qty(self)
    Changes the Product Quantity by creating/editing corresponding quant.
  • check_new_quantity(self)
    @api.constrains('new_quantity')

New fields (0)

No new fields.

Public methods (3)
  • action_reserve_linked_picks(self, move_id)
    @api.model
  • action_unreserve_linked_picks(self, move_id)
    @api.model
  • get_report_values(self, docids, data=None)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, docids, data=None)
    @api.model

New fields (2)
  • inventory_adjustment_name Char
    default='Quantity Updated' string='Inventory Reason'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (1)
  • action_apply(self)

New fields (2)
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant', 'stock_conflict_quant_rel'
  • quant_to_fix_ids Many2many → stock.quant
    string='Conflicts' args: 'stock.quant'
Public methods (2)
  • action_keep_counted_quantity(self)
  • action_keep_difference(self)

New fields (1)
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (2)
  • action_reset(self)
  • action_set(self)

New fields (30)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • child_internal_location_ids Many2many → stock.location
    compute='_compute_child_internal_location_ids' help="This location (if it's internal) and all its descendants filtered by type=Internal." recursive=True string='Internal locations among descendants' args: 'stock.location'
  • comment Html
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True args: 'Full Location Name'
  • cyclic_inventory_frequency Integer
    default=0 help=' When different than 0, inventory count date for products stored at this location will be automatically set at the defined frequency.' args: 'Inventory Frequency'
  • forecast_weight Float
    compute='_compute_weight' args: 'Forecasted Weight'
  • incoming_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_dest_id'
  • is_empty Boolean
    compute='_compute_is_empty' search='_search_is_empty' args: 'Is Empty'
  • last_inventory_date Date
    help='Date of the last inventory at this location.' readonly=True args: 'Last Inventory'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • net_weight Float
    compute='_compute_weight' args: 'Net Weight'
  • next_inventory_date Date
    compute='_compute_next_inventory_date' help='Date for next planned inventory based on cyclic schedule.' store=True args: 'Next Expected'
  • outgoing_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_id'
  • parent_path Char
    index=True
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Removal Strategy'
  • replenish_location Boolean
    compute='_compute_replenish_location' copy=False help='Activate this function to get all quantities to replenish at this particular location' readonly=False store=True args: 'Replenish Location'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • storage_category_id Many2one → stock.storage.category
    check_company=True string='Storage Category' args: 'stock.storage.category'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations: this location consumes the components and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit Location')]
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' store=True args: 'stock.warehouse'
  • warehouse_view_ids One2many → stock.warehouse
    readonly=True args: 'stock.warehouse', 'view_location_id'
Public methods (7)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • name_create(self, name)
    @api.model
  • should_bypass_reservation(self)
  • unlink(self)
  • write(self, values)

New fields (14)
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True args: 'res.company', 'Company'
  • delivery_count Integer
    compute='_compute_delivery_ids' args: 'Delivery order count'
  • delivery_ids Many2many → stock.picking
    compute='_compute_delivery_ids' string='Transfers' args: 'stock.picking'
  • display_complete Boolean
    compute='_compute_display_complete'
  • last_delivery_partner_id Many2one → res.partner
    compute='_compute_last_delivery_partner_id' args: 'res.partner'
  • location_id Many2one → stock.location
    compute='_compute_single_location' domain="[('usage', '!=', 'view')]" group_expand='_read_group_location_id' inverse='_set_single_location' readonly=False store=True args: 'stock.location', 'Location'
  • lot_properties Properties
    copy=True definition='product_id.lot_properties_definition' args: 'Properties'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' index='trigram' required=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • product_id Many2one → product.product
    check_company=True domain="[('tracking', '!=', 'none'), ('is_storable', '=', True)] + ([('product_tmpl_id', '=', context['default_product_tmpl_id'])] if context.get('default_product_tmpl_id') else [])" index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' search='_search_product_qty' args: 'On Hand Quantity'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (7)
  • action_lot_open_quants(self)
  • action_lot_open_transfers(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • generate_lot_names(self, first_lot, count)
    @api.model
    Generate `lot_names` from a string.
  • write(self, vals)

New fields (9)
  • address Char
    readonly=True
  • delivery_date Datetime
    readonly=True
  • has_return Boolean
    readonly=True
  • lot_id Many2one → stock.lot
    readonly=True args: 'stock.lot', 'Lot/Serial'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner'
  • picking_id Many2one → stock.picking
    readonly=True args: 'stock.picking'
  • product_id Many2one → product.product
    readonly=True args: 'product.product'
  • quantity Float
    readonly=True
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom'
Public methods (0)

No public methods.

New fields (72)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Scheduled date until move is done, then date of actual move processing' index=True required=True args: 'Date Scheduled'
  • date_deadline Datetime
    copy=False help='In case of outgoing flow, validate the transfer before this date to allow to deliver at promised date to the customer.\n In case of incoming flow, validate the transfer before this date in order to have these products in stock at the date promised by the supplier' readonly=True args: 'Deadline'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' help='Process at this date to be on time' store=True args: 'Delay Alert Date'
  • description_picking Text
    args: 'Description of Picking'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_import_lot Boolean
    compute='_compute_display_assign_serial'
  • forecast_availability Float
    compute='_compute_forecast_information' compute_sudo=True digits='Product Unit of Measure' args: 'Forecast Availability'
  • forecast_expected_date Datetime
    compute='_compute_forecast_information' compute_sudo=True args: 'Forecasted Expected date'
  • group_id Many2one → procurement.group
    default=_default_group_id index=True args: 'procurement.group', 'Procurement Group'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_inventory Boolean
    args: 'Inventory'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • is_storable Boolean
    related='product_id.is_storable'
  • location_dest_id Many2one → stock.location
    compute='_compute_location_dest_id' help='The operations brings product to this location' index=True inverse='_set_location_dest_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Intermediate Location'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_final_id Many2one → stock.location
    auto_join=True check_company=True help='The operation brings the products to the intermediate location.But this operation is part of a chain of operations targeting the final location.' index=True readonly=False store=True args: 'stock.location', 'Final Location'
  • location_id Many2one → stock.location
    auto_join=True check_company=True compute='_compute_location_id' help='The operation takes and suggests products from this location.' index=True precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_ids Many2many → stock.lot
    compute='_compute_lot_ids' inverse='_set_lot_ids' readonly=False string='Serial Numbers' args: 'stock.lot'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_lines_count Integer
    compute='_compute_move_lines_count'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    required=True args: 'Description'
  • never_product_template_attribute_value_ids Many2many → product.template.attribute.value
    string='Never attribute Values' args: 'product.template.attribute.value', 'template_attribute_value_stock_move_rel', 'move_id', 'template_attribute_value_id'
  • next_serial Char
    args: 'First SN/Lot'
  • next_serial_count Integer
    args: 'Number of SN/Lots'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    index=True args: 'stock.warehouse.orderpoint', 'Original Reordering Rule'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    check_company=True copy=False args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' help='Optional address where goods are to be delivered, specifically used for allotment' index='btree_not_null' readonly=False store=True args: 'res.partner', 'Destination Address '
  • picked Boolean
    compute='_compute_picked' copy=False default=False help="This checkbox is just indicative, it doesn't validate or generate any product moves." inverse='_inverse_picked' readonly=False store=True args: 'Picked'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True args: 'stock.picking', 'Transfer'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' readonly=False store=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False args: 'Unit Price'
  • priority Selection
    compute='_compute_priority' default='0' store=True args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    copy=False default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    check_company=True domain="[('type', '=', 'consu')]" index=True required=True args: 'product.product', 'Product'
  • product_packaging_id Many2one → product.packaging
    check_company=True domain="[('product_id', '=', product_id)]" args: 'product.packaging', 'Packaging'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' string='Reserved Packaging Quantity'
  • product_packaging_quantity Float
    compute='_compute_product_packaging_quantity' string='Done Packaging Quantity'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'UoM'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=0 digits='Product Unit of Measure' help='This is the quantity of product that is planned to be moved.Lowering this quantity does not generate a backorder.Changing this quantity on assigned moves affects the product reservation, and should be done with care.' required=True args: 'Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity Float
    compute='_compute_quantity' digits='Product Unit of Measure' inverse='_set_quantity' store=True args: 'Quantity'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reservation_date Date
    compute='_compute_reservation_date' help='Computes when a move should be reserved' store=True args: 'Date to Reserve'
  • restrict_partner_id Many2one → res.partner
    check_company=True index='btree_not_null' args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.route
    help='Preferred route' args: 'stock.route', 'stock_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_id Many2one → stock.scrap
    check_company=True readonly=True args: 'stock.scrap', 'Scrap operation'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_lots_m2o Boolean
    compute='_compute_show_info' args: 'Show lot_id'
  • show_lots_text Boolean
    compute='_compute_show_info' args: 'Show lot_name'
  • show_operations Boolean
    related='picking_id.picking_type_id.show_operations'
  • show_quant Boolean
    compute='_compute_show_info' args: 'Show Quant'
  • state Selection
    copy=False default='draft' help="* New: The stock move is created but not confirmed.\n* Waiting Another Move: A linked stock move should be done before this one.\n* Waiting Availability: The stock move is confirmed but the product can't be reserved.\n* Available: The product of the stock move is reserved.\n* Done: The product has been transferred and the transfer has been confirmed." index=True readonly=True string='Status' args: [('draft', 'New'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • warehouse_id Many2one → stock.warehouse
    help='the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_assign_serial(self)
    Opens a wizard to assign SN's name on each move lines.
  • action_generate_lot_line_vals(self, context, mode, first_lot, count, lot_text)
    @api.model
  • action_open_reference(self)
    Open the form view of the move's reference document, if one exists, otherwise open form view of self
  • action_product_forecast_report(self)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • init(self)
  • split_lots(self, lots)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (42)
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now help="Creation date of this move line until updated due to: quantity being increased, 'picked' status has updated, or move line is done." required=True args: 'Date'
  • description_picking Text
    string='Description picking'
  • is_inventory Boolean
    related='move_id.is_inventory'
  • is_locked Boolean
    readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'To'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'From'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" index=True args: 'stock.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True index=True args: 'stock.move', 'Stock Operation'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' index='btree_not_null' args: 'res.partner', 'From Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    check_company=True args: 'stock.package_level', 'Package Level'
  • picked Boolean
    compute='_compute_picked' copy=False readonly=False store=True args: 'Picked'
  • picking_code Selection
    readonly=True related='picking_type_id.code'
  • picking_id Many2one → stock.picking
    auto_join=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Transfer'
  • picking_location_dest_id Many2one
    related='picking_id.location_dest_id'
  • picking_location_id Many2one
    related='picking_id.location_id'
  • picking_partner_id Many2one
    readonly=True related='picking_id.partner_id'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    compute='_compute_picking_type_id' search='_search_picking_type_id' args: 'stock.picking.type', 'Operation type'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_category_name Char
    related='product_id.categ_id.complete_name' string='Product Category'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service')]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' string='Reserved Packaging Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • quant_id Many2one → stock.quant
    store=False args: 'stock.quant', 'Pick From'
  • quantity Float
    compute='_compute_quantity' copy=False digits='Product Unit of Measure' readonly=False store=True args: 'Quantity'
  • quantity_product_uom Float
    compute='_compute_quantity_product_uom' copy=False digits='Product Unit of Measure' store=True args: 'Quantity in Product UoM'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • result_package_id Many2one → stock.quant.package
    check_company=True domain="['|', '|', ('location_id', '=', False), ('location_id', '=', location_dest_id), ('id', '=', package_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • scheduled_date Datetime
    related='move_id.date' args: 'Scheduled Date'
  • state Selection
    related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (8)
  • action_open_reference(self)
  • action_put_in_pack(self)
  • action_revert_inventory(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_move_line_quant_match(self, move_id, dirty_move_line_ids, dirty_quant_ids)
  • init(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • predefined_date Selection
    default='day' string='Snooze for' args: [('day', '1 Day'), ('week', '1 Week'), ('month', '1 Month'), ('custom', 'Custom')]
  • snoozed_until Date
    args: 'Snooze Date'
Public methods (1)
  • action_snooze(self)

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (12)
  • barcode Char
    copy=False args: 'Barcode'
  • base_weight Float
    help='Weight of the package type' string='Weight'
  • company_id Many2one → res.company
    index=True args: 'res.company', 'Company'
  • height Float
    help='Packaging Height' args: 'Height'
  • length_uom_name Char
    compute='_compute_length_uom_name' default=_get_default_length_uom string='Length unit of measure label'
  • max_weight Float
    help='Maximum weight shippable in this packaging' args: 'Max Weight'
  • name Char
    required=True args: 'Package Type'
  • packaging_length Float
    help='Packaging Length' args: 'Length'
  • sequence Integer
    default=1 help='The first in the sequence is the default one.' args: 'Sequence'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'package_type_id', 'Storage Category Capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' default=_get_default_weight_uom string='Weight unit of measure label'
  • width Float
    help='Packaging Width' args: 'Width'
Public methods (1)
  • copy_data(self, default=None)

New fields (13)
  • company_id Many2one → res.company
    index=True required=True args: 'res.company', 'Company'
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_dest_id' domain="[('id', 'child_of', parent.location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', 'child_of', parent.location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • picking_type_code Selection
    related='picking_id.picking_type_code'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (4)
  • action_show_package_details(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (59)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index='btree_not_null' readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date Datetime
    copy=False default=fields.Datetime.now help='Creation Date, usually the time of the order' tracking=True args: 'Creation Date'
  • date_deadline Datetime
    compute='_compute_date_deadline' help='In case of outgoing flow, validate the transfer before this date to allow to deliver at promised date to the customer.\n In case of incoming flow, validate the transfer before this date in order to have these products in stock at the date promised by the supplier' store=True args: 'Deadline'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • group_id Many2one → procurement.group
    readonly=True related='move_ids.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_deadline_issue Boolean
    compute='_compute_has_deadline_issue' default=False help='Is late or will be late depending on the deadline and scheduled date' store=True args: 'Is late'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • is_signed Boolean
    compute='_compute_is_signed' args: 'Is Signed'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    readonly=True related='move_line_ids.lot_id' args: 'stock.lot', 'Lot/Serial Number'
  • move_ids One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_ids_without_package One2many → stock.move
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] string='Stock move' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_type Selection
    compute='_compute_move_type' help='It specifies goods to be deliver partially or all at once' precompute=True readonly=False required=True store=True args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index='trigram' readonly=True args: 'Reference'
  • note Html
    args: 'Notes'
  • origin Char
    help='Reference of the document' index='trigram' args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' index='btree_not_null' args: 'res.partner', 'Assign Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    check_company=True index='btree_not_null' args: 'res.partner', 'Contact'
  • picking_properties Properties
    copy=True definition='picking_type_id.picking_properties_definition' args: 'Properties'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code'
  • picking_type_entire_packs Boolean
    related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id index=True required=True args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    default='0' help='Products will be reserved first for the transfers with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_ids.product_id' args: 'product.product', 'Product'
  • products_availability Char
    compute='_compute_products_availability' help='Latest product availability status of the picking' string='Product Availability'
  • products_availability_state Selection
    compute='_compute_products_availability' search='_search_products_availability_state' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • return_count Integer
    compute='_compute_return_count' compute_sudo=False args: '# Returns'
  • return_id Many2one → stock.picking
    check_company=True copy=False help='If this picking was created as a return of another picking, this field links to the original picking.' index='btree_not_null' readonly=True args: 'stock.picking', 'Return of'
  • return_ids One2many → stock.picking
    args: 'stock.picking', 'return_id', 'Returns'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' store=True tracking=True args: 'Scheduled Date'
  • search_date_category Selection
    readonly=True search='_search_date_category' store=False string='Date Category' args: [('before', 'Before'), ('yesterday', 'Yesterday'), ('today', 'Today'), ('day_1', 'Tomorrow'), ('day_2', 'The day after tomorrow'), ('after', 'After')]
  • shipping_volume Float
    compute='_compute_shipping_volume' args: 'Volume for Shipping'
  • shipping_weight Float
    compute='_compute_shipping_weight' help="Total weight of packages and products not in a package. Packages with no shipping weight specified will default to their products' total weight. This is the weight used to compute the cost of the shipping." readonly=False args: 'Weight for Shipping'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the button "Check Availability" should be displayed.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_next_pickings Boolean
    compute='_compute_show_next_pickings'
  • show_operations Boolean
    related='picking_type_id.show_operations'
  • signature Image
    attachment=True copy=False help='Signature' args: 'Signature'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • use_existing_lots Boolean
    related='picking_type_id.use_existing_lots'
  • user_id Many2one → res.users
    copy=False default=<expr> domain=<expr> tracking=True args: 'res.users', 'Responsible'
  • warehouse_address_id Many2one → res.partner
    related='picking_type_id.warehouse_id.partner_id' args: 'res.partner'
  • weight_bulk Float
    compute='_compute_bulk_weight' help='Total weight of products which are not in a package.' args: 'Bulk Weight'
Public methods (30)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_cancel(self)
  • action_confirm(self)
  • action_detailed_operations(self)
  • action_next_transfer(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_picking_move_tree(self)
  • action_put_in_pack(self, move_lines_to_pack=False)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_see_returns(self)
  • action_split_transfer(self)
  • action_toggle_is_locked(self)
  • action_view_reception_report(self)
  • button_scrap(self)
  • button_validate(self)
  • calculate_date_category(self, datetime)
    @api.model
    Assigns given datetime to one of the following categories: - "before" - "yesterday" - "today" - "day_1" (tomorrow) - "day_2" (the day after tomorrow) - "after" The categories are based on current user's timezone (e.g. "today" will last between 00:00 and 23:59 local time). The datetime itself is assumed to be in UTC. If the datetime is falsy, this function returns "".
  • create(self, vals_list)
    @api.model_create_multi
  • date_category_to_domain(self, date_category)
    @api.model
    Given a date category, returns a list of tuples of operator and value that can be used in a domain to filter records based on their scheduled date. Args: date_category (str): The date category to use for the computation. Allowed values are: * "before" * "yesterday" * "today" * "day_1" * "day_2" * "after" Returns: a list of tuples: each tuple consists of an operator and a value that can be used in a domain to filter records based on their scheduled date. The operator can be "<" or ">=". The value is a datetime object. If an incorrect date category is passed, this method returns None.
  • do_print_picking(self)
  • do_unreserve(self)
  • get_action_click_graph(self)
    @api.model
  • get_action_picking_tree_incoming(self)
    @api.model
  • get_action_picking_tree_internal(self)
    @api.model
  • get_action_picking_tree_outgoing(self)
    @api.model
  • get_empty_list_help(self, help_message)
    @api.model
  • should_print_delivery_address(self)
  • unlink(self)
  • write(self, vals)

New fields (48)
  • active Boolean
    default=True args: 'Active'
  • auto_print_delivery_slip Boolean
    help='If this checkbox is ticked, Odoo will automatically print the delivery slip of a picking when it is validated.' args: 'Auto Print Delivery Slip'
  • auto_print_lot_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the lot/SN labels of a picking when it is validated.' args: 'Auto Print Lot/SN Labels'
  • auto_print_package_label Boolean
    help='If this checkbox is ticked, Odoo will automatically print the package label when "Put in Pack" button is used.' args: 'Auto Print Package Label'
  • auto_print_packages Boolean
    help='If this checkbox is ticked, Odoo will automatically print the packages and their contents of a picking when it is validated.' args: 'Auto Print Packages'
  • auto_print_product_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the product labels of a picking when it is validated.' args: 'Auto Print Product Labels'
  • auto_print_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically print the reception report of a picking when it is validated and has assigned moves.' args: 'Auto Print Reception Report'
  • auto_print_reception_report_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the reception report labels of a picking when it is validated.' args: 'Auto Print Reception Report Labels'
  • auto_print_return_slip Boolean
    help='If this checkbox is ticked, Odoo will automatically print the return slip of a picking when it is validated.' args: 'Auto Print Return Slip'
  • auto_show_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically show the reception report (if there are moves to allocate to) when validating.' args: 'Show Reception Report at Validation'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    default='incoming' required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_move_ready Integer
    compute='_compute_move_count'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • create_backorder Selection
    default='ask' help='When validating a transfer:\n * Ask: users are asked to choose if they want to make a backorder for remaining products\n * Always: a backorder is automatically created for the remaining products\n * Never: remaining products are cancelled' required=True args: [('ask', 'Ask'), ('always', 'Always'), ('never', 'Never')], 'Create Backorder'
  • default_location_dest_id Many2one → stock.location
    check_company=True compute='_compute_default_location_dest_id' help='This is the default destination location when this operation is manually created. However, it is possible to change it afterwards or that the routes use another one by default.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Destination Location'
  • default_location_src_id Many2one → stock.location
    check_company=True compute='_compute_default_location_src_id' help='This is the default source location when this operation is manually created. However, it is possible to change it afterwards or that the routes use another one by default.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • favorite_user_ids Many2many → res.users
    args: 'res.users', 'picking_type_favorite_user_rel', 'picking_type_id', 'user_id'
  • hide_reservation_method Boolean
    compute='_compute_hide_reservation_method'
  • is_favorite Boolean
    compute='_compute_is_favorite' compute_sudo=True inverse='_inverse_is_favorite' search='_search_is_favorite' string='Show Operation in Overview'
  • kanban_dashboard_graph Text
    compute='_compute_kanban_dashboard_graph'
  • lot_label_format Selection
    default='4x12_lots' string='Lot Label Format to auto-print' args: [('4x12_lots', '4 x 12 - One per lot/SN'), ('4x12_units', '4 x 12 - One per unit'), ('zpl_lots', 'ZPL Labels - One per lot/SN'), ('zpl_units', 'ZPL Labels - One per unit')]
  • move_type Selection
    default='direct' help='It specifies goods to be transferred partially or all at once' required=True args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    required=True translate=True args: 'Operation Type'
  • package_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Package Label to Print'
  • picking_properties_definition PropertiesDefinition
    args: 'Picking Properties'
  • print_label Boolean
    compute='_compute_print_label' help='Check this box if you want to generate shipping label in this operation.' readonly=False store=True args: 'Generate Shipping Labels'
  • product_label_format Selection
    default='2x7xprice' string='Product Label Format to auto-print' args: [('dymo', 'Dymo'), ('2x7xprice', '2 x 7 with price'), ('4x7xprice', '4 x 7 with price'), ('4x12', '4 x 12'), ('4x12xprice', '4 x 12 with price'), ('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
  • reservation_days_before Integer
    help='Maximum number of days before scheduled date that products should be reserved.' args: 'Days'
  • reservation_days_before_priority Integer
    help='Maximum number of days before scheduled date that priority picking products should be reserved.' args: 'Days when starred'
  • reservation_method Selection
    default='at_confirm' help='How products in transfers of this operation type should be reserved.' required=True args: [('at_confirm', 'At Confirmation'), ('manual', 'Manually'), ('by_date', 'Before scheduled date')], 'Reservation Method'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Sequence Prefix'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=False help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_picking_type Boolean
    compute='_compute_show_picking_type'
  • use_create_lots Boolean
    compute='_compute_use_create_lots' default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' readonly=False store=True args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    compute='_compute_use_existing_lots' default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' readonly=False store=True args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' ondelete='cascade' readonly=False store=True args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_redirect_to_barcode_installation(self)
    @api.model
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_action_picking_type_moves_analysis(self)
  • get_action_picking_type_ready_moves(self)
  • get_stock_picking_action_picking_type(self)
  • write(self, vals)

New fields (10)
  • active Boolean
    default=True args: 'Active'
  • category_id Many2one → product.category
    default=_default_category_id domain=[('filter_for_stock_putaway_rule', '=', True)] ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False)]" index=True ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to sublocation'
  • package_type_ids Many2many → stock.package.type
    check_company=True string='Package Type' args: 'stock.package.type'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('type', '!=', 'service')]" ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
  • storage_category_id Many2one → stock.storage.category
    check_company=True compute='_compute_storage_category' ondelete='cascade' readonly=False store=True args: 'stock.storage.category', 'Storage Category'
  • sublocation Selection
    default='no' args: [('no', 'No'), ('last_used', 'Last Used'), ('closest_location', 'Closest Location')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (29)
  • available_quantity Float
    compute='_compute_available_quantity' digits='Product Unit of Measure' help="On hand quantity which hasn't been reserved on a transfer, in the default unit of measure of the product" args: 'Available Quantity'
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • cyclic_inventory_frequency Integer
    related='location_id.cyclic_inventory_frequency'
  • in_date Datetime
    default=fields.Datetime.now readonly=True required=True args: 'Incoming Date'
  • inventory_date Date
    compute='_compute_inventory_date' help='Next date the On Hand Quantity should be counted.' readonly=False store=True args: 'Scheduled Date'
  • inventory_diff_quantity Float
    compute='_compute_inventory_diff_quantity' digits='Product Unit of Measure' help="Indicates the gap between the product's theoretical quantity and its counted quantity." readonly=True store=True args: 'Difference'
  • inventory_quantity Float
    digits='Product Unit of Measure' help="The product's counted quantity." args: 'Counted Quantity'
  • inventory_quantity_auto_apply Float
    compute='_compute_inventory_quantity_auto_apply' digits='Product Unit of Measure' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • inventory_quantity_set Boolean
    compute='_compute_inventory_quantity_set' default=False readonly=False store=True
  • is_favorite Boolean
    related='product_tmpl_id.is_favorite'
  • is_outdated Boolean
    compute='_compute_is_outdated' search='_search_is_outdated' args: 'Quantity has been moved since last count'
  • last_count_date Date
    compute='_compute_last_count_date' help='Last time the Quantity was Updated'
  • location_id Many2one → stock.location
    auto_join=True domain=<expr> index=True ondelete='restrict' required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.lot
    check_company=True domain=<expr> index=True ondelete='restrict' args: 'stock.lot', 'Lot/Serial Number'
  • lot_properties Properties
    definition='product_id.lot_properties_definition' readonly=True related='lot_id.lot_properties'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' index='btree_not_null' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="['|', ('location_id', '=', location_id), '&', ('location_id', '=', False), '&', ('package_use', '=', 'reusable'), ('quant_ids', '=', False)]" help='The package containing this quant' index=True ondelete='restrict' args: 'stock.quant.package', 'Package'
  • product_categ_id Many2one
    related='product_tmpl_id.categ_id'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    digits='Product Unit of Measure' help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 digits='Product Unit of Measure' help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • sn_duplicated Boolean
    compute='_compute_sn_duplicated' help='If the same SN is in another Quant' string='Duplicated Serial Number'
  • storage_category_id Many2one
    related='location_id.storage_category_id' store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
  • user_id Many2one → res.users
    domain=<expr> help='User assigned to do product count.' args: 'res.users', 'Assigned To'
  • warehouse_id Many2one → stock.warehouse
    related='location_id.warehouse_id' args: 'stock.warehouse'
Public methods (24)
  • action_apply_all(self)
  • action_apply_inventory(self)
  • action_clear_inventory_quantity(self)
  • action_inventory_history(self)
  • action_reset(self)
  • action_set_inventory_quantity(self)
  • action_set_inventory_quantity_zero(self)
  • action_stock_quant_relocate(self)
  • action_view_inventory(self)
    @api.model
    Similar to _get_quants_action except specific for inventory adjustments (i.e. inventory counts).
  • action_view_orderpoints(self)
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • action_warning_duplicated_sn(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_lot_id(self)
    @api.constrains('lot_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • get_aggregate_barcodes(self)
    Generates and aggregates quants' barcodes. This method uses the config parameters `stock.agg_barcode_max_length` to determine the length limit of a single aggregate barcode (400 by default) and `stock.barcode_separator` to determine which character to use to separate individual encodings (this method can't work without this parameter and will return an empty list.) Depending on the number of quants, those parameters and the length of their barcode encodings, there can be one or more aggregate barcodes. :return: list
  • get_import_templates(self)
    @api.model
  • move_quants(self, location_dest_id=False, package_dest_id=False, message=False, unpack=False)
    Directly move a stock.quant to another location and/or package by creating a stock.move. :param location_dest_id: `stock.location` destination location for the quants :param package_dest_id: `stock.quant.package´ destination package for the quants :param message: String to fill the reference field on the generated stock.move :param unpack: set to True when needing to unpack the quant
  • name_create(self, name)
    @api.model
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (10)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=False store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index='trigram' required=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_owner_id' compute_sudo=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • pack_date Date
    default=fields.Date.today args: 'Pack Date'
  • package_type_id Many2one → stock.package.type
    index=True args: 'stock.package.type', 'Package Type'
  • package_use Selection
    default='disposable' help="Reusable boxes are used for batch picking and emptied afterwards to be reused. In the barcode application, scanning a reusable box will add the products in this box.\n Disposable boxes aren't reused, when scanning a disposable box in the barcode application, the contained products are added to the transfer." required=True string='Package Use' args: [('disposable', 'Disposable Box'), ('reusable', 'Reusable Box')]
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
  • shipping_weight Float
    help='Total weight of the package.' string='Shipping Weight'
  • valid_sscc Boolean
    compute='_compute_valid_sscc' args: 'Package name is valid SSCC'
Public methods (3)
  • action_view_picking(self)
  • unpack(self)
  • write(self, vals)

New fields (9)
  • company_id Many2one
    related='quant_ids.company_id'
  • dest_location_id Many2one → stock.location
    domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" args: 'stock.location'
  • dest_package_id Many2one → stock.quant.package
    compute='_compute_dest_package_id' domain='dest_package_id_domain' store=True args: 'stock.quant.package'
  • dest_package_id_domain Char
    compute='_compute_dest_package_id_domain'
  • is_multi_location Boolean
    compute='_compute_is_multi_location'
  • is_partial_package Boolean
    compute='_compute_is_partial_package'
  • message Text
    args: 'Reason for relocation'
  • partial_package_names Char
    compute='_compute_is_partial_package'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (1)
  • action_relocate_quants(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (2)
  • allowed_route_ids Many2many → stock.route
    compute='_compute_allowed_route_ids' args: 'stock.route'
  • route_id Many2one → stock.route
    check_company=True help="Apply specific route for the replenishment instead of product's default routes." string='Preferred Route' args: 'stock.route'
Public methods (0)

No public methods.

New fields (7)
  • json_lead_days Char
    compute='_compute_json_lead_days'
  • json_replenishment_history Char
    compute='_compute_json_replenishment_history'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • product_id Many2one → product.product
    related='orderpoint_id.product_id' args: 'product.product'
  • qty_to_order Float
    related='orderpoint_id.qty_to_order'
  • warehouseinfo_ids One2many
    related='orderpoint_id.warehouse_id.resupply_route_ids'
  • wh_replenishment_option_ids One2many → stock.replenishment.option
    compute='_compute_wh_replenishment_options' args: 'stock.replenishment.option', 'replenishment_info_id'
Public methods (0)

No public methods.

New fields (10)
  • free_qty Float
    compute='_compute_free_qty'
  • lead_time Char
    compute='_compute_lead_time'
  • location_id Many2one → stock.location
    related='warehouse_id.lot_stock_id' args: 'stock.location'
  • product_id Many2one → product.product
    args: 'product.product'
  • qty_to_order Float
    related='replenishment_info_id.qty_to_order'
  • replenishment_info_id Many2one → stock.replenishment.info
    args: 'stock.replenishment.info'
  • route_id Many2one → stock.route
    args: 'stock.route'
  • uom Char
    related='product_id.uom_name'
  • warehouse_id Many2one → stock.warehouse
    related='route_id.supplier_wh_id' args: 'stock.warehouse'
  • warning_message Char
    compute='_compute_warning_message'
Public methods (3)
  • order_all(self)
  • order_avbl(self)
  • select_route(self)

New fields (4)
  • inventory_date Date
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' required=True args: 'Inventory Date'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • set_count Selection
    default='empty' string='Count' args: [('empty', 'Leave Empty'), ('set', 'Set Current Value')]
  • user_id Many2one → res.users
    domain=<expr> string='User' args: 'res.users'
Public methods (1)
  • action_request_count(self)

New fields (4)
  • company_id Many2one
    related='picking_id.company_id'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • picking_type_code Selection
    readonly=True related='picking_id.picking_type_code'
  • product_return_moves One2many → stock.return.picking.line
    compute='_compute_moves_locations' precompute=True readonly=False store=True args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (4)
  • action_create_exchanges(self)
    Create a return for the active picking, then create a return of the return for the exchange picking and open it.
  • action_create_returns(self)
  • action_create_returns_all(self)
    Create a return matching the total delivered quantity and open it.
  • default_get(self, fields)
    @api.model

New fields (6)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • move_quantity Float
    related='move_id.quantity' string='Move Quantity'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • quantity Float
    default=1 digits='Product Unit of Measure' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (16)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • packaging_ids Many2many → product.packaging
    check_company=True copy=False args: 'product.packaging', 'stock_route_packaging', 'route_id', 'packaging_id', 'Packagings'
  • packaging_selectable Boolean
    help='When checked, the route will be selectable on the Product Packaging.' args: 'Applicable on Packaging'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (2)
  • copy_data(self, default=None)
  • toggle_active(self)

New fields (25)
  • action Selection
    default='pull' index=True required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> domain="[('id', '=?', route_company_id)]" index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this lead time.' args: 'Lead Time'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_dest_from_rule Boolean
    default=False help='When set to True the destination location of the stock.move will be the rule.Otherwise, it takes it from the picking type.' args: 'Destination location origin from rule'
  • location_dest_id Many2one → stock.location
    check_company=True index=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True index=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_code_domain Char
    compute='_compute_picking_type_code_domain'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=?', picking_type_code_domain)]" required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_carrier Boolean
    default=False help='When ticked, carrier of shipment will be propagated.' args: 'Propagation of carrier'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • push_domain Char
    args: 'Push Applicability'
  • route_company_id Many2one
    related='route_id.company_id' string='Route Company'
  • route_id Many2one → stock.route
    index=True ondelete='cascade' required=True args: 'stock.route', 'Route'
  • route_sequence Integer
    compute_sudo=True related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True args: 'stock.warehouse', 'Warehouse'
Public methods (2)
  • copy_data(self, default=None)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (19)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '=', 'internal')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" args: 'stock.lot', 'Lot/Serial'
  • move_ids One2many → stock.move
    args: 'stock.move', 'scrap_id'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '=', 'consu')]" required=True args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    check_company=True compute='_compute_scrap_location_id' domain="[('scrap_location', '=', True)]" precompute=True readonly=False required=True store=True args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    compute='_compute_scrap_qty' default=1.0 digits='Product Unit of Measure' readonly=False required=True store=True args: 'Quantity'
  • scrap_reason_tag_ids Many2many → stock.scrap.reason.tag
    comodel_name='stock.scrap.reason.tag' string='Scrap Reason'
  • should_replenish Boolean
    help='Trigger replenishment for scrapped products' string='Replenish Quantities'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' string='Product Tracking'
Public methods (6)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • check_available_qty(self)
  • do_replenish(self, values=False)
  • do_scrap(self)

New fields (3)
  • color Char
    default='#3C3C3C' string='Color'
  • name Char
    required=True string='Name' translate=True
  • sequence Integer
    default=10
Public methods (0)

No public methods.

New fields (9)
  • allow_new_product Selection
    default='mixed' required=True args: [('empty', 'If the location is empty'), ('same', 'If all products are same'), ('mixed', 'Allow mixed products')]
  • capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'storage_category_id'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • location_ids One2many → stock.location
    args: 'stock.location', 'storage_category_id'
  • max_weight Float
    digits='Stock Weight' args: 'Max Weight'
  • name Char
    required=True args: 'Storage Category'
  • package_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • product_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' string='Weight unit'
Public methods (1)
  • copy_data(self, default=None)

New fields (6)
  • company_id Many2one → res.company
    related='storage_category_id.company_id' args: 'res.company', 'Company'
  • package_type_id Many2one → stock.package.type
    check_company=True ondelete='cascade' args: 'stock.package.type', 'Package Type'
  • product_id Many2one → product.product
    check_company=True domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('id', '=', context.get('default_product_id', False))] if context.get('default_product_id') else [('is_storable', '=', True)]" ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_id Many2one
    related='product_id.uom_id'
  • quantity Float
    required=True args: 'Quantity'
  • storage_category_id Many2one → stock.storage.category
    index=True ondelete='cascade' required=True args: 'stock.storage.category'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • get_lines(self, line_id=False, **kw)
    @api.model
  • get_main_lines(self, given_context=None)
    @api.model
  • get_pdf(self, line_data=None)
  • get_pdf_lines(self, line_data=[])

New fields (3)
  • product_ids Many2many → product.product
    string='Products' args: 'product.product'
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)

New fields (4)
  • product_display_name Char
    compute='_compute_product_display_name' readonly=True args: 'Name'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    related='product_id.tracking'
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (29)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver (1 step)'), ('pick_ship', 'Pick then Deliver (2 steps)'), ('pick_pack_ship', 'Pick, Pack, then Deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'MTO rule'
  • name Char
    default=_default_name required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Pick Type'
  • qc_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Quality Control Type'
  • reception_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive and Store (1 step)'), ('two_steps', 'Receive then Store (2 steps)'), ('three_steps', 'Receive, Quality Control, then Store (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.route
    copy=False help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • route_ids Many2many → stock.route
    check_company=True copy=False domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • store_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Storage Type'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
  • xdock_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Cross Dock Type'
Public methods (8)
  • action_view_all_routes(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_resupply_routes(self, supplier_warehouses)
  • get_current_warehouses(self)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • unlink(self)
  • write(self, vals)

New fields (28)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • days_to_order Float
    compute='_compute_days_to_order' help='Numbers of days in advance that replenishments demands are created.'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days_date Date
    compute='_compute_lead_days'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_category_id Many2one → product.category
    name='Product Category' related='product_id.categ_id' store=True args: 'product.category'
  • product_id Many2one → product.product
    check_company=True domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('id', '=', context.get('default_product_id', False))] if context.get('default_product_id') else [('is_storable', '=', True)]" ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    compute='_compute_product_max_qty' default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity up to (or near to) the Max Quantity specified for this field (or to Min Quantity, whichever is bigger).' readonly=False required=True store=True args: 'Max Quantity'
  • product_min_qty Float
    compute='_compute_product_min_qty' default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity above of this Min Quantity.' readonly=False required=True store=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_forecast Float
    compute='_compute_qty' digits='Product Unit of Measure' readonly=True args: 'Forecast'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to a multiple of this field quantity. If it is 0, it is not rounded.' required=True args: 'Multiple Quantity'
  • qty_on_hand Float
    compute='_compute_qty' digits='Product Unit of Measure' readonly=True args: 'On Hand'
  • qty_to_order Float
    compute='_compute_qty_to_order' digits='Product Unit of Measure' inverse='_inverse_qty_to_order' search='_search_qty_to_order' args: 'To Order'
  • qty_to_order_computed Float
    compute='_compute_qty_to_order_computed' digits='Product Unit of Measure' args: 'To Order Computed'
  • qty_to_order_manual Float
    digits='Product Unit of Measure' args: 'To Order Manual'
  • route_id Many2one → stock.route
    domain="[('product_selectable', '=', True)]" string='Route' args: 'stock.route'
  • rule_ids Many2many → stock.rule
    compute='_compute_rules' string='Rules used' args: 'stock.rule'
  • snoozed_until Date
    help='Hidden until next scheduler.' args: 'Snoozed'
  • trigger Selection
    default='auto' required=True string='Trigger' args: [('auto', 'Auto'), ('manual', 'Manual')]
  • unwanted_replenish Boolean
    compute='_compute_unwanted_replenish' args: 'Unwanted Replenish'
  • visibility_days Float
    compute='_compute_visibility_days' help='Consider product forecast these many days in the future upon product replenishment, set to 0 for just-in-time.\nThe value depends on the type of the route (Buy or Manufacture)' inverse='_set_visibility_days' readonly=False
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.warehouse', 'Warehouse'
Public methods (9)
  • action_open_orderpoints(self)
    @api.model
  • action_product_forecast_report(self)
  • action_remove_manual_qty_to_order(self)
  • action_replenish(self, force_to_max=False)
  • action_replenish_auto(self)
  • action_stock_replenishment_info(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_visibility_days(self)
    @api.model
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_uom_name Char
    required=True args: 'Unit of Measure'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
  • quantity Float
    required=True string='Quantity'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Alexandre Fayolle, qdp-odoo, Atul Patel, Géry Debongnie, Aaron Bohy, GitHub, Damien Bouvy, Wolfgang Taferner, Yannick Tivisse, Odoo Online, Pierre Masereel, Romain Derie, Adrien Dieudonne, Jorge Pinna Puissant, Lucas Perais, Arnold Moyaux, Laurent Mignon (ACSONE), Julien Castiaux, Xavier-Do, Denis Roussel, Carlos Dauden, Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, Anh Thao Pham (pta), svs-odoo, Lois Rilo, Luis González, Samuel Degueldre, Alvaro Fuentes, Adrien Widart, Touati Djamel (otd), Prakash Prajapati, Tiffany Chang (tic), Nathan Marotte (nama), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, snd, Yenthe666, William Braeckman, Ashmawy Walid (was), Richard deMeester, roen-odoo, Hubert Van de Walle (huvw), Miquel Raïch, momegahed, MerlinGuillaume, David (dafr), JF Aubert, PNO, yhu-odoo, Bruno Zanotti, mafo-odoo, Walid HANNICHE (waha), Abdelouahab (abla), Antoine Vandevenne (anv), Demesmaeker, Aurelien van Delft (avd), Hubert Van De Walle, Mathieu Walravens, Achraf, Valentin Chevalier, Renaud Thiry, niyasraphy, damr, Thomas Lefebvre (thle), mehjabinfarsana, alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Walid, Mylyna Hy, Adrien Widart (awt), nda, althaf shaik, Victor Piryns (pivi), Mahamadasif Ansari, Pierre-Yves Dufays, Saurabh Mishra, Paimon, clesgow, Daniel Kosky (dako), Michele, Djamel Touati, Pieter Claeys (clpi), Andrew Gavgavian, Đặng Văn Lộc, Levi Siuzdak (sile), Maruan Aguerdouh (magm), Michael Tietz, Dylan Kiss (dyki), Jinane Maksoud, Mahdi cheikh rouhou (macr), Bruno Boi, Antoine (ande), ノウラ, Maitri Patel, kir-odoo, FrancoisGe, Michael (mcm), paso-odoo, Odoo, Adrien Schoffeniels, bram1000, Martin Maes, Ahmed Khalaf, Xavier Bol (xbo), Brieuc-brd, micheledic, Renilkumar Kajavadra, Paweł Fertyk, Ahmed Khalaf (ahkh), AH-Yussef, Mahdi Cheikh Rouhou (macr), Zachary Hanham, Andrzej(pian), Walid (wasa), kdeb@odoo.com, Paul Stroobant, Dang Van Loc, Mattis Megevand, Youssef Bashandy, OmarAbosamaha, Eteil Djoumatchoua(etdj), Eduardo De Miguel, BernatPForgeFlow, Ethan Vincent, lase@odoo.com, Benjamin Hanquin (beha), Aurelien MARIE (auma), bary, Louis (loti), Richard Prosser, “Beekan”, Nathaniel (naja), vava-odoo, jobl, Julien Carion (juca), adsh-odoo, mega, Tanguy Quéguineur, Chrysanthe (chgo), Louis (wil), RicardCForgeFlow, Junqi Wu, mano-odoo, Max Whale, aamo-odoo, Jonathan, Stéphane Diez, dhpa-odoo, Mohammad Abdulmoneim, JuMiSanAr, hapa-odoo, dhha-odoo, mhch-odoo, Mathias Mathy (MAMA), Edoardo Piroli, Simon Wydooghe, komugi-al, Mohammed Basioni, Evgeniia Kotova, Ian, quyen, jepbarasgarov, Arthur Nanson, David Van Droogenbroeck (DROD), djameltouati, khsr-odoo, Pierre Pulinckx (pipu), Corentin Lombard, kasm, Tejas Modi, plha-odoo, BT-anieto, fd-oerp, Hadi El Yakhni, vevi-odoo, Maeva De Keyser (MDEK), sagu-odoo, Arthur Jochems (ajoc), rare-odoo, sawer, depr-odoo, felin-odoo, kinhosz, Cindy Nguyen, agbr-odoo, aksi-odoo, Hpar, Ze Chen (zeche), mohannedah, Parth Solanki(PASO), Elijah Tay (elct), Junqi, Ian Cioppa (iacio), Lulu Grimalkin (lugr), temo-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/inventory
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - 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 (166)
XML IDNameModelTypeStatus
duplicated_sn_warning stock.quant.duplicated.sn.warning stock.quant form New
exception_on_picking exception_on_picking ir.ui.view qweb New
inventory_warning_reset_view inventory.reset.warning.view stock.inventory.warning form New
inventory_warning_set_view inventory.set.warning.view stock.inventory.warning form New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_packaging_view label_product_packaging_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
lot_label_layout_form_picking lot.label.layout.form lot.label.layout form New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_edit_view Package Level stock.package_level xpath Inherits stock.package_level_form_view
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level Tree Picking stock.package_level tree New
picking_label_type_form picking.label.type.form picking.label.type form New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_label_layout_form_picking product.label.layout.form product.label.layout xpath Inherits product.product_label_layout_form
product_packaging_form_view product.packaging.form.view.stock product.packaging xpath Inherits product.product_packaging_form_view
product_packaging_tree_view product.packaging.tree.view.stock product.packaging xpath Inherits product.product_packaging_tree_view
product_product_stock_tree product.product.stock.tree product.product tree New
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product xpath Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product filter Inherits product.product_search_form_view
product_search_form_view_stock_report product.product.search.stock.form.stock.report product.product filter Inherits stock_product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.stock product.product field Inherits product.product_view_kanban_catalog
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
replenishment_option_tree_view stock.replenishment.option.tree.view stock.replenishment.option tree New
replenishment_option_warning_view stock.replenishment.warning.view stock.replenishment.option form New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_generic_barcode report_generic_barcode ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_packages report_picking_packages ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_reception report_reception ir.ui.view qweb New
report_reception_body report_reception_body ir.ui.view qweb New
report_reception_report_label report_reception_report_label ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.lot search New
stock.report_return_slip stock.report_return_slip ir.ui.view qweb New
stock_inventory_adjustment_name_form_view stock.inventory.adjustment.name.form.view stock.inventory.adjustment.name form New
stock_inventory_conflict_form_view stock.inventory.conflict.form.view stock.inventory.conflict form New
stock_inventory_request_count_form_view stock.request.count.form.view stock.request.count form New
stock_location_route_form_view stock.location.route.form stock.route form New
stock_location_route_tree stock.location.route.tree stock.route tree New
stock_location_route_view_search stock.location.route.search stock.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_package_type_form stock.package.type.form stock.package.type form New
stock_package_type_tree stock.package.type.tree stock.package.type tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_picking_view_activity stock.picking.view.activity stock.picking activity New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_putaway_list stock.putaway.rule.tree stock.putaway.rule tree New
stock_quant_relocate_view_form Stock Relocation stock.quant.relocate form New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_reorder_report_search stock.warehouse.orderpoint.reorder.search stock.warehouse.orderpoint search New
stock_report_delivery_aggregated_move_lines stock_report_delivery_aggregated_move_lines ir.ui.view qweb New
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb New
stock_report_delivery_no_package_section_line stock_report_delivery_no_package_section_line ir.ui.view qweb New
stock_report_delivery_package_section_line stock_report_delivery_package_section_line ir.ui.view qweb New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_storage_category_capacity_tree stock.storage.category.capacity.tree stock.storage.category.capacity tree New
stock_storage_category_form stock.storage.category.form stock.storage.category form New
stock_storage_category_tree stock.storage.category.tree stock.storage.category tree New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_assign_serial_numbers stock_assign_serial_numbers stock.assign.serial form New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_mobile_form stock.move.line.mobile.form stock.move.line xpath Inherits stock.view_move_line_form
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_line_tree_detailed stock.move.line.tree.detailed stock.move.line tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.lot form New
view_production_lot_kanban stock.production.lot.kanban stock.lot kanban New
view_production_lot_tree stock.production.lot.tree stock.lot tree New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_move_line_detailed_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_line_pivot stock.move.line.pivot stock.move.line pivot New
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_orderpoint_snooze Stock Orderpoint Snooze stock.orderpoint.snooze form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template field Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product field Inherits product.product_product_tree_view
view_stock_quant_form view.stock.quant.form stock.quant form New
view_stock_quant_form_editable stock.quant.form.editable stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant xpath Inherits stock.view_stock_quant_tree_simple
view_stock_quant_tree_editable stock.quant.tree.editable stock.quant tree New
view_stock_quant_tree_inventory_editable stock.quant.inventory.tree.editable stock.quant tree New
view_stock_quant_tree_simple stock.quant.tree stock.quant tree New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_replenishment_info Stock Replenishment Information stock.replenishment.info form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.tree stock.rule tree New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree_editable stock.warehouse.orderpoint.tree.editable stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (75)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'location': 'set default', 'lot': 'set default', 'package': 'set default'} selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • label_quantity Selection
    default='lots' help="If the UoM of a lot is not 'units', the lot will be considered as a unit and only one label will be printed for this lot." required=True string='Quantity to print' args: [('lots', 'One per lot/SN'), ('units', 'One per unit')]
  • move_line_ids Many2many → stock.move.line
    args: 'stock.move.line'
  • print_format Selection
    default='4x12' required=True string='Format' args: [('4x12', '4 x 12'), ('zpl', 'ZPL Labels')]
Public methods (1)
  • process(self)

New fields (2)
  • label_type Selection
    default='products' required=True string='Labels to print' args: [('products', 'Product Labels'), ('lots', 'Lot/SN Labels')]
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
Public methods (1)
  • process(self)

New fields (4)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
  • stock_move_ids One2many → stock.move
    string='Related Stock Moves' args: 'stock.move', 'group_id'
Public methods (2)
  • run(self, procurements, raise_user_error=True)
    @api.model
    Fulfil `procurements` with the help of stock rules. Procurements are needs of products at a certain location. To fulfil these needs, we need to create some sort of documents (`stock.move` by default, but extensions of `_run_` methods allow to create every type of documents). :param procurements: the description of the procurement :type list: list of `~odoo.addons.stock.models.stock_rule.ProcurementGroup.Procurement` :param raise_user_error: will raise either an UserError or a ProcurementException :type raise_user_error: boolan, optional :raises UserError: if `raise_user_error` is True and a procurement isn't fulfillable :raises ProcurementException: if `raise_user_error` is False and a procurement isn't fulfillable
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (6)
  • filter_for_stock_putaway_rule Boolean
    search='_search_filter_for_stock_putaway_rule' store=False args: 'stock.putaway.rule'
  • packaging_reserve_method Selection
    default='partial' help='Reserve Only Full Packagings: will not reserve partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then only 1000 will be reserved\nReserve Partial Packagings: allow reserving partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then 1600 will be reserved' string='Reserve Packagings' args: [('full', 'Reserve Only Full Packagings'), ('partial', 'Reserve Partial Packagings')]
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.route', 'stock_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.route
    compute='_compute_total_route_ids' readonly=True search='_search_total_route_ids' string='Total routes' args: 'stock.route'
Public methods (0)

No public methods.

New fields (3)
  • move_ids Many2many → stock.move
    args: 'stock.move'
  • move_quantity Selection
    default='custom' required=True string='Quantity to print' args: [('move', 'Operation Quantities'), ('custom', 'Custom')]
  • print_format Selection
    ondelete={'zpl': 'set default', 'zplxprice': 'set default'} selection_add=[('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
Public methods (0)

No public methods.

New fields (2)
  • package_type_id Many2one → stock.package.type
    args: 'stock.package.type', 'Package Type'
  • route_ids Many2many → stock.route
    domain=[('packaging_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product in this packaging: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_packaging', 'packaging_id', 'route_id', 'Routes'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • lot_properties_definition PropertiesDefinition
    args: 'Lot Properties'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • stock_move_ids One2many → stock.move
    args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    args: 'stock.quant', 'product_id'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    args: 'stock.storage.category.capacity', 'product_id', 'Storage Category Capacity'
  • valid_ean Boolean
    compute='_compute_valid_ean' args: 'Barcode is valid EAN'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecasted Quantity'
Public methods (14)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • filter_has_routes(self)
    Return products with route_ids or whose categ_id has total_route_ids.
  • get_components(self)
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True translate=True args: 'Method'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (13)
  • allowed_route_ids Many2many → stock.route
    compute='_compute_allowed_route_ids' args: 'stock.route'
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    compute='_compute_date_planned' help='Date at which the replenishment should take place.' precompute=True readonly=False required=True store=True args: 'Scheduled Date'
  • forecast_uom_id Many2one
    related='product_id.uom_id'
  • forecasted_quantity Float
    compute='_compute_forecasted_quantity' string='Forecasted Quantity'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unity of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • route_id Many2one → stock.route
    check_company=True help="Apply specific route for the replenishment instead of product's default routes." string='Preferred Route' args: 'stock.route'
  • warehouse_id Many2one → stock.warehouse
    check_company=True required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (26)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • detailed_type Selection
    ondelete={'product': 'set consu'} selection_add=[('product', 'Storable Product')] tracking=True
  • has_available_route_ids Boolean
    compute='_compute_has_available_route_ids' default=<expr> args: 'Routes can be selected on this product'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' related_sudo=False relation='stock.route' string='Category Routes'
  • route_ids Many2many → stock.route
    depends_context=['company', 'allowed_companies'] domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Integer
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • tracking Selection
    compute='_compute_tracking' default='none' help='Ensure the traceability of a storable product in your warehouse.' precompute=True readonly=False required=True store=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    ondelete={'product': 'set consu'} selection_add=[('product', 'Storable Product')]
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_open_routes_diagram(self)
  • action_product_tmpl_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • copy(self, default=None)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (1)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse

New fields (0)

No new fields.

Public methods (3)
  • action_assign(self, move_ids, qtys, in_ids)
    Assign picking move(s) [i.e. link] to other moves (i.e. make them MTO) :param move_id ids: the ids of the moves to make MTO :param qtys list: the quantities that are being assigned to the move_ids (in same order as move_ids) :param in_ids ids: the ids of the moves that are to be assigned to move_ids
  • action_unassign(self, move_id, qty, in_ids)
    Unassign moves [i.e. unlink] from a move (i.e. make non-MTO) :param move_id id: the id of the move to make non-MTO :param qty float: the total quantity that is being unassigned from move_id :param in_ids ids: the ids of the moves that are to be unassigned from move_id
  • get_report_data(self, docids, data)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • annual_inventory_day Integer
    default=31 help='Day of the month when the annual inventory should occur. If zero or negative, then the first day of the month will be selected instead.\n If greater than the last day of a month, then the last day of the month will be selected instead.' string='Day of the month'
  • annual_inventory_month Selection
    default='12' help='Annual inventory month for products not in a location with a cyclic inventory date. Set to no month if no automatic annual inventory.' string='Annual Inventory Month' args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • internal_transit_location_id Many2one → stock.location
    check_company=True ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
Public methods (7)
  • create(self, vals_list)
    @api.model_create_multi
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on existing companies when module stock is installed.

New fields (31)
  • annual_inventory_day Integer
    readonly=False related='company_id.annual_inventory_day'
  • annual_inventory_month Selection
    readonly=False related='company_id.annual_inventory_month'
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_lot_print_gs1 Boolean
    implied_group='stock.group_stock_lot_print_gs1' args: 'Print GS1 Barcodes for Lots & Serial Numbers'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_picking_wave Boolean
    help='Group your move operations in wave transfer to process them together' implied_group='stock.group_stock_picking_wave' args: 'Wave Transfers'
  • group_stock_production_lot Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_reception_report Boolean
    implied_group='stock.group_reception_report' args: 'Reception Report'
  • group_stock_sign_delivery Boolean
    implied_group='stock.group_stock_sign_delivery' args: 'Signature'
  • group_stock_storage_categories Boolean
    implied_group='stock.group_stock_storage_categories' args: 'Storage Categories'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_shiprocket Boolean
    args: 'Shiprocket Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_dropshipping Boolean
    args: 'Dropshipping'
  • module_stock_picking_batch Boolean
    args: 'Batch Transfers'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • move_id Many2one → stock.move
    args: 'stock.move'
  • next_serial_count Integer
    default=_default_next_serial_count required=True args: 'Number of SN'
  • next_serial_number Char
    required=True args: 'First SN'
  • product_id Many2one → product.product
    related='move_id.product_id' args: 'product.product', 'Product'
Public methods (1)
  • generate_serial_numbers(self)

New fields (3)
  • backorder_confirmation_line_ids One2many → stock.backorder.confirmation.line
    string='Backorder Confirmation Lines' args: 'stock.backorder.confirmation.line', 'backorder_confirmation_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
  • show_transfers Boolean
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
  • process_cancel_backorder(self)

New fields (3)
  • backorder_confirmation_id Many2one → stock.backorder.confirmation
    args: 'stock.backorder.confirmation', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Transfer'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (5)
  • new_quantity Float
    default=1 digits='Product Unit of Measure' help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_uom_id Many2one
    related='product_tmpl_id.uom_id'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (2)
  • change_product_qty(self)
    Changes the Product Quantity by creating/editing corresponding quant.
  • check_new_quantity(self)
    @api.constrains('new_quantity')

New fields (0)

No new fields.

Public methods (3)
  • action_reserve_linked_picks(self, move_id)
    @api.model
  • action_unreserve_linked_picks(self, move_id)
    @api.model
  • get_report_values(self, docids, data=None)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, docids, data=None)
    @api.model

New fields (2)
  • inventory_adjustment_name Char
    default='Quantity Updated' string='Inventory Reason'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (1)
  • action_apply(self)

New fields (2)
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant', 'stock_conflict_quant_rel'
  • quant_to_fix_ids Many2many → stock.quant
    string='Conflicts' args: 'stock.quant'
Public methods (2)
  • action_keep_counted_quantity(self)
  • action_keep_difference(self)

New fields (1)
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (2)
  • action_reset(self)
  • action_set(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (30)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • child_internal_location_ids Many2many → stock.location
    compute='_compute_child_internal_location_ids' help="This location (if it's internal) and all its descendants filtered by type=Internal." recursive=True string='Internal locations among descendants' args: 'stock.location'
  • comment Html
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True args: 'Full Location Name'
  • cyclic_inventory_frequency Integer
    default=0 help=' When different than 0, inventory count date for products stored at this location will be automatically set at the defined frequency.' args: 'Inventory Frequency (Days)'
  • forecast_weight Float
    compute='_compute_weight' args: 'Forecasted Weight'
  • incoming_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_dest_id'
  • last_inventory_date Date
    help='Date of the last inventory at this location.' readonly=True args: 'Last Effective Inventory'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • net_weight Float
    compute='_compute_weight' args: 'Net Weight'
  • next_inventory_date Date
    compute='_compute_next_inventory_date' help='Date for next planned inventory based on cyclic schedule.' store=True args: 'Next Expected Inventory'
  • outgoing_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_id'
  • parent_path Char
    index=True unaccent=False
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Removal Strategy'
  • replenish_location Boolean
    compute='_compute_replenish_location' copy=False help='Activate this function to get all quantities to replenish at this particular location' readonly=False store=True args: 'Replenish Location'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • storage_category_id Many2one → stock.storage.category
    check_company=True string='Storage Category' args: 'stock.storage.category'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations: this location consumes the components and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit Location')]
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' store=True args: 'stock.warehouse'
  • warehouse_view_ids One2many → stock.warehouse
    readonly=True args: 'stock.warehouse', 'view_location_id'
Public methods (6)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • name_create(self, name)
    @api.model
  • should_bypass_reservation(self)
  • write(self, values)

New fields (14)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • delivery_count Integer
    compute='_compute_delivery_ids' args: 'Delivery order count'
  • delivery_ids Many2many → stock.picking
    compute='_compute_delivery_ids' string='Transfers' args: 'stock.picking'
  • display_complete Boolean
    compute='_compute_display_complete'
  • last_delivery_partner_id Many2one → res.partner
    compute='_compute_last_delivery_partner_id' args: 'res.partner'
  • location_id Many2one → stock.location
    compute='_compute_single_location' domain="[('usage', '!=', 'view')]" group_expand='_read_group_location_id' inverse='_set_single_location' readonly=False store=True args: 'stock.location', 'Location'
  • lot_properties Properties
    copy=True definition='product_id.lot_properties_definition' args: 'Properties'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' index='trigram' required=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • product_id Many2one → product.product
    check_company=True domain="[('tracking', '!=', 'none'), ('type', '=', 'product')] + ([('product_tmpl_id', '=', context['default_product_tmpl_id'])] if context.get('default_product_tmpl_id') else [])" index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' search='_search_product_qty' args: 'On Hand Quantity'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (6)
  • action_lot_open_quants(self)
  • action_lot_open_transfers(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • generate_lot_names(self, first_lot, count)
    @api.model
    Generate `lot_names` from a string.
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (71)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Scheduled date until move is done, then date of actual move processing' index=True required=True args: 'Date Scheduled'
  • date_deadline Datetime
    copy=False help='Date Promise to the customer on the top level document (SO/PO)' readonly=True args: 'Deadline'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' help='Process at this date to be on time' store=True args: 'Delay Alert Date'
  • description_picking Text
    args: 'Description of Picking'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_import_lot Boolean
    compute='_compute_display_assign_serial'
  • forecast_availability Float
    compute='_compute_forecast_information' compute_sudo=True digits='Product Unit of Measure' args: 'Forecast Availability'
  • forecast_expected_date Datetime
    compute='_compute_forecast_information' compute_sudo=True args: 'Forecasted Expected date'
  • group_id Many2one → procurement.group
    default=_default_group_id index=True args: 'procurement.group', 'Procurement Group'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_inventory Boolean
    args: 'Inventory'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True check_company=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_id Many2one → stock.location
    auto_join=True check_company=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_ids Many2many → stock.lot
    compute='_compute_lot_ids' inverse='_set_lot_ids' readonly=False string='Serial Numbers' args: 'stock.lot'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_lines_count Integer
    compute='_compute_move_lines_count'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    required=True args: 'Description'
  • next_serial Char
    args: 'First SN'
  • next_serial_count Integer
    args: 'Number of SN'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    index=True args: 'stock.warehouse.orderpoint', 'Original Reordering Rule'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    check_company=True copy=False args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' help='Optional address where goods are to be delivered, specifically used for allotment' index='btree_not_null' readonly=False store=True args: 'res.partner', 'Destination Address '
  • picked Boolean
    compute='_compute_picked' copy=False default=False help="This checkbox is just indicative, it doesn't validate or generate any product moves." inverse='_inverse_picked' readonly=False store=True args: 'Picked'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True args: 'stock.picking', 'Transfer'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' readonly=False store=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False args: 'Unit Price'
  • priority Selection
    compute='_compute_priority' default='0' store=True args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    copy=False default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu'])]" index=True required=True args: 'product.product', 'Product'
  • product_packaging_id Many2one → product.packaging
    check_company=True domain="[('product_id', '=', product_id)]" args: 'product.packaging', 'Packaging'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' string='Reserved Packaging Quantity'
  • product_packaging_quantity Float
    compute='_compute_product_packaging_quantity' string='Done Packaging Quantity'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.detailed_type'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'UoM'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=0 digits='Product Unit of Measure' help='This is the quantity of product that is planned to be moved.Lowering this quantity does not generate a backorder.Changing this quantity on assigned moves affects the product reservation, and should be done with care.' required=True args: 'Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity Float
    compute='_compute_quantity' digits='Product Unit of Measure' inverse='_set_quantity' store=True args: 'Quantity'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reservation_date Date
    compute='_compute_reservation_date' help='Computes when a move should be reserved' store=True args: 'Date to Reserve'
  • restrict_partner_id Many2one → res.partner
    check_company=True index='btree_not_null' args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.route
    help='Preferred route' args: 'stock.route', 'stock_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_id Many2one → stock.scrap
    check_company=True readonly=True args: 'stock.scrap', 'Scrap operation'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_lots_m2o Boolean
    compute='_compute_show_info' args: 'Show lot_id'
  • show_lots_text Boolean
    compute='_compute_show_info' args: 'Show lot_name'
  • show_operations Boolean
    related='picking_id.picking_type_id.show_operations'
  • show_quant Boolean
    compute='_compute_show_info' args: 'Show Quant'
  • show_reserved Boolean
    compute='_compute_show_reserved'
  • state Selection
    copy=False default='draft' help="* New: The stock move is created but not confirmed.\n* Waiting Another Move: A linked stock move should be done before this one.\n* Waiting Availability: The stock move is confirmed but the product can't be reserved.\n* Available: The product of the stock move is reserved.\n* Done: The product has been transferred and the transfer has been confirmed." index=True readonly=True string='Status' args: [('draft', 'New'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • warehouse_id Many2one → stock.warehouse
    help='the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_assign_serial(self)
    Opens a wizard to assign SN's name on each move lines.
  • action_generate_lot_line_vals(self, context, mode, first_lot, count, lot_text)
    @api.model
  • action_open_reference(self)
    Open the form view of the move's reference document, if one exists, otherwise open form view of self
  • action_product_forecast_report(self)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • init(self)
  • split_lots(self, lots)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (41)
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • description_picking Text
    string='Description picking'
  • is_inventory Boolean
    related='move_id.is_inventory'
  • is_locked Boolean
    readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'To'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'From'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" args: 'stock.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True index=True args: 'stock.move', 'Stock Operation'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' index='btree_not_null' args: 'res.partner', 'From Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    check_company=True args: 'stock.package_level', 'Package Level'
  • picked Boolean
    compute='_compute_picked' copy=False readonly=False store=True args: 'Picked'
  • picking_code Selection
    readonly=True related='picking_type_id.code'
  • picking_id Many2one → stock.picking
    auto_join=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Transfer'
  • picking_location_dest_id Many2one
    related='picking_id.location_dest_id'
  • picking_location_id Many2one
    related='picking_id.location_id'
  • picking_partner_id Many2one
    readonly=True related='picking_id.partner_id'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    compute='_compute_picking_type_id' search='_search_picking_type_id' args: 'stock.picking.type', 'Operation type'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_category_name Char
    related='product_id.categ_id.complete_name' store=True string='Product Category'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service')]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' string='Reserved Packaging Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • quant_id Many2one → stock.quant
    store=False args: 'stock.quant', 'Pick From'
  • quantity Float
    compute='_compute_quantity' copy=False digits='Product Unit of Measure' readonly=False store=True args: 'Quantity'
  • quantity_product_uom Float
    compute='_compute_quantity_product_uom' copy=False digits='Product Unit of Measure' store=True args: 'Quantity in Product UoM'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • result_package_id Many2one → stock.quant.package
    check_company=True domain="['|', '|', ('location_id', '=', False), ('location_id', '=', location_dest_id), ('id', '=', package_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (8)
  • action_open_reference(self)
  • action_put_in_pack(self)
  • action_revert_inventory(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_move_line_quant_match(self, move_id, dirty_move_line_ids, dirty_quant_ids)
  • init(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • predefined_date Selection
    default='day' string='Snooze for' args: [('day', '1 Day'), ('week', '1 Week'), ('month', '1 Month'), ('custom', 'Custom')]
  • snoozed_until Date
    args: 'Snooze Date'
Public methods (1)
  • action_snooze(self)

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (12)
  • barcode Char
    copy=False args: 'Barcode'
  • base_weight Float
    help='Weight of the package type' string='Weight'
  • company_id Many2one → res.company
    index=True args: 'res.company', 'Company'
  • height Float
    help='Packaging Height' args: 'Height'
  • length_uom_name Char
    compute='_compute_length_uom_name' default=_get_default_length_uom string='Length unit of measure label'
  • max_weight Float
    help='Maximum weight shippable in this packaging' args: 'Max Weight'
  • name Char
    required=True args: 'Package Type'
  • packaging_length Float
    help='Packaging Length' args: 'Length'
  • sequence Integer
    default=1 help='The first in the sequence is the default one.' args: 'Sequence'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'package_type_id', 'Storage Category Capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' default=_get_default_weight_uom string='Weight unit of measure label'
  • width Float
    help='Packaging Width' args: 'Width'
Public methods (1)
  • copy(self, default=None)

New fields (13)
  • company_id Many2one → res.company
    index=True required=True args: 'res.company', 'Company'
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_dest_id' domain="[('id', 'child_of', parent.location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', 'child_of', parent.location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • picking_type_code Selection
    related='picking_id.picking_type_code'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (4)
  • action_show_package_details(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (57)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index='btree_not_null' readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date Datetime
    copy=False default=fields.Datetime.now help='Creation Date, usually the time of the order' tracking=True args: 'Creation Date'
  • date_deadline Datetime
    compute='_compute_date_deadline' help='Date Promise to the customer on the top level document (SO/PO)' store=True args: 'Deadline'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • group_id Many2one → procurement.group
    readonly=True related='move_ids.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_deadline_issue Boolean
    compute='_compute_has_deadline_issue' default=False help='Is late or will be late depending on the deadline and scheduled date' store=True args: 'Is late'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • hide_picking_type Boolean
    compute='_compute_hide_picking_type'
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • is_signed Boolean
    compute='_compute_is_signed' args: 'Is Signed'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    readonly=True related='move_line_ids.lot_id' args: 'stock.lot', 'Lot/Serial Number'
  • move_ids One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_ids_without_package One2many → stock.move
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] string='Stock move' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index='trigram' readonly=True args: 'Reference'
  • note Html
    args: 'Notes'
  • origin Char
    help='Reference of the document' index='trigram' args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' index='btree_not_null' args: 'res.partner', 'Assign Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    check_company=True index='btree_not_null' args: 'res.partner', 'Contact'
  • picking_properties Properties
    copy=True definition='picking_type_id.picking_properties_definition' args: 'Properties'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code'
  • picking_type_entire_packs Boolean
    related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id index=True required=True args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    default='0' help='Products will be reserved first for the transfers with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_ids.product_id' args: 'product.product', 'Product'
  • products_availability Char
    compute='_compute_products_availability' help='Latest product availability status of the picking' string='Product Availability'
  • products_availability_state Selection
    compute='_compute_products_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • return_count Integer
    compute='_compute_return_count' compute_sudo=False args: '# Returns'
  • return_id Many2one → stock.picking
    check_company=True copy=False help='If this picking was created as a return of another picking, this field links to the original picking.' index='btree_not_null' readonly=True args: 'stock.picking', 'Return of'
  • return_ids One2many → stock.picking
    args: 'stock.picking', 'return_id', 'Returns'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' store=True tracking=True args: 'Scheduled Date'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the button "Check Availability" should be displayed.'
  • show_clear_qty_button Boolean
    compute='_compute_show_qty_button'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_operations Boolean
    related='picking_type_id.show_operations'
  • show_reserved Boolean
    related='picking_type_id.show_reserved'
  • show_set_qty_button Boolean
    compute='_compute_show_qty_button'
  • signature Image
    attachment=True copy=False help='Signature' args: 'Signature'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • use_existing_lots Boolean
    related='picking_type_id.use_existing_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (21)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_cancel(self)
  • action_confirm(self)
  • action_detailed_operations(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_picking_move_tree(self)
  • action_put_in_pack(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_see_returns(self)
  • action_toggle_is_locked(self)
  • action_view_reception_report(self)
  • button_scrap(self)
  • button_validate(self)
  • create(self, vals_list)
    @api.model_create_multi
  • do_print_picking(self)
  • do_unreserve(self)
  • should_print_delivery_address(self)
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (45)
  • active Boolean
    default=True args: 'Active'
  • auto_print_delivery_slip Boolean
    help='If this checkbox is ticked, Odoo will automatically print the delivery slip of a picking when it is validated.' args: 'Auto Print Delivery Slip'
  • auto_print_lot_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the lot/SN labels of a picking when it is validated.' args: 'Auto Print Lot/SN Labels'
  • auto_print_package_label Boolean
    help='If this checkbox is ticked, Odoo will automatically print the package label when "Put in Pack" button is used.' args: 'Auto Print Package Label'
  • auto_print_packages Boolean
    help='If this checkbox is ticked, Odoo will automatically print the packages and their contents of a picking when it is validated.' args: 'Auto Print Packages'
  • auto_print_product_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the product labels of a picking when it is validated.' args: 'Auto Print Product Labels'
  • auto_print_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically print the reception report of a picking when it is validated and has assigned moves.' args: 'Auto Print Reception Report'
  • auto_print_reception_report_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the reception report labels of a picking when it is validated.' args: 'Auto Print Reception Report Labels'
  • auto_print_return_slip Boolean
    help='If this checkbox is ticked, Odoo will automatically print the return slip of a picking when it is validated.' args: 'Auto Print Return Slip'
  • auto_show_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically show the reception report (if there are moves to allocate to) when validating.' args: 'Show Reception Report at Validation'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    default='incoming' required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • create_backorder Selection
    default='ask' help='When validating a transfer:\n * Ask: users are asked to choose if they want to make a backorder for remaining products\n * Always: a backorder is automatically created for the remaining products\n * Never: remaining products are cancelled' required=True args: [('ask', 'Ask'), ('always', 'Always'), ('never', 'Never')], 'Create Backorder'
  • default_location_dest_id Many2one → stock.location
    check_company=True compute='_compute_default_location_dest_id' help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' precompute=True readonly=False store=True args: 'stock.location', 'Default Destination Location'
  • default_location_return_id Many2one → stock.location
    check_company=True domain="[('return_location', '=', 'True')]" help='This is the default location for returns created from a picking with this operation type.' args: 'stock.location', 'Default returns location'
  • default_location_src_id Many2one → stock.location
    check_company=True compute='_compute_default_location_src_id' help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' precompute=True readonly=False store=True args: 'stock.location', 'Default Source Location'
  • hide_reservation_method Boolean
    compute='_compute_hide_reservation_method'
  • lot_label_format Selection
    default='4x12_lots' string='Lot Label Format to auto-print' args: [('4x12_lots', '4 x 12 - One per lot/SN'), ('4x12_units', '4 x 12 - One per unit'), ('zpl_lots', 'ZPL Labels - One per lot/SN'), ('zpl_units', 'ZPL Labels - One per unit')]
  • name Char
    required=True translate=True args: 'Operation Type'
  • package_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Package Label to Print'
  • picking_properties_definition PropertiesDefinition
    args: 'Picking Properties'
  • print_label Boolean
    compute='_compute_print_label' help='If this checkbox is ticked, label will be print in this operation.' readonly=False store=True args: 'Print Label'
  • product_label_format Selection
    default='2x7xprice' string='Product Label Format to auto-print' args: [('dymo', 'Dymo'), ('2x7xprice', '2 x 7 with price'), ('4x7xprice', '4 x 7 with price'), ('4x12', '4 x 12'), ('4x12xprice', '4 x 12 with price'), ('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
  • reservation_days_before Integer
    help='Maximum number of days before scheduled date that products should be reserved.' args: 'Days'
  • reservation_days_before_priority Integer
    help='Maximum number of days before scheduled date that priority picking products should be reserved.' args: 'Days when starred'
  • reservation_method Selection
    default='at_confirm' help='How products in transfers of this operation type should be reserved.' required=True args: [('at_confirm', 'At Confirmation'), ('manual', 'Manually'), ('by_date', 'Before scheduled date')], 'Reservation Method'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Sequence Prefix'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=False help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_picking_type Boolean
    compute='_compute_show_picking_type'
  • show_reserved Boolean
    compute='_compute_show_reserved' default=True help='If this checkbox is ticked, Odoo will automatically pre-fill the detailed operations with the corresponding products, locations and lot/serial numbers. For moves that are returns, the detailed operations will always be prefilled, regardless of this option.' store=True args: 'Pre-fill Detailed Operations'
  • use_create_lots Boolean
    compute='_compute_use_create_lots' default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' readonly=False store=True args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    compute='_compute_use_existing_lots' default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' readonly=False store=True args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' ondelete='cascade' readonly=False store=True args: 'stock.warehouse', 'Warehouse'
Public methods (9)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_action_picking_type_operations(self)
  • get_stock_picking_action_picking_type(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True args: 'Active'
  • category_id Many2one → product.category
    default=_default_category_id domain=[('filter_for_stock_putaway_rule', '=', True)] ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False)]" index=True ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to sublocation'
  • package_type_ids Many2many → stock.package.type
    check_company=True string='Package Type' args: 'stock.package.type'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('type', '!=', 'service')]" ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
  • storage_category_id Many2one → stock.storage.category
    check_company=True ondelete='cascade' args: 'stock.storage.category', 'Storage Category'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (29)
  • available_quantity Float
    compute='_compute_available_quantity' digits='Product Unit of Measure' help="On hand quantity which hasn't been reserved on a transfer, in the default unit of measure of the product" args: 'Available Quantity'
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • cyclic_inventory_frequency Integer
    related='location_id.cyclic_inventory_frequency'
  • in_date Datetime
    default=fields.Datetime.now readonly=True required=True args: 'Incoming Date'
  • inventory_date Date
    compute='_compute_inventory_date' help='Next date the On Hand Quantity should be counted.' readonly=False store=True args: 'Scheduled Date'
  • inventory_diff_quantity Float
    compute='_compute_inventory_diff_quantity' digits='Product Unit of Measure' help="Indicates the gap between the product's theoretical quantity and its counted quantity." readonly=True store=True args: 'Difference'
  • inventory_quantity Float
    digits='Product Unit of Measure' help="The product's counted quantity." args: 'Counted Quantity'
  • inventory_quantity_auto_apply Float
    compute='_compute_inventory_quantity_auto_apply' digits='Product Unit of Measure' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • inventory_quantity_set Boolean
    compute='_compute_inventory_quantity_set' default=False readonly=False store=True
  • is_outdated Boolean
    compute='_compute_is_outdated' search='_search_is_outdated' args: 'Quantity has been moved since last count'
  • last_count_date Date
    compute='_compute_last_count_date' help='Last time the Quantity was Updated'
  • location_id Many2one → stock.location
    auto_join=True domain=<expr> index=True ondelete='restrict' required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.lot
    check_company=True domain=<expr> index=True ondelete='restrict' args: 'stock.lot', 'Lot/Serial Number'
  • lot_properties Properties
    definition='product_id.lot_properties_definition' readonly=True related='lot_id.lot_properties'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' index='btree_not_null' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" help='The package containing this quant' index=True ondelete='restrict' args: 'stock.quant.package', 'Package'
  • priority Selection
    related='product_tmpl_id.priority'
  • product_categ_id Many2one
    related='product_tmpl_id.categ_id'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    digits='Product Unit of Measure' help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 digits='Product Unit of Measure' help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • sn_duplicated Boolean
    compute='_compute_sn_duplicated' help='If the same SN is in another Quant' string='Duplicated Serial Number'
  • storage_category_id Many2one
    related='location_id.storage_category_id' store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
  • user_id Many2one → res.users
    domain=<expr> help='User assigned to do product count.' args: 'res.users', 'Assigned To'
  • warehouse_id Many2one → stock.warehouse
    related='location_id.warehouse_id' args: 'stock.warehouse'
Public methods (24)
  • action_apply_inventory(self)
  • action_clear_inventory_quantity(self)
  • action_inventory_at_date(self)
  • action_inventory_history(self)
  • action_reset(self)
  • action_set_inventory_quantity(self)
  • action_set_inventory_quantity_zero(self)
  • action_stock_quant_relocate(self)
  • action_view_inventory(self)
    @api.model
    Similar to _get_quants_action except specific for inventory adjustments (i.e. inventory counts).
  • action_view_orderpoints(self)
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • action_warning_duplicated_sn(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_lot_id(self)
    @api.constrains('lot_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • get_import_templates(self)
    @api.model
  • move_quants(self, location_dest_id=False, package_dest_id=False, message=False, unpack=False)
    Directly move a stock.quant to another location and/or package by creating a stock.move. :param location_dest_id: `stock.location` destination location for the quants :param package_dest_id: `stock.quant.package´ destination package for the quants :param message: String to fill the reference field on the generated stock.move :param unpack: set to True when needing to unpack the quant
  • name_create(self, name)
    @api.model
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Override to display the inventory_quantity_auto_apply:sum in group by of the list view
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (9)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index='trigram' required=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_owner_id' compute_sudo=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • pack_date Date
    default=fields.Date.today args: 'Pack Date'
  • package_type_id Many2one → stock.package.type
    index=True args: 'stock.package.type', 'Package Type'
  • package_use Selection
    default='disposable' help="Reusable boxes are used for batch picking and emptied afterwards to be reused. In the barcode application, scanning a reusable box will add the products in this box.\n Disposable boxes aren't reused, when scanning a disposable box in the barcode application, the contained products are added to the transfer." required=True string='Package Use' args: [('disposable', 'Disposable Box'), ('reusable', 'Reusable Box')]
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
  • valid_sscc Boolean
    compute='_compute_valid_sscc' args: 'Package name is valid SSCC'
Public methods (2)
  • action_view_picking(self)
  • unpack(self)

New fields (9)
  • company_id Many2one
    related='quant_ids.company_id'
  • dest_location_id Many2one → stock.location
    domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" args: 'stock.location'
  • dest_package_id Many2one → stock.quant.package
    compute='_compute_dest_package_id' domain='dest_package_id_domain' store=True args: 'stock.quant.package'
  • dest_package_id_domain Char
    compute='_compute_dest_package_id_domain'
  • is_multi_location Boolean
    compute='_compute_is_multi_location'
  • is_partial_package Boolean
    compute='_compute_is_partial_package'
  • message Text
    args: 'Reason for relocation'
  • partial_package_names Char
    compute='_compute_is_partial_package'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (1)
  • action_relocate_quants(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (7)
  • json_lead_days Char
    compute='_compute_json_lead_days'
  • json_replenishment_history Char
    compute='_compute_json_replenishment_history'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • product_id Many2one → product.product
    related='orderpoint_id.product_id' args: 'product.product'
  • qty_to_order Float
    related='orderpoint_id.qty_to_order'
  • warehouseinfo_ids One2many
    related='orderpoint_id.warehouse_id.resupply_route_ids'
  • wh_replenishment_option_ids One2many → stock.replenishment.option
    compute='_compute_wh_replenishment_options' args: 'stock.replenishment.option', 'replenishment_info_id'
Public methods (0)

No public methods.

New fields (10)
  • free_qty Float
    compute='_compute_free_qty'
  • lead_time Char
    compute='_compute_lead_time'
  • location_id Many2one → stock.location
    related='warehouse_id.lot_stock_id' args: 'stock.location'
  • product_id Many2one → product.product
    args: 'product.product'
  • qty_to_order Float
    related='replenishment_info_id.qty_to_order'
  • replenishment_info_id Many2one → stock.replenishment.info
    args: 'stock.replenishment.info'
  • route_id Many2one → stock.route
    args: 'stock.route'
  • uom Char
    related='product_id.uom_name'
  • warehouse_id Many2one → stock.warehouse
    related='route_id.supplier_wh_id' args: 'stock.warehouse'
  • warning_message Char
    compute='_compute_warning_message'
Public methods (3)
  • order_all(self)
  • order_avbl(self)
  • select_route(self)

New fields (4)
  • inventory_date Date
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' required=True args: 'Inventory Date'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • set_count Selection
    default='empty' string='Count' args: [('empty', 'Leave Empty'), ('set', 'Set Current Value')]
  • user_id Many2one → res.users
    domain=<expr> string='User' args: 'res.users'
Public methods (1)
  • action_request_count(self)

New fields (7)
  • company_id Many2one
    related='picking_id.company_id'
  • location_id Many2one → stock.location
    compute='_compute_moves_locations' domain="['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]" readonly=False store=True args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    compute='_compute_moves_locations' store=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    compute='_compute_moves_locations' store=True args: 'stock.location'
  • parent_location_id Many2one → stock.location
    compute='_compute_moves_locations' store=True args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    compute='_compute_moves_locations' readonly=False store=True args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (16)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • packaging_ids Many2many → product.packaging
    check_company=True copy=False args: 'product.packaging', 'stock_route_packaging', 'route_id', 'packaging_id', 'Packagings'
  • packaging_selectable Boolean
    help='When checked, the route will be selectable on the Product Packaging.' args: 'Applicable on Packaging'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (2)
  • copy(self, default=None)
  • toggle_active(self)

New fields (23)
  • action Selection
    default='pull' index=True required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> domain="[('id', '=?', route_company_id)]" index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this lead time.' args: 'Lead Time'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_dest_id Many2one → stock.location
    check_company=True index=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True index=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_code_domain Char
    compute='_compute_picking_type_code_domain'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=?', picking_type_code_domain)]" required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_carrier Boolean
    default=False help='When ticked, carrier of shipment will be propagated.' args: 'Propagation of carrier'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_company_id Many2one
    related='route_id.company_id' string='Route Company'
  • route_id Many2one → stock.route
    index=True ondelete='cascade' required=True args: 'stock.route', 'Route'
  • route_sequence Integer
    compute_sudo=True related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True args: 'stock.warehouse', 'Warehouse'
Public methods (2)
  • copy(self, default=None)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (18)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '=', 'internal')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" args: 'stock.lot', 'Lot/Serial'
  • move_ids One2many → stock.move
    args: 'stock.move', 'scrap_id'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu'])]" required=True args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    check_company=True compute='_compute_scrap_location_id' domain="[('scrap_location', '=', True)]" precompute=True readonly=False required=True store=True args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    compute='_compute_scrap_qty' default=1.0 digits='Product Unit of Measure' readonly=False required=True store=True args: 'Quantity'
  • should_replenish Boolean
    string='Replenish Quantities'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' string='Product Tracking'
Public methods (6)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • check_available_qty(self)
  • do_replenish(self, values=False)
  • do_scrap(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • allow_new_product Selection
    default='mixed' required=True args: [('empty', 'If the location is empty'), ('same', 'If all products are same'), ('mixed', 'Allow mixed products')]
  • capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'storage_category_id'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • location_ids One2many → stock.location
    args: 'stock.location', 'storage_category_id'
  • max_weight Float
    digits='Stock Weight' args: 'Max Weight'
  • name Char
    required=True args: 'Storage Category'
  • package_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • product_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' string='Weight unit'
Public methods (1)
  • copy(self, default=None)

New fields (6)
  • company_id Many2one → res.company
    related='storage_category_id.company_id' args: 'res.company', 'Company'
  • package_type_id Many2one → stock.package.type
    check_company=True ondelete='cascade' args: 'stock.package.type', 'Package Type'
  • product_id Many2one → product.product
    check_company=True domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('id', '=', context.get('default_product_id', False))] if context.get('default_product_id') else [('type', '=', 'product')]" ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_id Many2one
    related='product_id.uom_id'
  • quantity Float
    required=True args: 'Quantity'
  • storage_category_id Many2one → stock.storage.category
    index=True ondelete='cascade' required=True args: 'stock.storage.category'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • get_lines(self, line_id=False, **kw)
    @api.model
  • get_main_lines(self, given_context=None)
    @api.model
  • get_pdf(self, line_data=None)
  • get_pdf_lines(self, line_data=[])

New fields (3)
  • product_ids Many2many → product.product
    string='Products' args: 'product.product'
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)

New fields (4)
  • product_display_name Char
    compute='_compute_product_display_name' readonly=True args: 'Name'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    related='product_id.tracking'
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (26)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver goods directly (1 step)'), ('pick_ship', 'Send goods in output and then deliver (2 steps)'), ('pick_pack_ship', 'Pack goods, send goods in output and then deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'MTO rule'
  • name Char
    default=_default_name required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly (1 step)'), ('two_steps', 'Receive goods in input and then stock (2 steps)'), ('three_steps', 'Receive goods in input, then quality and then stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.route
    copy=False help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • route_ids Many2many → stock.route
    check_company=True copy=False domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
Public methods (8)
  • action_view_all_routes(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_resupply_routes(self, supplier_warehouses)
  • get_current_warehouses(self)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (26)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • days_to_order Float
    compute='_compute_days_to_order' help='Numbers of days in advance that replenishments demands are created.'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days_date Date
    compute='_compute_lead_days'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_category_id Many2one → product.category
    name='Product Category' related='product_id.categ_id' store=True args: 'product.category'
  • product_id Many2one → product.product
    check_company=True domain="[('product_tmpl_id', '=', context.get('active_id', False))] if context.get('active_model') == 'product.template' else [('id', '=', context.get('default_product_id', False))] if context.get('default_product_id') else [('type', '=', 'product')]" ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Max Quantity'
  • product_min_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_forecast Float
    compute='_compute_qty' digits='Product Unit of Measure' readonly=True args: 'Forecast'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Multiple Quantity'
  • qty_on_hand Float
    compute='_compute_qty' digits='Product Unit of Measure' readonly=True args: 'On Hand'
  • qty_to_order Float
    compute='_compute_qty_to_order' digits='Product Unit of Measure' readonly=False store=True args: 'To Order'
  • route_id Many2one → stock.route
    domain="[('product_selectable', '=', True)]" string='Route' args: 'stock.route'
  • rule_ids Many2many → stock.rule
    compute='_compute_rules' string='Rules used' args: 'stock.rule'
  • snoozed_until Date
    help='Hidden until next scheduler.' args: 'Snoozed'
  • trigger Selection
    default='auto' required=True string='Trigger' args: [('auto', 'Auto'), ('manual', 'Manual')]
  • unwanted_replenish Boolean
    compute='_compute_unwanted_replenish' args: 'Unwanted Replenish'
  • visibility_days Float
    compute='_compute_visibility_days' help='Consider product forecast these many days in the future upon product replenishment, set to 0 for just-in-time.\nThe value depends on the type of the route (Buy or Manufacture)' inverse='_set_visibility_days' readonly=False
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.warehouse', 'Warehouse'
Public methods (7)
  • action_open_orderpoints(self)
    @api.model
  • action_product_forecast_report(self)
  • action_replenish(self, force_to_max=False)
  • action_replenish_auto(self)
  • action_stock_replenishment_info(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_uom_name Char
    required=True args: 'Unit of Measure'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
  • quantity Float
    required=True string='Quantity'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Atul Patel, Aaron Bohy, GitHub, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, qsm-odoo, Jorge Pinna Puissant, Arnold Moyaux, Laurent Mignon (ACSONE), Julien Castiaux, Xavier-Do, Denis Roussel, Romeo Fragomeli, Carlos Dauden, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, William Henrotin, Florent de Labarre, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Lois Rilo, Luis González, Samuel Degueldre, Alvaro Fuentes, Achraf (abz), Adrien Widart, Nasreddin Boulif (bon), Touati Djamel (otd), Tiffany Chang (tic), Nathan Marotte (nama), Rémy Voet (ryv), Ivàn Todorovich, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, snd, Yenthe666, Aurélien (avd), William Braeckman, bit-odoo, Ashmawy Walid (was), Richard deMeester, roen-odoo, Hubert Van de Walle (huvw), Hardik Prajapati, Miquel Raïch, Laurent Desausoi (lade), momegahed, Bruno-brsy, william-andre, Florian Damhaut, Sébastien Alix, Merlin (megu), MerlinGuillaume, David (dafr), JF Aubert, PNO, yhu-odoo, nouraellm, Bruno Zanotti, mafo-odoo, Nshimiyimana Séna, Walid HANNICHE (waha), Yolann Sabaux, Abdelouahab (abla), Pouya Malekinejad, Antoine Vandevenne (anv), Jinjiu Liu, Aurelien van Delft (avd), Mathieu Walravens, Achraf, Renaud Thiry, Mihran Thalhath, niyasraphy, Rodrigo, Alfredo Zamora, Habib (ayh), damr, alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Walid, Adrien Widart (awt), nda, althaf shaik, Victor Piryns (pivi), Simon Genin (ges), Pierre-Yves Dufays, Saurabh Mishra, Paimon, clesgow, Daniel Kosky (dako), Michele, Djamel Touati, Pieter Claeys (clpi), Andrew Gavgavian, Nicolas Pierre, Đặng Văn Lộc, Levi Siuzdak (sile), Maruan Aguerdouh (magm), Michael Tietz, Mahdi cheikh rouhou (macr), Bruno Boi, Antoine (ande), ノウラ, Piero (pca), paso-odoo, bram1000, Martin Maes, Ahmed Khalaf, micheledic, Renilkumar Kajavadra, Benjamin Willig, Ahmed Khalaf (ahkh), Nguyễn Đại Dương, AH-Yussef, Mahdi Cheikh Rouhou (macr), Andrzej(pian), Walid (wasa), Paul Stroobant, stefanorigano (SRI), Dang Van Loc, Mattis Megevand, OmarAbosamaha, Charles Ferir, Eteil Djoumatchoua(etdj), Eduardo De Miguel, boan-odoo, BernatPForgeFlow, Ethan Vincent, Mathieu (mcou), lase@odoo.com, Benjamin Hanquin (beha), InCeyN, bary, vava-odoo, Martin Trigaux (mat), Chrysanthe (chgo), Raman Salihi, Louis (wil), Aungkokolin1997, Junqi Wu, mano-odoo, Jonathan, Mathieu (mano), Stéphane Diez, dhpa-odoo, Mohammad Abdulmoneim, JuMiSanAr, hapa-odoo, dhha-odoo, mhch-odoo, Ryan Cen, Mathias Mathy (MAMA), Edoardo Piroli, Simon Wydooghe, komugi-al, kawkb
WEBSITE
WEBSITEhttps://www.odoo.com/app/inventory
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - 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 (165)
XML IDNameModelTypeStatus
duplicated_sn_warning stock.quant.duplicated.sn.warning stock.quant form New
exception_on_picking exception_on_picking ir.ui.view qweb New
inventory_warning_reset_view inventory.reset.warning.view stock.inventory.warning form New
inventory_warning_set_view inventory.set.warning.view stock.inventory.warning form New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_packaging_view label_product_packaging_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
lot_label_layout_form_picking lot.label.layout.form lot.label.layout form New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_edit_view Package Level stock.package_level xpath Inherits stock.package_level_form_view
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level Tree Picking stock.package_level tree New
picking_label_type_form picking.label.type.form picking.label.type form New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_label_layout_form_picking product.label.layout.form product.label.layout xpath Inherits product.product_label_layout_form
product_packaging_form_view product.packaging.form.view.stock product.packaging xpath Inherits product.product_packaging_form_view
product_packaging_tree_view product.packaging.tree.view.stock product.packaging xpath Inherits product.product_packaging_tree_view
product_product_stock_tree product.product.stock.tree product.product tree New
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product header Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product filter Inherits product.product_search_form_view
product_search_form_view_stock_report product.product.search.stock.form.stock.report product.product filter Inherits stock_product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
replenishment_option_tree_view stock.replenishment.option.tree.view stock.replenishment.option tree New
replenishment_option_warning_view stock.replenishment.warning.view stock.replenishment.option form New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_generic_barcode report_generic_barcode ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_mrp_line report_mrp_line ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_packages report_picking_packages ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_product_product_replenishment report_product_product_replenishment ir.ui.view qweb New
report_product_template_replenishment report_product_template_replenishment ir.ui.view qweb New
report_reception report_reception ir.ui.view qweb New
report_reception_body report_reception_body ir.ui.view qweb New
report_reception_report_label report_reception_report_label ir.ui.view qweb New
report_replenishment_header report_replenishment_header ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory report_stock_inventory ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.lot search New
stock_inventory_adjustment_name_form_view stock.inventory.adjustment.name.form.view stock.inventory.adjustment.name form New
stock_inventory_conflict_form_view stock.inventory.conflict.form.view stock.inventory.conflict form New
stock_inventory_request_count_form_view stock.request.count.form.view stock.request.count form New
stock_location_route_form_view stock.location.route.form stock.route form New
stock_location_route_tree stock.location.route.tree stock.route tree New
stock_location_route_view_search stock.location.route.search stock.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_package_type_form stock.package.type.form stock.package.type form New
stock_package_type_tree stock.package.type.tree stock.package.type tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_putaway_list stock.putaway.rule.tree stock.putaway.rule tree New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_reorder_report_search stock.warehouse.orderpoint.reorder.search stock.warehouse.orderpoint search New
stock_report_delivery_aggregated_move_lines stock_report_delivery_aggregated_move_lines ir.ui.view qweb New
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb New
stock_report_delivery_no_package_section_line stock_report_delivery_no_package_section_line ir.ui.view qweb New
stock_report_delivery_package_section_line stock_report_delivery_package_section_line ir.ui.view qweb New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_storage_category_capacity_tree stock.storage.category.capacity.tree stock.storage.category.capacity tree New
stock_storage_category_form stock.storage.category.form stock.storage.category form New
stock_storage_category_tree stock.storage.category.tree stock.storage.category tree New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_assign_serial_numbers stock_assign_serial_numbers stock.assign.serial form New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_mobile_form stock.move.line.mobile.form stock.move.line xpath Inherits stock.view_move_line_form
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_line_tree_detailed stock.move.line.tree.detailed stock.move.line tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.lot form New
view_production_lot_tree stock.production.lot.tree stock.lot tree New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_move_line_detailed_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_nosuggest_operations stock.move.operations.nosuggest.form stock.move field Inherits stock.view_stock_move_operations
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_orderpoint_snooze Stock Orderpoint Snooze stock.orderpoint.snooze form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template field Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product field Inherits product.product_product_tree_view
view_stock_quant_form_editable stock.quant.form.editable stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_quant_tree_editable stock.quant.tree.editable stock.quant tree New
view_stock_quant_tree_inventory_editable stock.quant.inventory.tree.editable stock.quant tree New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_replenishment_info Stock Replenishment Information stock.replenishment.info form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.tree stock.rule tree New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree_editable stock.warehouse.orderpoint.tree.editable stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (74)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'location': 'set default', 'lot': 'set default', 'package': 'set default'} selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (3)
  • label_quantity Selection
    default='lots' help="If the UoM of a lot is not 'units', the lot will be considered as a unit and only one label will be printed for this lot." required=True string='Quantity to print' args: [('lots', 'One per lot/SN'), ('units', 'One per unit')]
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
  • print_format Selection
    default='4x12' required=True string='Format' args: [('4x12', '4 x 12'), ('zpl', 'ZPL Labels')]
Public methods (1)
  • process(self)

New fields (2)
  • label_type Selection
    default='products' required=True string='Labels to print' args: [('products', 'Product Labels'), ('lots', 'Lot/SN Labels')]
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
Public methods (1)
  • process(self)

New fields (4)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
  • stock_move_ids One2many → stock.move
    string='Related Stock Moves' args: 'stock.move', 'group_id'
Public methods (2)
  • run(self, procurements, raise_user_error=True)
    @api.model
    Fulfil `procurements` with the help of stock rules. Procurements are needs of products at a certain location. To fulfil these needs, we need to create some sort of documents (`stock.move` by default, but extensions of `_run_` methods allow to create every type of documents). :param procurements: the description of the procurement :type list: list of `~odoo.addons.stock.models.stock_rule.ProcurementGroup.Procurement` :param raise_user_error: will raise either an UserError or a ProcurementException :type raise_user_error: boolan, optional :raises UserError: if `raise_user_error` is True and a procurement isn't fulfillable :raises ProcurementException: if `raise_user_error` is False and a procurement isn't fulfillable
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (5)
  • packaging_reserve_method Selection
    default='partial' help='Reserve Only Full Packagings: will not reserve partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then only 1000 will be reserved\nReserve Partial Packagings: allow reserving partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then 1600 will be reserved' string='Reserve Packagings' args: [('full', 'Reserve Only Full Packagings'), ('partial', 'Reserve Partial Packagings')]
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.route', 'stock_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.route'
Public methods (0)

No public methods.

New fields (3)
  • move_line_ids Many2many → stock.move.line
    args: 'stock.move.line'
  • picking_quantity Selection
    default='custom' required=True string='Quantity to print' args: [('picking', 'Transfer Quantities'), ('custom', 'Custom')]
  • print_format Selection
    ondelete={'zpl': 'set default', 'zplxprice': 'set default'} selection_add=[('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
Public methods (0)

No public methods.

New fields (2)
  • package_type_id Many2one → stock.package.type
    args: 'stock.package.type', 'Package Type'
  • route_ids Many2many → stock.route
    domain=[('packaging_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product in this packaging: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_packaging', 'packaging_id', 'route_id', 'Routes'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • stock_move_ids One2many → stock.move
    args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    args: 'stock.quant', 'product_id'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    args: 'stock.storage.category.capacity', 'product_id', 'Storage Category Capacity'
  • valid_ean Boolean
    compute='_compute_valid_ean' args: 'Barcode is valid EAN'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecasted Quantity'
Public methods (13)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • get_components(self)
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (10)
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    help='Date at which the replenishment should take place.' required=True args: 'Scheduled Date'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unit of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • route_ids Many2many → stock.route
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help="Apply specific route(s) for the replenishment instead of product's default routes." string='Preferred Routes' args: 'stock.route'
  • warehouse_id Many2one → stock.warehouse
    domain="[('company_id', '=', company_id)]" required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (26)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • detailed_type Selection
    ondelete={'product': 'set consu'} selection_add=[('product', 'Storable Product')] tracking=True
  • has_available_route_ids Boolean
    compute='_compute_has_available_route_ids' default=<expr> args: 'Routes can be selected on this product'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' related_sudo=False relation='stock.route' string='Category Routes'
  • route_ids Many2many → stock.route
    depends_context=['company', 'allowed_companies'] domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • tracking Selection
    compute='_compute_tracking' default='none' help='Ensure the traceability of a storable product in your warehouse.' precompute=True readonly=False required=True store=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    ondelete={'product': 'set consu'} selection_add=[('product', 'Storable Product')]
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_open_routes_diagram(self)
  • action_product_tmpl_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • copy(self, default=None)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (1)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse

New fields (0)

No new fields.

Public methods (2)
  • get_report_values(self, docids, data=None, serialize=False)
    @api.model
  • get_warehouses(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, docids, data=None, serialize=False)
    @api.model

New fields (0)

No new fields.

Public methods (3)
  • action_assign(self, move_ids, qtys, in_ids)
    Assign picking move(s) [i.e. link] to other moves (i.e. make them MTO) :param move_id ids: the ids of the moves to make MTO :param qtys list: the quantities that are being assigned to the move_ids (in same order as move_ids) :param in_ids ids: the ids of the moves that are to be assigned to move_ids
  • action_unassign(self, move_id, qty, in_ids)
    Unassign moves [i.e. unlink] from a move (i.e. make non-MTO) :param move_id id: the id of the move to make non-MTO :param qty float: the total quantity that is being unassigned from move_id :param in_ids ids: the ids of the moves that are to be unassigned from move_id
  • get_report_data(self, docids, data)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • annual_inventory_day Integer
    default=31 help='Day of the month when the annual inventory should occur. If zero or negative, then the first day of the month will be selected instead.\n If greater than the last day of a month, then the last day of the month will be selected instead.' string='Day of the month'
  • annual_inventory_month Selection
    default='12' help='Annual inventory month for products not in a location with a cyclic inventory date. Set to no month if no automatic annual inventory.' string='Annual Inventory Month' args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • internal_transit_location_id Many2one → stock.location
    check_company=True ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
Public methods (7)
  • create(self, vals_list)
    @api.model_create_multi
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on existing companies when module stock is installed.

New fields (29)
  • annual_inventory_day Integer
    readonly=False related='company_id.annual_inventory_day'
  • annual_inventory_month Selection
    readonly=False related='company_id.annual_inventory_month'
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_lot_print_gs1 Boolean
    implied_group='stock.group_stock_lot_print_gs1' args: 'Print GS1 Barcodes for Lots & Serial Numbers'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_picking_wave Boolean
    help='Group your move operations in wave transfer to process them together' implied_group='stock.group_stock_picking_wave' args: 'Wave Transfers'
  • group_stock_production_lot Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_reception_report Boolean
    implied_group='stock.group_reception_report' args: 'Reception Report'
  • group_stock_sign_delivery Boolean
    implied_group='stock.group_stock_sign_delivery' args: 'Signature'
  • group_stock_storage_categories Boolean
    implied_group='stock.group_stock_storage_categories' args: 'Storage Categories'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_picking_batch Boolean
    args: 'Batch Transfers'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (4)
  • move_id Many2one → stock.move
    args: 'stock.move'
  • next_serial_count Integer
    default=_default_next_serial_count required=True args: 'Number of SN'
  • next_serial_number Char
    required=True args: 'First SN'
  • product_id Many2one → product.product
    related='move_id.product_id' args: 'product.product', 'Product'
Public methods (1)
  • generate_serial_numbers(self)

New fields (3)
  • backorder_confirmation_line_ids One2many → stock.backorder.confirmation.line
    string='Backorder Confirmation Lines' args: 'stock.backorder.confirmation.line', 'backorder_confirmation_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
  • show_transfers Boolean
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
  • process_cancel_backorder(self)

New fields (3)
  • backorder_confirmation_id Many2one → stock.backorder.confirmation
    args: 'stock.backorder.confirmation', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Transfer'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (4)
  • new_quantity Float
    default=1 digits='Product Unit of Measure' help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (2)
  • change_product_qty(self)
    Changes the Product Quantity by creating/editing corresponding quant.
  • check_new_quantity(self)
    @api.constrains('new_quantity')

New fields (3)
  • immediate_transfer_line_ids One2many → stock.immediate.transfer.line
    string='Immediate Transfer Lines' args: 'stock.immediate.transfer.line', 'immediate_transfer_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_transfer_rel'
  • show_transfers Boolean
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (3)
  • immediate_transfer_id Many2one → stock.immediate.transfer
    required=True args: 'stock.immediate.transfer', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking', 'Transfer'
  • to_immediate Boolean
    args: 'To Process'
Public methods (0)

No public methods.

New fields (3)
  • inventory_adjustment_name Char
    default='Quantity Updated'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • show_info Boolean
    args: 'Show warning'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields_list)

New fields (2)
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant', 'stock_conflict_quant_rel'
  • quant_to_fix_ids Many2many → stock.quant
    string='Conflicts' args: 'stock.quant'
Public methods (2)
  • action_keep_counted_quantity(self)
  • action_keep_difference(self)

New fields (1)
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (2)
  • action_reset(self)
  • action_set(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (30)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • child_internal_location_ids Many2many → stock.location
    compute='_compute_child_internal_location_ids' help="This location (if it's internal) and all its descendants filtered by type=Internal." recursive=True string='Internal locations among descendants' args: 'stock.location'
  • comment Html
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True args: 'Full Location Name'
  • cyclic_inventory_frequency Integer
    default=0 help=' When different than 0, inventory count date for products stored at this location will be automatically set at the defined frequency.' args: 'Inventory Frequency (Days)'
  • forecast_weight Float
    compute='_compute_weight' args: 'Forecasted Weight'
  • incoming_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_dest_id'
  • last_inventory_date Date
    help='Date of the last inventory at this location.' readonly=True args: 'Last Effective Inventory'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • net_weight Float
    compute='_compute_weight' args: 'Net Weight'
  • next_inventory_date Date
    compute='_compute_next_inventory_date' help='Date for next planned inventory based on cyclic schedule.' store=True args: 'Next Expected Inventory'
  • outgoing_move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'location_id'
  • parent_path Char
    index=True unaccent=False
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Removal Strategy'
  • replenish_location Boolean
    compute='_compute_replenish_location' copy=False help='Activate this function to get all quantities to replenish at this particular location' readonly=False store=True args: 'Replenish Location'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • storage_category_id Many2one → stock.storage.category
    check_company=True string='Storage Category' args: 'stock.storage.category'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations: this location consumes the components and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit Location')]
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' store=True args: 'stock.warehouse'
  • warehouse_view_ids One2many → stock.warehouse
    readonly=True args: 'stock.warehouse', 'view_location_id'
Public methods (6)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • name_create(self, name)
    @api.model
  • should_bypass_reservation(self)
  • write(self, values)

New fields (12)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • delivery_count Integer
    compute='_compute_delivery_ids' args: 'Delivery order count'
  • delivery_ids Many2many → stock.picking
    compute='_compute_delivery_ids' string='Transfers' args: 'stock.picking'
  • display_complete Boolean
    compute='_compute_display_complete'
  • last_delivery_partner_id Many2one → res.partner
    compute='_compute_last_delivery_partner_id' args: 'res.partner'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' index='trigram' required=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' search='_search_product_qty' args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (6)
  • action_lot_open_quants(self)
  • action_lot_open_transfers(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • generate_lot_names(self, first_lot, count)
    @api.model
    Generate `lot_names` from a string.
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (68)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Scheduled date until move is done, then date of actual move processing' index=True required=True args: 'Date Scheduled'
  • date_deadline Datetime
    copy=False help='Date Promise to the customer on the top level document (SO/PO)' readonly=True args: 'Deadline'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' help='Process at this date to be on time' store=True args: 'Delay Alert Date'
  • description_picking Text
    args: 'Description of Picking'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • display_clear_serial Boolean
    compute='_compute_display_clear_serial'
  • forecast_availability Float
    compute='_compute_forecast_information' compute_sudo=True digits='Product Unit of Measure' args: 'Forecast Availability'
  • forecast_expected_date Datetime
    compute='_compute_forecast_information' compute_sudo=True args: 'Forecasted Expected date'
  • from_immediate_transfer Boolean
    related='picking_id.immediate_transfer'
  • group_id Many2one → procurement.group
    default=_default_group_id index=True args: 'procurement.group', 'Procurement Group'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_inventory Boolean
    args: 'Inventory'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True check_company=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_id Many2one → stock.location
    auto_join=True check_company=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_ids Many2many → stock.lot
    compute='_compute_lot_ids' inverse='_set_lot_ids' readonly=False string='Serial Numbers' args: 'stock.lot'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=['|', ('reserved_qty', '=', 0.0), ('qty_done', '!=', 0.0)] args: 'stock.move.line', 'move_id'
  • move_lines_count Integer
    compute='_compute_move_lines_count'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    required=True args: 'Description'
  • next_serial Char
    args: 'First SN'
  • next_serial_count Integer
    args: 'Number of SN'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    check_company=True index=True args: 'stock.warehouse.orderpoint', 'Original Reordering Rule'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    check_company=True copy=False args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' store=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False args: 'Unit Price'
  • priority Selection
    compute='_compute_priority' default='0' store=True args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    copy=False default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_packaging_id Many2one → product.packaging
    check_company=True domain="[('product_id', '=', product_id)]" args: 'product.packaging', 'Packaging'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.detailed_type'
  • product_uom Many2one → uom.uom
    compute='_compute_product_uom' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'UoM'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity_done Float
    compute='_quantity_done_compute' digits='Product Unit of Measure' inverse='_quantity_done_set' store=True args: 'Quantity Done'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reservation_date Date
    compute='_compute_reservation_date' help='Computes when a move should be reserved' store=True args: 'Date to Reserve'
  • reserved_availability Float
    compute='_compute_reserved_availability' digits='Product Unit of Measure' help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • restrict_partner_id Many2one → res.partner
    check_company=True args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.route
    check_company=True help='Preferred route' args: 'stock.route', 'stock_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'move_id'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_operations Boolean
    related='picking_id.picking_type_id.show_operations'
  • show_reserved_availability Boolean
    compute='_compute_show_reserved_availability' args: 'From Supplier'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • warehouse_id Many2one → stock.warehouse
    help='the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (12)
  • action_assign_serial(self)
    Opens a wizard to assign SN's name on each move lines.
  • action_assign_serial_show_details(self)
    On `self.move_line_ids`, assign `lot_name` according to `self.next_serial` before returning `self.action_show_details`.
  • action_clear_lines_show_details(self)
    Unlink `self.move_line_ids` before returning `self.action_show_details`. Useful for if a user creates too many SNs by accident via action_assign_serial_show_details since there's no way to undo the action.
  • action_open_reference(self)
    Open the form view of the move's reference document, if one exists, otherwise open form view of self
  • action_product_forecast_report(self)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • init(self)
  • name_get(self)
  • unlink(self)
  • write(self, vals)

New fields (38)
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • description_picking Text
    string='Description picking'
  • is_initial_demand_editable Boolean
    related='move_id.is_initial_demand_editable'
  • is_inventory Boolean
    related='move_id.is_inventory'
  • is_locked Boolean
    readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'To'
  • location_dest_usage Selection
    related='location_dest_id.usage' string='Destination Location Type'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage', '!=', 'view')]" precompute=True readonly=False required=True store=True args: 'stock.location', 'From'
  • location_usage Selection
    related='location_id.usage' string='Source Location Type'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" args: 'stock.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True index=True args: 'stock.move', 'Stock Operation'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' args: 'res.partner', 'From Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    check_company=True args: 'stock.package_level', 'Package Level'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    auto_join=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Transfer'
  • picking_partner_id Many2one
    readonly=True related='picking_id.partner_id'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    compute='_compute_picking_type_id' search='_search_picking_type_id' args: 'stock.picking.type', 'Operation type'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_category_name Char
    related='product_id.categ_id.complete_name' store=True string='Product Category'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • qty_done Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Done'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • reserved_qty Float
    compute='_compute_reserved_qty' copy=False digits=0 inverse='_set_reserved_qty' store=True args: 'Real Reserved Quantity'
  • reserved_uom_qty Float
    copy=False default=0.0 digits='Product Unit of Measure' required=True args: 'Reserved'
  • result_package_id Many2one → stock.quant.package
    check_company=True domain="['|', '|', ('location_id', '=', False), ('location_id', '=', location_dest_id), ('id', '=', package_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (6)
  • action_open_reference(self)
  • action_revert_inventory(self)
  • create(self, vals_list)
    @api.model_create_multi
  • init(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • predefined_date Selection
    default='day' string='Snooze for' args: [('day', '1 Day'), ('week', '1 Week'), ('month', '1 Month'), ('custom', 'Custom')]
  • snoozed_until Date
    args: 'Snooze Date'
Public methods (1)
  • action_snooze(self)

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (12)
  • barcode Char
    copy=False args: 'Barcode'
  • base_weight Float
    help='Weight of the package type' string='Weight'
  • company_id Many2one → res.company
    index=True args: 'res.company', 'Company'
  • height Integer
    help='Packaging Height' args: 'Height'
  • length_uom_name Char
    compute='_compute_length_uom_name' default=_get_default_length_uom string='Length unit of measure label'
  • max_weight Float
    help='Maximum weight shippable in this packaging' args: 'Max Weight'
  • name Char
    required=True args: 'Package Type'
  • packaging_length Integer
    help='Packaging Length' args: 'Length'
  • sequence Integer
    default=1 help='The first in the sequence is the default one.' args: 'Sequence'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'package_type_id', 'Storage Category Capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' default=_get_default_weight_uom string='Weight unit of measure label'
  • width Integer
    help='Packaging Width' args: 'Width'
Public methods (1)
  • copy(self, default=None)

New fields (13)
  • company_id Many2one → res.company
    index=True required=True args: 'res.company', 'Company'
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_dest_id' domain="[('id', 'child_of', parent.location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', 'child_of', parent.location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • picking_type_code Selection
    related='picking_id.picking_type_code'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (4)
  • action_show_package_details(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (56)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index='btree_not_null' readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date Datetime
    copy=False default=fields.Datetime.now help='Creation Date, usually the time of the order' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'Creation Date'
  • date_deadline Datetime
    compute='_compute_date_deadline' help='Date Promise to the customer on the top level document (SO/PO)' store=True args: 'Deadline'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • group_id Many2one → procurement.group
    readonly=True related='move_ids.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_deadline_issue Boolean
    compute='_compute_has_deadline_issue' default=False help='Is late or will be late depending on the deadline and scheduled date' store=True args: 'Is late'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • hide_picking_type Boolean
    compute='_compute_hide_pickign_type'
  • immediate_transfer Boolean
    default=False
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • is_signed Boolean
    compute='_compute_is_signed' args: 'Is Signed'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True states={'done': [('readonly', True)]} store=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' precompute=True readonly=False required=True states={'done': [('readonly', True)]} store=True args: 'stock.location', 'Source Location'
  • move_ids One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_ids_without_package One2many → stock.move
    compute='_compute_move_without_package' compute_sudo=True inverse='_set_move_without_package' string='Stock moves not in package' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=['|', ('reserved_qty', '=', 0.0), '&', ('reserved_qty', '!=', 0.0), ('qty_done', '!=', 0.0)] args: 'stock.move.line', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index='trigram' readonly=True args: 'Reference'
  • note Html
    args: 'Notes'
  • origin Char
    help='Reference of the document' index='trigram' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Assign Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Contact'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code'
  • picking_type_entire_packs Boolean
    related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    index=True readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    default='0' help='Products will be reserved first for the transfers with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_ids.product_id' args: 'product.product', 'Product'
  • products_availability Char
    compute='_compute_products_availability' help='Latest product availability status of the picking' string='Product Availability'
  • products_availability_state Selection
    compute='_compute_products_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True tracking=True args: 'Scheduled Date'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the button "Check Availability" should be displayed.'
  • show_clear_qty_button Boolean
    compute='_compute_show_qty_button'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_mark_as_todo Boolean
    compute='_compute_show_mark_as_todo' help='Technical field used to compute whether the button "Mark as Todo" should be displayed.'
  • show_operations Boolean
    compute='_compute_show_operations'
  • show_reserved Boolean
    related='picking_type_id.show_reserved'
  • show_set_qty_button Boolean
    compute='_compute_show_qty_button'
  • show_validate Boolean
    compute='_compute_show_validate' help='Technical field used to decide whether the button "Validate" should be displayed.'
  • signature Image
    attachment=True copy=False help='Signature' args: 'Signature'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • use_existing_lots Boolean
    related='picking_type_id.use_existing_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'res.users', 'Responsible'
Public methods (22)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_cancel(self)
  • action_clear_quantities_to_zero(self)
  • action_confirm(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_picking_move_tree(self)
  • action_put_in_pack(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_set_quantities_to_reservation(self)
  • action_toggle_is_locked(self)
  • action_view_reception_report(self)
  • button_scrap(self)
  • button_validate(self)
  • create(self, vals_list)
    @api.model_create_multi
  • do_print_picking(self)
  • do_unreserve(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • should_print_delivery_address(self)
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (31)
  • active Boolean
    default=True args: 'Active'
  • auto_show_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically show the reception report (if there are moves to allocate to) when validating.' args: 'Show Reception Report at Validation'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    default='incoming' required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • create_backorder Selection
    default='ask' help='When validating a transfer:\n * Ask: users are asked to choose if they want to make a backorder for remaining products\n * Always: a backorder is automatically created for the remaining products\n * Never: remaining products are cancelled' required=True args: [('ask', 'Ask'), ('always', 'Always'), ('never', 'Never')], 'Create Backorder'
  • default_location_dest_id Many2one → stock.location
    check_company=True help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    check_company=True help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • hide_reservation_method Boolean
    compute='_compute_hide_reservation_method'
  • name Char
    required=True translate=True args: 'Operation Type'
  • print_label Boolean
    help='If this checkbox is ticked, label will be print in this operation.' args: 'Print Label'
  • reservation_days_before Integer
    help='Maximum number of days before scheduled date that products should be reserved.' args: 'Days'
  • reservation_days_before_priority Integer
    help='Maximum number of days before scheduled date that priority picking products should be reserved.' args: 'Days when starred'
  • reservation_method Selection
    default='at_confirm' help='How products in transfers of this operation type should be reserved.' required=True args: [('at_confirm', 'At Confirmation'), ('manual', 'Manually'), ('by_date', 'Before scheduled date')], 'Reservation Method'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Sequence Prefix'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=_default_show_operations help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_reserved Boolean
    default=True help='If this checkbox is ticked, Odoo will automatically pre-fill the detailed operations with the corresponding products, locations and lot/serial numbers.' args: 'Pre-fill Detailed Operations'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' ondelete='cascade' readonly=False store=True args: 'stock.warehouse', 'Warehouse'
Public methods (10)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_action_picking_type_operations(self)
  • get_stock_picking_action_picking_type(self)
  • name_get(self)
    Display 'Warehouse_name: PickingType_name'
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True args: 'Active'
  • category_id Many2one → product.category
    default=_default_category_id domain=_domain_category_id ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to sublocation'
  • package_type_ids Many2many → stock.package.type
    check_company=True string='Package Type' args: 'stock.package.type'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain=_domain_product_id ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
  • storage_category_id Many2one → stock.storage.category
    check_company=True ondelete='cascade' args: 'stock.storage.category', 'Storage Category'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (28)
  • available_quantity Float
    compute='_compute_available_quantity' digits='Product Unit of Measure' help="On hand quantity which hasn't been reserved on a transfer, in the default unit of measure of the product" args: 'Available Quantity'
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • cyclic_inventory_frequency Integer
    related='location_id.cyclic_inventory_frequency'
  • in_date Datetime
    default=fields.Datetime.now readonly=True required=True args: 'Incoming Date'
  • inventory_date Date
    compute='_compute_inventory_date' help='Next date the On Hand Quantity should be counted.' readonly=False store=True args: 'Scheduled Date'
  • inventory_diff_quantity Float
    compute='_compute_inventory_diff_quantity' digits='Product Unit of Measure' help="Indicates the gap between the product's theoretical quantity and its counted quantity." readonly=True store=True args: 'Difference'
  • inventory_quantity Float
    digits='Product Unit of Measure' help="The product's counted quantity." args: 'Counted Quantity'
  • inventory_quantity_auto_apply Float
    compute='_compute_inventory_quantity_auto_apply' digits='Product Unit of Measure' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • inventory_quantity_set Boolean
    compute='_compute_inventory_quantity_set' default=False readonly=False store=True
  • is_outdated Boolean
    compute='_compute_is_outdated' args: 'Quantity has been moved since last count'
  • last_count_date Date
    compute='_compute_last_count_date' help='Last time the Quantity was Updated'
  • location_id Many2one → stock.location
    auto_join=True check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.lot
    check_company=True domain=<expr> index=True ondelete='restrict' args: 'stock.lot', 'Lot/Serial Number'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" help='The package containing this quant' index=True ondelete='restrict' args: 'stock.quant.package', 'Package'
  • priority Selection
    related='product_tmpl_id.priority'
  • product_categ_id Many2one
    related='product_tmpl_id.categ_id'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    digits='Product Unit of Measure' help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 digits='Product Unit of Measure' help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • sn_duplicated Boolean
    compute='_compute_sn_duplicated' help='If the same SN is in another Quant' string='Duplicated Serial Number'
  • storage_category_id Many2one
    related='location_id.storage_category_id' store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
  • user_id Many2one → res.users
    domain=<expr> help='User assigned to do product count.' args: 'res.users', 'Assigned To'
  • warehouse_id Many2one → stock.warehouse
    related='location_id.warehouse_id' args: 'stock.warehouse'
Public methods (17)
  • action_apply_inventory(self)
  • action_inventory_history(self)
  • action_reset(self)
  • action_set_inventory_quantity(self)
  • action_set_inventory_quantity_to_zero(self)
  • action_view_inventory(self)
    @api.model
    Similar to _get_quants_action except specific for inventory adjustments (i.e. inventory counts).
  • action_view_orderpoints(self)
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • action_warning_duplicated_sn(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
    @api.constrains('quantity')
  • create(self, vals_list)
    @api.model_create_multi
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • get_import_templates(self)
    @api.model
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Override to set the `inventory_quantity` field if we're in "inventory mode" as well as to compute the sum of the `available_quantity` field.
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (9)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index='trigram' required=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' compute_sudo=True index='btree_not_null' readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • pack_date Date
    default=fields.Date.today args: 'Pack Date'
  • package_type_id Many2one → stock.package.type
    index=True args: 'stock.package.type', 'Package Type'
  • package_use Selection
    default='disposable' help="Reusable boxes are used for batch picking and emptied afterwards to be reused. In the barcode application, scanning a reusable box will add the products in this box.\n Disposable boxes aren't reused, when scanning a disposable box in the barcode application, the contained products are added to the transfer." required=True string='Package Use' args: [('disposable', 'Disposable Box'), ('reusable', 'Reusable Box')]
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
  • valid_sscc Boolean
    compute='_compute_valid_sscc' args: 'Package name is valid SSCC'
Public methods (2)
  • action_view_picking(self)
  • unpack(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (7)
  • json_lead_days Char
    compute='_compute_json_lead_days'
  • json_replenishment_history Char
    compute='_compute_json_replenishment_history'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • product_id Many2one → product.product
    related='orderpoint_id.product_id' args: 'product.product'
  • qty_to_order Float
    related='orderpoint_id.qty_to_order'
  • warehouseinfo_ids One2many
    related='orderpoint_id.warehouse_id.resupply_route_ids'
  • wh_replenishment_option_ids One2many → stock.replenishment.option
    compute='_compute_wh_replenishment_options' args: 'stock.replenishment.option', 'replenishment_info_id'
Public methods (0)

No public methods.

New fields (10)
  • free_qty Float
    compute='_compute_free_qty'
  • lead_time Char
    compute='_compute_lead_time'
  • location_id Many2one → stock.location
    related='warehouse_id.lot_stock_id' args: 'stock.location'
  • product_id Many2one → product.product
    args: 'product.product'
  • qty_to_order Float
    related='replenishment_info_id.qty_to_order'
  • replenishment_info_id Many2one → stock.replenishment.info
    args: 'stock.replenishment.info'
  • route_id Many2one → stock.route
    args: 'stock.route'
  • uom Char
    related='product_id.uom_name'
  • warehouse_id Many2one → stock.warehouse
    related='route_id.supplier_wh_id' args: 'stock.warehouse'
  • warning_message Char
    compute='_compute_warning_message'
Public methods (3)
  • order_all(self)
  • order_avbl(self)
  • select_route(self)

New fields (4)
  • inventory_date Date
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' required=True args: 'Inventory Date'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • set_count Selection
    default='empty' string='Count' args: [('empty', 'Leave Empty'), ('set', 'Set Current Value')]
  • user_id Many2one → res.users
    domain=<expr> string='User' args: 'res.users'
Public methods (1)
  • action_request_count(self)

New fields (7)
  • company_id Many2one
    related='picking_id.company_id'
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (16)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • packaging_ids Many2many → product.packaging
    check_company=True copy=False args: 'product.packaging', 'stock_route_packaging', 'route_id', 'packaging_id', 'Packagings'
  • packaging_selectable Boolean
    help='When checked, the route will be selectable on the Product Packaging.' args: 'Applicable on Packaging'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (1)
  • toggle_active(self)

New fields (23)
  • action Selection
    default='pull' index=True required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> domain="[('id', '=?', route_company_id)]" args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this lead time.' args: 'Lead Time'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_dest_id Many2one → stock.location
    check_company=True index=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True index=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_code_domain Char
    compute='_compute_picking_type_code_domain'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=?', picking_type_code_domain)]" required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_carrier Boolean
    default=False help='When ticked, carrier of shipment will be propagated.' args: 'Propagation of carrier'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_company_id Many2one
    related='route_id.company_id' string='Route Company'
  • route_id Many2one → stock.route
    index=True ondelete='cascade' required=True args: 'stock.route', 'Route'
  • route_sequence Integer
    compute_sudo=True related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True args: 'stock.warehouse', 'Warehouse'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (17)
  • company_id Many2one → res.company
    default=<expr> required=True states={'done': [('readonly', True)]} string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True default=_get_default_location_id domain="[('usage', '=', 'internal'), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" states={'done': [('readonly', True)]} args: 'stock.lot', 'Lot/Serial'
  • move_id Many2one → stock.move
    check_company=True copy=False readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    check_company=True default=_get_default_scrap_location_id domain="[('scrap_location', '=', True), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    compute='_compute_scrap_qty' digits='Product Unit of Measure' precompute=True readonly=False required=True states={'done': [('readonly', True)]} store=True args: 'Quantity'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' string='Product Tracking'
Public methods (6)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • create(self, vals_list)
    @api.model_create_multi
  • do_scrap(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • allow_new_product Selection
    default='mixed' required=True args: [('empty', 'If the location is empty'), ('same', 'If all products are same'), ('mixed', 'Allow mixed products')]
  • capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'storage_category_id'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • location_ids One2many → stock.location
    args: 'stock.location', 'storage_category_id'
  • max_weight Float
    digits='Stock Weight' args: 'Max Weight'
  • name Char
    required=True args: 'Storage Category'
  • package_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • product_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' string='Weight unit'
Public methods (1)
  • copy(self, default=None)

New fields (6)
  • company_id Many2one → res.company
    related='storage_category_id.company_id' args: 'res.company', 'Company'
  • package_type_id Many2one → stock.package.type
    check_company=True ondelete='cascade' args: 'stock.package.type', 'Package Type'
  • product_id Many2one → product.product
    check_company=True domain=<expr> ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_id Many2one
    related='product_id.uom_id'
  • quantity Float
    required=True args: 'Quantity'
  • storage_category_id Many2one → stock.storage.category
    index=True ondelete='cascade' required=True args: 'stock.storage.category'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • get_html(self, given_context=None)
    @api.model
  • get_lines(self, line_id=False, **kw)
    @api.model
  • get_pdf(self, line_data=None)
  • get_pdf_lines(self, line_data=[])

New fields (3)
  • product_ids Many2many → product.product
    string='Products' args: 'product.product'
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)

New fields (4)
  • product_display_name Char
    compute='_compute_display_name' readonly=True args: 'Name'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    related='product_id.tracking'
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (27)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.route
    ondelete='restrict' args: 'stock.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.route
    ondelete='restrict' args: 'stock.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver goods directly (1 step)'), ('pick_ship', 'Send goods in output and then deliver (2 steps)'), ('pick_pack_ship', 'Pack goods, send goods in output and then deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'MTO rule'
  • name Char
    default=_default_name required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.route
    ondelete='restrict' args: 'stock.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly (1 step)'), ('two_steps', 'Receive goods in input and then stock (2 steps)'), ('three_steps', 'Receive goods in input, then quality and then stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • return_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Return Type'
  • route_ids Many2many → stock.route
    check_company=True domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
Public methods (7)
  • action_view_all_routes(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_resupply_routes(self, supplier_warehouses)
  • get_current_warehouses(self)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (25)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • days_to_order Float
    compute='_compute_days_to_order' help='Numbers of days in advance that replenishments demands are created.'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days_date Date
    compute='_compute_lead_days'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_category_id Many2one → product.category
    name='Product Category' related='product_id.categ_id' store=True args: 'product.category'
  • product_id Many2one → product.product
    check_company=True domain=<expr> ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Max Quantity'
  • product_min_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_forecast Float
    compute='_compute_qty' digits='Product Unit of Measure' readonly=True args: 'Forecast'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Multiple Quantity'
  • qty_on_hand Float
    compute='_compute_qty' digits='Product Unit of Measure' readonly=True args: 'On Hand'
  • qty_to_order Float
    compute='_compute_qty_to_order' digits='Product Unit of Measure' readonly=False store=True args: 'To Order'
  • route_id Many2one → stock.route
    domain="[('product_selectable', '=', True)]" string='Preferred Route' args: 'stock.route'
  • rule_ids Many2many → stock.rule
    compute='_compute_rules' string='Rules used' args: 'stock.rule'
  • snoozed_until Date
    help='Hidden until next scheduler.' args: 'Snoozed'
  • trigger Selection
    default='auto' required=True string='Trigger' args: [('auto', 'Auto'), ('manual', 'Manual')]
  • visibility_days Float
    compute='_compute_visibility_days' help='Consider product forecast these many days in the future upon product replenishment, set to 0 for just-in-time.\nThe value depends on the type of the route (Buy or Manufacture)' inverse='_set_visibility_days' readonly=False
  • warehouse_id Many2one → stock.warehouse
    check_company=True compute='_compute_warehouse_id' index=True ondelete='cascade' precompute=True readonly=False required=True store=True args: 'stock.warehouse', 'Warehouse'
Public methods (7)
  • action_open_orderpoints(self)
    @api.model
  • action_product_forecast_report(self)
  • action_replenish(self)
  • action_replenish_auto(self)
  • action_stock_replenishment_info(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_uom_name Char
    required=True args: 'Unit of Measure'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
  • quantity Float
    required=True string='Quantity'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Atul Patel, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Barad Mahendra, Wolfgang Taferner, Yannick Tivisse, Dharmraj Jhala, Romain Derie, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Arnold Moyaux, mreficent, Julien Castiaux, Xavier-Do, Denis Roussel, Romeo Fragomeli, Carlos Dauden, Victor Feyens, Andrea Grazioso (agr-odoo), Fanny He, William Henrotin, Sébastien Theys, alt-odoo, Florent de Labarre, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Luis González, Alvaro Fuentes, Achraf (abz), Adrien Widart, Ivan Yelizariev, Hubert (huvw), Nasreddin Boulif (bon), Touati Djamel (otd), Nicolas Galler, nie, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Rémy Voet (ryv), Ivàn Todorovich, Gorash, Mathieu Duckerts-Antoine, snd, Hoang Tran, Aurélien (avd), Kevin Baptiste, Pratima Gupta, Ashmawy Walid (was), Richard deMeester, roen-odoo, Hubert Van de Walle (huvw), Hardik Prajapati, Miquel Raïch, Laurent Desausoi (lade), momegahed, Bruno-brsy, william-andre, Víctor Martínez, Florian Damhaut, Sébastien Alix, Merlin (megu), MerlinGuillaume, guimarc-br, David (dafr), JF Aubert, PNO, Ankita Raval, yhu-odoo, nouraellm, mafo-odoo, Nshimiyimana Séna, Walid HANNICHE (waha), Yolann Sabaux, Abdelouahab (abla), Swapnesh, Nicolas Bayet, Jinjiu Liu, Aurelien van Delft (avd), Michael Mattiello (mcm), Mathieu Walravens, Achraf, dht-odoo, niyasraphy, Florian da Costa, Alfredo Zamora, Habib (ayh), Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Walid, Mylyna Hy, Adrien Widart (awt), nda, althaf shaik, Victor Piryns (pivi), Mahamadasif Ansari, Saurabh Mishra, Paimon, clesgow, Daniel Kosky (dako), Michele, Jeremy Cormier, Djamel Touati, Pieter Claeys (clpi), Andrew Gavgavian, Nicolas Pierre, Bruno Boi, ノウラ, Piero (pca), paso-odoo, bram1000, Ahmed Khalaf, jlzhou, Nguyễn Đại Dương, Noe Antoine, Andrzej(pian), Dang Van Loc, Mattis Megevand, OmarAbosamaha, Charles Ferir, Eteil Djoumatchoua(etdj), Nimesh Parmar, Eduardo De Miguel, boan-odoo, BernatPForgeFlow, alcl-odoo, boan, Ethan Vincent, Mathieu (mcou), lase@odoo.com, Benjamin Hanquin (beha), InCeyN, Quentin Wolfs, Aurelien MARIE (auma), bary, debu-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/inventory
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:26
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - 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 (158)
XML IDNameModelTypeStatus
exception_on_picking exception_on_picking ir.ui.view qweb New
inventory_warning_reset_view inventory.reset.warning.view stock.inventory.warning form New
inventory_warning_set_view inventory.set.warning.view stock.inventory.warning form New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_packaging_view label_product_packaging_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_edit_view Package Level stock.package_level xpath Inherits stock.package_level_form_view
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level Tree Picking stock.package_level tree New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_label_layout_form_picking product.label.layout.form product.label.layout xpath Inherits product.product_label_layout_form
product_packaging_form_view product.packaging.form.view.stock product.packaging xpath Inherits product.product_packaging_form_view
product_packaging_tree_view product.packaging.tree.view.stock product.packaging xpath Inherits product.product_packaging_tree_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product header Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_generic_barcode report_generic_barcode ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_mrp_line report_mrp_line ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_product_product_replenishment report_product_product_replenishment ir.ui.view qweb New
report_product_template_replenishment report_product_template_replenishment ir.ui.view qweb New
report_reception report_reception ir.ui.view qweb New
report_reception_body report_reception_body ir.ui.view qweb New
report_reception_report_label report_reception_report_label ir.ui.view qweb New
report_replenishment_header report_replenishment_header ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory report_stock_inventory ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_inventory_adjustment_name_form_view stock.inventory.adjustment.name.form.view stock.inventory.adjustment.name form New
stock_inventory_conflict_form_view stock.inventory.conflict.form.view stock.inventory.conflict form New
stock_inventory_request_count_form_view stock.request.count.form.view stock.request.count form New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_location_route_view_search stock.location.route.search stock.location.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_package_type_form stock.package.type.form stock.package.type form New
stock_package_type_tree stock.package.type.tree stock.package.type tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_putaway_list stock.putaway.rule.tree stock.putaway.rule tree New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_reorder_report_search stock.warehouse.orderpoint.reorder.search stock.warehouse.orderpoint search New
stock_report_delivery_aggregated_move_lines stock_report_delivery_aggregated_move_lines ir.ui.view qweb New
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb New
stock_report_delivery_no_package_section_line stock_report_delivery_no_package_section_line ir.ui.view qweb New
stock_report_delivery_package_section_line stock_report_delivery_package_section_line ir.ui.view qweb New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_report_view_search report.stock.quantity.search report.stock.quantity search New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_storage_category_capacity_tree stock.storage.category.capacity.tree stock.storage.category.capacity tree New
stock_storage_category_form stock.storage.category.form stock.storage.category form New
stock_storage_category_tree stock.storage.category.tree stock.storage.category tree New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_assign_serial_numbers stock_assign_serial_numbers stock.assign.serial form New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_line_tree_detailed stock.move.line.tree.detailed stock.move.line tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_move_line_detailed_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_nosuggest_operations stock.move.operations.nosuggest.form stock.move field Inherits stock.view_stock_move_operations
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_orderpoint_snooze Stock Orderpoint Snooze stock.orderpoint.snooze form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template field Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product field Inherits product.product_product_tree_view
view_stock_quant_form_editable stock.quant.form.editable stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_quant_tree_editable stock.quant.tree.editable stock.quant tree New
view_stock_quant_tree_inventory_editable stock.quant.inventory.tree.editable stock.quant tree New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_replenishment_info Stock Replenishment Information stock.replenishment.info form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.tree stock.rule tree New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree_editable stock.warehouse.orderpoint.tree.editable stock.warehouse.orderpoint tree New
view_warehouse_orderpoint_tree_editable_config stock.warehouse.orderpoint.tree.editable.config stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (71)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'location': 'set default', 'lot': 'set default', 'package': 'set default'} selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (4)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
  • stock_move_ids One2many → stock.move
    string='Related Stock Moves' args: 'stock.move', 'group_id'
Public methods (2)
  • run(self, procurements, raise_user_error=True)
    @api.model
    Fulfil `procurements` with the help of stock rules. Procurements are needs of products at a certain location. To fulfil these needs, we need to create some sort of documents (`stock.move` by default, but extensions of `_run_` methods allow to create every type of documents). :param procurements: the description of the procurement :type list: list of `~odoo.addons.stock.models.stock_rule.ProcurementGroup.Procurement` :param raise_user_error: will raise either an UserError or a ProcurementException :type raise_user_error: boolan, optional :raises UserError: if `raise_user_error` is True and a procurement isn't fulfillable :raises ProcurementException: if `raise_user_error` is False and a procurement isn't fulfillable
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (5)
  • packaging_reserve_method Selection
    default='partial' help='Reserve Only Full Packagings: will not reserve partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then only 1000 will be reserved\nReserve Partial Packagings: allow reserving partial packagings. If customer orders 2 pallets of 1000 units each and you only have 1600 in stock, then 1600 will be reserved' string='Reserve Packagings' args: [('full', 'Reserve Only Full Packagings'), ('partial', 'Reserve Partial Packagings')]
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.location.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.location.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.location.route'
Public methods (0)

No public methods.

New fields (3)
  • move_line_ids Many2many → stock.move.line
    args: 'stock.move.line'
  • picking_quantity Selection
    default='custom' required=True string='Quantity to print' args: [('picking', 'Transfer Quantities'), ('custom', 'Custom')]
  • print_format Selection
    ondelete={'zpl': 'set default', 'zplxprice': 'set default'} selection_add=[('zpl', 'ZPL Labels'), ('zplxprice', 'ZPL Labels with price')]
Public methods (0)

No public methods.

New fields (2)
  • package_type_id Many2one → stock.package.type
    args: 'stock.package.type', 'Package Type'
  • route_ids Many2many → stock.location.route
    domain=[('packaging_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product in this packaging: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.location.route', 'stock_location_route_packaging', 'packaging_id', 'route_id', 'Routes'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (17)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • stock_move_ids One2many → stock.move
    help='Technical: used to compute quantities.' args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    help='Technical: used to compute quantities.' args: 'stock.quant', 'product_id'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    args: 'stock.storage.category.capacity', 'product_id', 'Storage Category Capacity'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecasted Quantity'
Public methods (15)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_components(self)
  • get_theoretical_quantity(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, to_uom=None)
    @api.model
  • onchange_tracking(self)
    @api.onchange('tracking')
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (10)
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    help='Date at which the replenishment should take place.' required=True args: 'Scheduled Date'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unit of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • route_ids Many2many → stock.location.route
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help="Apply specific route(s) for the replenishment instead of product's default routes." string='Preferred Routes' args: 'stock.location.route'
  • warehouse_id Many2one → stock.warehouse
    domain="[('company_id', '=', company_id)]" required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (26)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • detailed_type Selection
    ondelete={'product': 'set consu'} selection_add=[('product', 'Storable Product')] tracking=True
  • has_available_route_ids Boolean
    compute='_compute_has_available_route_ids' default=<expr> args: 'Routes can be selected on this product'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_moves_in Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of incoming stock moves in the past 12 months'
  • nbr_moves_out Integer
    compute='_compute_nbr_moves' compute_sudo=False help='Number of outgoing stock moves in the past 12 months'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' related_sudo=False relation='stock.location.route' string='Category Routes'
  • route_ids Many2many → stock.location.route
    depends_context=['company', 'allowed_companies'] domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • show_forecasted_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_qty_status_button'
  • tracking Selection
    compute='_compute_tracking' default='none' help='Ensure the traceability of a storable product in your warehouse.' readonly=False required=True store=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    ondelete={'product': 'set consu'} selection_add=[('product', 'Storable Product')]
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (12)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_open_routes_diagram(self)
  • action_product_tmpl_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • action_view_storage_category_capacity(self)
  • copy(self, default=None)
  • onchange_tracking(self)
    @api.onchange('tracking')
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (1)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse

New fields (0)

No new fields.

Public methods (1)
  • get_warehouses(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • action_assign(self, move_ids, qtys, in_ids)
    Assign picking move(s) [i.e. link] to other moves (i.e. make them MTO) :param move_id ids: the ids of the moves to make MTO :param qtys list: the quantities that are being assigned to the move_ids (in same order as move_ids) :param in_ids ids: the ids of the moves that are to be assigned to move_ids
  • action_unassign(self, move_id, qty, in_ids)
    Unassign moves [i.e. unlink] from a move (i.e. make non-MTO) :param move_id id: the id of the move to make non-MTO :param qty float: the total quantity that is being unassigned from move_id :param in_ids ids: the ids of the moves that are to be unassigned from move_id

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • annual_inventory_day Integer
    default=31 help='Day of the month when the annual inventory should occur. If zero or negative, then the first day of the month will be selected instead.\n If greater than the last day of a month, then the last day of the month will be selected instead.' string='Day of the month'
  • annual_inventory_month Selection
    default='12' help='Annual inventory month for products not in a location with a cyclic inventory date. Set to no month if no automatic annual inventory.' string='Annual Inventory Month' args: [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')]
  • internal_transit_location_id Many2one → stock.location
    check_company=True help='Technical field used for resupply routes between warehouses that belong to this company' ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
Public methods (7)
  • create(self, vals)
    @api.model
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on existing companies when module stock is installed.

New fields (29)
  • annual_inventory_day Integer
    readonly=False related='company_id.annual_inventory_day'
  • annual_inventory_month Selection
    readonly=False related='company_id.annual_inventory_month'
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_auto_reception_report Boolean
    implied_group='stock.group_auto_reception_report' args: 'Show Reception Report at Validation'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_picking_wave Boolean
    help='Group your move operations in wave transfer to process them together' implied_group='stock.group_stock_picking_wave' args: 'Wave Transfers'
  • group_stock_production_lot Boolean
    implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_reception_report Boolean
    implied_group='stock.group_reception_report' args: 'Reception Report'
  • group_stock_sign_delivery Boolean
    implied_group='stock.group_stock_sign_delivery' args: 'Signature'
  • group_stock_storage_categories Boolean
    implied_group='stock.group_stock_storage_categories' args: 'Storage Categories'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_picking_batch Boolean
    args: 'Batch Transfers'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • stock_mail_confirmation_template_id Many2one
    readonly=False related='company_id.stock_mail_confirmation_template_id'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (4)
  • move_id Many2one → stock.move
    args: 'stock.move'
  • next_serial_count Integer
    default=_default_next_serial_count required=True args: 'Number of SN'
  • next_serial_number Char
    required=True args: 'First SN'
  • product_id Many2one → product.product
    related='move_id.product_id' args: 'product.product', 'Product'
Public methods (1)
  • generate_serial_numbers(self)

New fields (3)
  • backorder_confirmation_line_ids One2many → stock.backorder.confirmation.line
    string='Backorder Confirmation Lines' args: 'stock.backorder.confirmation.line', 'backorder_confirmation_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
  • show_transfers Boolean
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
  • process_cancel_backorder(self)

New fields (3)
  • backorder_confirmation_id Many2one → stock.backorder.confirmation
    args: 'stock.backorder.confirmation', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Transfer'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (4)
  • new_quantity Float
    default=1 digits='Product Unit of Measure' help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (2)
  • change_product_qty(self)
    Changes the Product Quantity by creating/editing corresponding quant.
  • check_new_quantity(self)
    @api.constrains('new_quantity')

New fields (3)
  • immediate_transfer_line_ids One2many → stock.immediate.transfer.line
    string='Immediate Transfer Lines' args: 'stock.immediate.transfer.line', 'immediate_transfer_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_transfer_rel'
  • show_transfers Boolean
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (3)
  • immediate_transfer_id Many2one → stock.immediate.transfer
    required=True args: 'stock.immediate.transfer', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking', 'Transfer'
  • to_immediate Boolean
    args: 'To Process'
Public methods (0)

No public methods.

New fields (3)
  • inventory_adjustment_name Char
    default=_default_inventory_adjustment_name
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • show_info Boolean
    args: 'Show warning'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields_list)

New fields (2)
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant', 'stock_conflict_quant_rel'
  • quant_to_fix_ids Many2many → stock.quant
    string='Conflicts' args: 'stock.quant'
Public methods (2)
  • action_keep_counted_quantity(self)
  • action_keep_difference(self)

New fields (1)
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
Public methods (2)
  • action_reset(self)
  • action_set(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (29)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • child_internal_location_ids Many2many → stock.location
    compute='_compute_child_internal_location_ids' help="This location (if it's internal) and all its descendants filtered by type=Internal." recursive=True string='Internal locations amoung descendants' args: 'stock.location'
  • comment Html
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True args: 'Full Location Name'
  • cyclic_inventory_frequency Integer
    default=0 help=' When different than 0, inventory count date for products stored at this location will be automatically set at the defined frequency.' args: 'Inventory Frequency (Days)'
  • forecast_weight Float
    compute='_compute_weight' args: 'Forecasted Weight'
  • incoming_move_line_ids One2many → stock.move.line
    help='Technical: used to compute weight.' args: 'stock.move.line', 'location_dest_id'
  • last_inventory_date Date
    help='Date of the last inventory at this location.' readonly=True args: 'Last Effective Inventory'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • net_weight Float
    compute='_compute_weight' args: 'Net Weight'
  • next_inventory_date Date
    compute='_compute_next_inventory_date' help='Date for next planned inventory based on cyclic schedule.' store=True args: 'Next Expected Inventory'
  • outgoing_move_line_ids One2many → stock.move.line
    help='Technical: used to compute weight.' args: 'stock.move.line', 'location_id'
  • parent_path Char
    index=True
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.\n\nFIFO: products/lots that were stocked first will be moved out first.\nLIFO: products/lots that were stocked last will be moved out first.\nCloset location: products/lots closest to the target location will be moved out first.\nFEFO: products/lots with the closest removal date will be moved out first (the availability of this method depends on the "Expiration Dates" setting).' args: 'product.removal', 'Removal Strategy'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • storage_category_id Many2one → stock.storage.category
    check_company=True string='Storage Category' args: 'stock.storage.category'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations: this location consumes the components and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit Location')]
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' args: 'stock.warehouse'
  • warehouse_view_ids One2many → stock.warehouse
    readonly=True args: 'stock.warehouse', 'view_location_id'
Public methods (5)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • name_create(self, name)
    @api.model
  • should_bypass_reservation(self)
  • write(self, values)

New fields (16)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_location_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • packaging_ids Many2many → product.packaging
    check_company=True copy=False args: 'product.packaging', 'stock_location_route_packaging', 'route_id', 'packaging_id', 'Packagings'
  • packaging_selectable Boolean
    help='When checked, the route will be selectable on the Product Packaging.' args: 'Applicable on Packaging'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (1)
  • toggle_active(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (65)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Scheduled date until move is done, then date of actual move processing' index=True required=True args: 'Date Scheduled'
  • date_deadline Datetime
    help='Date Promise to the customer on the top level document (SO/PO)' readonly=True args: 'Deadline'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' help='Process at this date to be on time' store=True args: 'Delay Alert Date'
  • description_picking Text
    args: 'Description of Picking'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • forecast_availability Float
    compute='_compute_forecast_information' compute_sudo=True digits='Product Unit of Measure' args: 'Forecast Availability'
  • forecast_expected_date Datetime
    compute='_compute_forecast_information' compute_sudo=True args: 'Forecasted Expected date'
  • from_immediate_transfer Boolean
    related='picking_id.immediate_transfer'
  • group_id Many2one → procurement.group
    default=_default_group_id index=True args: 'procurement.group', 'Procurement Group'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_inventory Boolean
    args: 'Inventory'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True check_company=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    auto_join=True check_company=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • lot_ids Many2many → stock.production.lot
    compute='_compute_lot_ids' inverse='_set_lot_ids' readonly=False string='Serial Numbers' args: 'stock.production.lot'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=['|', ('product_qty', '=', 0.0), ('qty_done', '!=', 0.0)] args: 'stock.move.line', 'move_id'
  • move_lines_count Integer
    compute='_compute_move_lines_count'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    required=True args: 'Description'
  • next_serial Char
    args: 'First SN'
  • next_serial_count Integer
    args: 'Number of SN'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    check_company=True index=True args: 'stock.warehouse.orderpoint', 'Original Reordering Rule'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    check_company=True copy=False args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' store=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom." args: 'Unit Price'
  • priority Selection
    compute='_compute_priority' default='0' store=True args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    copy=False default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_packaging_id Many2one → product.packaging
    check_company=True domain="[('product_id', '=', product_id)]" args: 'product.packaging', 'Packaging'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    help='Technical: used in views' related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.detailed_type'
  • product_uom Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True args: 'uom.uom', 'UoM'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity_done Float
    compute='_quantity_done_compute' digits='Product Unit of Measure' inverse='_quantity_done_set' args: 'Quantity Done'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reservation_date Date
    compute='_compute_reservation_date' help='This is a technical field for calculating when a move should be reserved' store=True args: 'Date to Reserve'
  • reserved_availability Float
    compute='_compute_reserved_availability' digits='Product Unit of Measure' help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • restrict_partner_id Many2one → res.partner
    check_company=True help="Technical field used to depict a restriction on the ownership of quants to consider when marking this move as 'done'" args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.location.route
    check_company=True help='Preferred route' args: 'stock.location.route', 'stock_location_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'move_id'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_operations Boolean
    related='picking_id.picking_type_id.show_operations'
  • show_reserved_availability Boolean
    compute='_compute_show_reserved_availability' args: 'From Supplier'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • warehouse_id Many2one → stock.warehouse
    help='Technical field depicting the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_assign_serial(self)
    Opens a wizard to assign SN's name on each move lines.
  • action_assign_serial_show_details(self)
    On `self.move_line_ids`, assign `lot_name` according to `self.next_serial` before returning `self.action_show_details`.
  • action_clear_lines_show_details(self)
    Unlink `self.move_line_ids` before returning `self.action_show_details`. Useful for if a user creates too many SNs by accident via action_assign_serial_show_details since there's no way to undo the action.
  • action_product_forecast_report(self)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • init(self)
  • name_get(self)
  • unlink(self)
  • write(self, vals)

New fields (35)
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    help='Technical link to see who consumed what. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • description_picking Text
    string='Description picking'
  • is_initial_demand_editable Boolean
    related='move_id.is_initial_demand_editable'
  • is_inventory Boolean
    related='move_id.is_inventory'
  • is_locked Boolean
    readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('usage', '!=', 'view')]" required=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True domain="[('usage', '!=', 'view')]" required=True args: 'stock.location', 'From'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True help='Change to a better name' index=True args: 'stock.move', 'Stock Move'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' args: 'res.partner', 'From Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    check_company=True args: 'stock.package_level', 'Package Level'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    auto_join=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Transfer'
  • picking_partner_id Many2one
    readonly=True related='picking_id.partner_id'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    compute='_compute_picking_type_id' search='_search_picking_type_id' args: 'stock.picking.type', 'Operation type'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    help='Technical link to see which line was produced with this. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=False digits=0 inverse='_set_product_qty' store=True args: 'Real Reserved Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    copy=False default=0.0 digits='Product Unit of Measure' required=True args: 'Reserved'
  • qty_done Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Done'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • result_package_id Many2one → stock.quant.package
    check_company=True domain="['|', '|', ('location_id', '=', False), ('location_id', '=', location_dest_id), ('id', '=', package_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • init(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • predefined_date Selection
    default='day' string='Snooze for' args: [('day', '1 Day'), ('week', '1 Week'), ('month', '1 Month'), ('custom', 'Custom')]
  • snoozed_until Date
    args: 'Snooze Date'
Public methods (1)
  • action_snooze(self)

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (11)
  • barcode Char
    copy=False args: 'Barcode'
  • company_id Many2one → res.company
    index=True args: 'res.company', 'Company'
  • height Integer
    help='Packaging Height' args: 'Height'
  • length_uom_name Char
    compute='_compute_length_uom_name' default=_get_default_length_uom string='Length unit of measure label'
  • max_weight Float
    help='Maximum weight shippable in this packaging' args: 'Max Weight'
  • name Char
    required=True args: 'Package Type'
  • packaging_length Integer
    help='Packaging Length' args: 'Length'
  • sequence Integer
    default=1 help='The first in the sequence is the default one.' args: 'Sequence'
  • storage_category_capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'package_type_id', 'Storage Category Capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' default=_get_default_weight_uom string='Weight unit of measure label'
  • width Integer
    help='Packaging Width' args: 'Width'
Public methods (1)
  • copy(self, default=None)

New fields (13)
  • company_id Many2one → res.company
    index=True required=True args: 'res.company', 'Company'
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', parent.location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', 'child_of', parent.location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • picking_type_code Selection
    related='picking_id.picking_type_code'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (4)
  • action_show_package_details(self)
  • create(self, vals)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (54)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index=True readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date Datetime
    copy=False default=fields.Datetime.now help='Creation Date, usually the time of the order' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'Creation Date'
  • date_deadline Datetime
    compute='_compute_date_deadline' help='Date Promise to the customer on the top level document (SO/PO)' store=True args: 'Deadline'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • group_id Many2one → procurement.group
    readonly=True related='move_lines.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_deadline_issue Boolean
    compute='_compute_has_deadline_issue' default=False help='Is late or will be late depending on the deadline and scheduled date' store=True args: 'Is late'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • hide_picking_type Boolean
    compute='_compute_hide_pickign_type'
  • immediate_transfer Boolean
    default=False
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • is_signed Boolean
    compute='_compute_is_signed' args: 'Is Signed'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Source Location'
  • move_ids_without_package One2many → stock.move
    compute='_compute_move_without_package' inverse='_set_move_without_package' string='Stock moves not in package' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=['|', ('product_qty', '=', 0.0), '&', ('product_qty', '!=', 0.0), ('qty_done', '!=', 0.0)] args: 'stock.move.line', 'picking_id'
  • move_lines One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index=True readonly=True args: 'Reference'
  • note Html
    args: 'Notes'
  • origin Char
    help='Reference of the document' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Assign Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Contact'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code'
  • picking_type_entire_packs Boolean
    related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    default='0' help='Products will be reserved first for the transfers with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_lines.product_id' args: 'product.product', 'Product'
  • products_availability Char
    compute='_compute_products_availability' help='Latest product availability status of the picking' string='Product Availability'
  • products_availability_state Selection
    compute='_compute_products_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True tracking=True args: 'Scheduled Date'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the button "Check Availability" should be displayed.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_mark_as_todo Boolean
    compute='_compute_show_mark_as_todo' help='Technical field used to compute whether the button "Mark as Todo" should be displayed.'
  • show_operations Boolean
    compute='_compute_show_operations'
  • show_reserved Boolean
    related='picking_type_id.show_reserved'
  • show_validate Boolean
    compute='_compute_show_validate' help='Technical field used to decide whether the button "Validate" should be displayed.'
  • signature Image
    attachment=True copy=False help='Signature' args: 'Signature'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • use_existing_lots Boolean
    related='picking_type_id.use_existing_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'res.users', 'Responsible'
Public methods (20)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_cancel(self)
  • action_confirm(self)
  • action_open_label_layout(self)
  • action_picking_move_tree(self)
  • action_put_in_pack(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_set_quantities_to_reservation(self)
  • action_toggle_is_locked(self)
  • action_view_reception_report(self)
  • button_scrap(self)
  • button_validate(self)
  • create(self, vals)
    @api.model
  • do_print_picking(self)
  • do_unreserve(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • should_print_delivery_address(self)
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (28)
  • active Boolean
    default=True args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • default_location_dest_id Many2one → stock.location
    check_company=True help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    check_company=True help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • name Char
    required=True translate=True args: 'Operation Type'
  • print_label Boolean
    help='If this checkbox is ticked, label will be print in this operation.' args: 'Print Label'
  • reservation_days_before Integer
    help='Maximum number of days before scheduled date that products should be reserved.' args: 'Days'
  • reservation_days_before_priority Integer
    help='Maximum number of days before scheduled date that priority picking products should be reserved.' args: 'Days when starred'
  • reservation_method Selection
    default='at_confirm' help='How products in transfers of this operation type should be reserved.' required=True args: [('at_confirm', 'At Confirmation'), ('manual', 'Manually'), ('by_date', 'Before scheduled date')], 'Reservation Method'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Code'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=_default_show_operations help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_reserved Boolean
    default=True help='If this checkbox is ticked, Odoo will automatically pre-fill the detailed operations with the corresponding products, locations and lot/serial numbers.' args: 'Pre-fill Detailed Operations'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True ondelete='cascade' args: 'stock.warehouse', 'Warehouse'
Public methods (9)
  • create(self, vals)
    @api.model
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_action_picking_type_operations(self)
  • get_stock_picking_action_picking_type(self)
  • name_get(self)
    Display 'Warehouse_name: PickingType_name'
  • write(self, vals)

New fields (12)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • delivery_count Integer
    compute='_compute_delivery_ids' args: 'Delivery order count'
  • delivery_ids Many2many → stock.picking
    compute='_compute_delivery_ids' string='Transfers' args: 'stock.picking'
  • display_complete Boolean
    compute='_compute_display_complete'
  • last_delivery_partner_id Many2one → res.partner
    compute='_compute_last_delivery_partner_id' args: 'res.partner'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' index=True required=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' search='_search_product_qty' args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (6)
  • action_lot_open_quants(self)
  • action_lot_open_transfers(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • generate_lot_names(self, first_lot, count)
    @api.model
    Generate `lot_names` from a string.
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True args: 'Active'
  • category_id Many2one → product.category
    default=_default_category_id domain=_domain_category_id ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to sublocation'
  • package_type_ids Many2many → stock.package.type
    check_company=True string='Package Type' args: 'stock.package.type'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain=_domain_product_id ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
  • storage_category_id Many2one → stock.storage.category
    check_company=True ondelete='cascade' args: 'stock.storage.category', 'Storage Category'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (22)
  • available_quantity Float
    compute='_compute_available_quantity' digits='Product Unit of Measure' help="On hand quantity which hasn't been reserved on a transfer, in the default unit of measure of the product" args: 'Available Quantity'
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • in_date Datetime
    default=fields.Datetime.now readonly=True required=True args: 'Incoming Date'
  • inventory_date Date
    compute='_compute_inventory_date' help='Next date the On Hand Quantity should be counted.' readonly=False store=True args: 'Scheduled Date'
  • inventory_diff_quantity Float
    compute='_compute_inventory_diff_quantity' digits='Product Unit of Measure' help="Indicates the gap between the product's theoretical quantity and its counted quantity." readonly=True store=True args: 'Difference'
  • inventory_quantity Float
    digits='Product Unit of Measure' help="The product's counted quantity." args: 'Counted Quantity'
  • inventory_quantity_auto_apply Float
    compute='_compute_inventory_quantity_auto_apply' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • inventory_quantity_set Boolean
    compute='_compute_inventory_quantity_set' default=False readonly=False store=True
  • is_outdated Boolean
    compute='_compute_is_outdated' args: 'Quantity has been moved since last count'
  • location_id Many2one → stock.location
    auto_join=True check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain=<expr> index=True ondelete='restrict' args: 'stock.production.lot', 'Lot/Serial Number'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" help='The package containing this quant' ondelete='restrict' args: 'stock.quant.package', 'Package'
  • product_categ_id Many2one
    related='product_tmpl_id.categ_id'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    digits='Product Unit of Measure' help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 digits='Product Unit of Measure' help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • tracking Selection
    readonly=True related='product_id.tracking'
  • user_id Many2one → res.users
    help='User assigned to do product count.' args: 'res.users', 'Assigned To'
Public methods (14)
  • action_apply_inventory(self)
  • action_inventory_history(self)
  • action_reset(self)
  • action_set_inventory_quantity(self)
  • action_set_inventory_quantity_to_zero(self)
  • action_view_inventory(self)
    @api.model
    Similar to _get_quants_action except specific for inventory adjustments (i.e. inventory counts).
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
    @api.constrains('quantity')
  • create(self, vals)
    @api.model
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Override to set the `inventory_quantity` field if we're in "inventory mode" as well as to compute the sum of the `available_quantity` field.
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (7)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index=True required=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' compute_sudo=True index=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • package_type_id Many2one → stock.package.type
    index=True args: 'stock.package.type', 'Package Type'
  • package_use Selection
    default='disposable' help="Reusable boxes are used for batch picking and emptied afterwards to be reused. In the barcode application, scanning a reusable box will add the products in this box.\n Disposable boxes aren't reused, when scanning a disposable box in the barcode application, the contained products are added to the transfer." required=True string='Package Use' args: [('disposable', 'Disposable Box'), ('reusable', 'Reusable Box')]
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
Public methods (2)
  • action_view_picking(self)
  • unpack(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (5)
  • json_lead_days Char
    compute='_compute_json_lead_days'
  • json_replenishment_history Char
    compute='_compute_json_replenishment_history'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • product_id Many2one → product.product
    related='orderpoint_id.product_id' args: 'product.product'
  • qty_to_order Float
    related='orderpoint_id.qty_to_order'
Public methods (0)

No public methods.

New fields (4)
  • inventory_date Date
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' required=True args: 'Inventory Date'
  • quant_ids Many2many → stock.quant
    args: 'stock.quant'
  • set_count Selection
    default='empty' string='Count' args: [('empty', 'Leave Empty'), ('set', 'Set Current Value')]
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (1)
  • action_request_count(self)

New fields (7)
  • company_id Many2one
    related='picking_id.company_id'
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (23)
  • action Selection
    index=True required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> domain="[('id', '=?', route_company_id)]" index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this lead time.' args: 'Lead Time'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_id Many2one → stock.location
    check_company=True index=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_code_domain Char
    compute='_compute_picking_type_code_domain'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=?', picking_type_code_domain)]" required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_carrier Boolean
    default=False help='When ticked, carrier of shipment will be propgated.' args: 'Propagation of carrier'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_company_id Many2one
    related='route_id.company_id' string='Route Company'
  • route_id Many2one → stock.location.route
    index=True ondelete='cascade' required=True args: 'stock.location.route', 'Route'
  • route_sequence Integer
    compute_sudo=True related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True args: 'stock.warehouse', 'Warehouse'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (17)
  • company_id Many2one → res.company
    default=<expr> required=True states={'done': [('readonly', True)]} string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True default=_get_default_location_id domain="[('usage', '=', 'internal'), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial'
  • move_id Many2one → stock.move
    check_company=True copy=False readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    check_company=True default=_get_default_scrap_location_id domain="[('scrap_location', '=', True), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    default=1.0 digits='Product Unit of Measure' required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' string='Product Tracking'
Public methods (4)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • do_scrap(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • allow_new_product Selection
    default='mixed' required=True args: [('empty', 'If the location is empty'), ('same', 'If all products are same'), ('mixed', 'Allow mixed products')]
  • capacity_ids One2many → stock.storage.category.capacity
    copy=True args: 'stock.storage.category.capacity', 'storage_category_id'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • location_ids One2many → stock.location
    args: 'stock.location', 'storage_category_id'
  • max_weight Float
    digits='Stock Weight' args: 'Max Weight'
  • name Char
    required=True args: 'Storage Category'
  • package_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • product_capacity_ids One2many → stock.storage.category.capacity
    compute='_compute_storage_capacity_ids' inverse='_set_storage_capacity_ids' args: 'stock.storage.category.capacity'
  • weight_uom_name Char
    compute='_compute_weight_uom_name' string='Weight unit'
Public methods (1)
  • copy(self, default=None)

New fields (6)
  • company_id Many2one → res.company
    related='storage_category_id.company_id' args: 'res.company', 'Company'
  • package_type_id Many2one → stock.package.type
    check_company=True ondelete='cascade' args: 'stock.package.type', 'Package Type'
  • product_id Many2one → product.product
    check_company=True domain=<expr> ondelete='cascade' args: 'product.product', 'Product'
  • product_uom_id Many2one
    related='product_id.uom_id'
  • quantity Float
    required=True args: 'Quantity'
  • storage_category_id Many2one → stock.storage.category
    index=True ondelete='cascade' required=True args: 'stock.storage.category'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • get_html(self, given_context=None)
    @api.model
  • get_lines(self, line_id=None, **kw)
    @api.model
  • get_pdf(self, line_data=None)
  • get_pdf_lines(self, line_data=[])

New fields (3)
  • product_ids Many2many → product.product
    string='Products' args: 'product.product'
  • quant_ids Many2many → stock.quant
    string='Quants' args: 'stock.quant'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)

New fields (4)
  • product_display_name Char
    compute='_compute_display_name' readonly=True args: 'Name'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    related='product_id.tracking'
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (27)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' index=True readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver goods directly (1 step)'), ('pick_ship', 'Send goods in output and then deliver (2 steps)'), ('pick_pack_ship', 'Pack goods, send goods in output and then deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'MTO rule'
  • name Char
    default=_default_name index=True required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly (1 step)'), ('two_steps', 'Receive goods in input and then stock (2 steps)'), ('three_steps', 'Receive goods in input, then quality and then stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.location.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.location.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • return_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Return Type'
  • route_ids Many2many → stock.location.route
    check_company=True domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.location.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
Public methods (6)
  • action_view_all_routes(self)
  • create(self, vals)
    @api.model
  • create_resupply_routes(self, supplier_warehouses)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (23)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days_date Date
    compute='_compute_lead_days'
  • location_id Many2one → stock.location
    check_company=True index=True ondelete='cascade' required=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_category_id Many2one → product.category
    name='Product Category' related='product_id.categ_id' store=True args: 'product.category'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Max Quantity'
  • product_min_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_forecast Float
    compute='_compute_qty' readonly=True args: 'Forecast'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Multiple Quantity'
  • qty_on_hand Float
    compute='_compute_qty' readonly=True args: 'On Hand'
  • qty_to_order Float
    compute='_compute_qty_to_order' readonly=False store=True args: 'To Order'
  • route_id Many2one → stock.location.route
    domain="[('product_selectable', '=', True)]" string='Preferred Route' args: 'stock.location.route'
  • rule_ids Many2many → stock.rule
    compute='_compute_rules' string='Rules used' args: 'stock.rule'
  • snoozed_until Date
    help='Hidden until next scheduler.' args: 'Snoozed'
  • trigger Selection
    default='auto' required=True string='Trigger' args: [('auto', 'Auto'), ('manual', 'Manual')]
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True ondelete='cascade' required=True args: 'stock.warehouse', 'Warehouse'
Public methods (7)
  • action_open_orderpoints(self)
    @api.model
  • action_product_forecast_report(self)
  • action_replenish(self)
  • action_replenish_auto(self)
  • action_stock_replenishment_info(self)
  • default_get(self, fields)
    @api.model
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_uom_name Char
    required=True args: 'Unit of Measure'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
  • quantity Float
    required=True string='Quantity'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, GitHub, Lucas Perais (lpe), Damien Bouvy, Barad Mahendra, Yannick Tivisse, Dharmraj Jhala, Nicolas Seinlet, Adrien Dieudonne, Jorge Pinna Puissant, Alexandre Kühn, jev-odoo, Arnold Moyaux, Adrian Torres, mreficent, Julien Castiaux, Xavier-Do, Denis Roussel, Romeo Fragomeli, jvm-odoo, jerome hanke (jhk), Carlos Dauden, Victor Feyens, Andrea Grazioso (agr-odoo), Fanny He, William Henrotin, Sébastien Theys, Akim Juillerat, Nasreddin (bon), alt-odoo, Florent de Labarre, Julien Mougenot, fw-bot, Anh Thao Pham (pta), Debauche Stéphane, svs-odoo, Luis González, Alvaro Fuentes, Rémy Baranx (bar), Achraf (abz), Adrien Widart, Ivan Yelizariev, Hubert (huvw), Nasreddin Boulif (bon), Touati Djamel (otd), Nicolas Galler, Swapnesh Shah, nie, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Rémy Voet (ryv), Mathieu Duckerts-Antoine, snd, Hoang Tran, Djamel (otd), Yenthe666, jbm-odoo, Aurélien (avd), Arnaud Joset, aab-odoo, root, Kevin Baptiste, Pratima Gupta, Ashmawy Walid (was), Richard deMeester, roen-odoo, Hubert Van de Walle (huvw), Laurent Desausoi (lade), ryv-odoo, Florian Damhaut, Sébastien Alix, Merlin (megu), MerlinGuillaume, guimarc-br, David (dafr), JF Aubert, PNO, Ankita Raval, yhu-odoo, nouraellm, thcl-odoo, Thierry Ducrest, Walid HANNICHE (waha), Yolann Sabaux, Abdelouahab (abla), Aurelien van Delft (avd), Achraf, niyasraphy, Florian da Costa, Alfredo Zamora, Habib (ayh), Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Walid, Mylyna Hy, Adrien Widart (awt), althaf shaik, Victor Piryns (pivi), Mahamadasif Ansari, Saurabh Mishra, Paimon, clesgow, Daniel Kosky (dako), Michele, Stephane Mangin, Marc-mvw, Jeremy Cormier, Djamel Touati, Pieter Claeys (clpi), Andrew Gavgavian, Nicolas Pierre
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - 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 (156)
XML IDNameModelTypeStatus
assets_common report_stock_rule assets ir.ui.view qweb Inherits web.report_assets_common
assets_common_replenishment_report Forecasted Inventory CSS ir.ui.view qweb Inherits web.report_assets_common
assets_stock_print_report assets_stock_print_report ir.ui.view qweb Inherits web.assets_common
exception_on_picking exception_on_picking ir.ui.view qweb New
label_barcode_product_product_view label_barcode_product_product_view ir.ui.view qweb New
label_barcode_product_template_view label_barcode_product_template_view ir.ui.view qweb New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_packaging_view label_product_packaging_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_product_template_view label_product_template_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_edit_view Package Level stock.package_level xpath Inherits stock.package_level_form_view
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level Tree Picking stock.package_level tree New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product sheet Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
qunit_suite stock tests ir.ui.view qweb Inherits web.qunit_suite_tests
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_generic_barcode report_generic_barcode ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_mrp_line report_mrp_line ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_product_product_replenishment report_product_product_replenishment ir.ui.view qweb New
report_product_template_replenishment report_product_template_replenishment ir.ui.view qweb New
report_replenishment_header report_replenishment_header ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory report_stock_inventory ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_assets_backend mrp_workorder assets ir.ui.view qweb Inherits web.assets_backend
stock_inventory_line_search stock.inventory.line.search stock.inventory.line search New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_inventory_line_tree_no_product_create stock.inventory.line.tree2 stock.inventory.line field Inherits stock.stock_inventory_line_tree
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_location_route_view_search stock.location.route.search stock.location.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_putaway_list stock.putaway.rule.tree stock.putaway.rule tree New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_reorder_report_search stock.warehouse.orderpoint.reorder.search stock.warehouse.orderpoint search New
stock_report_delivery_aggregated_move_lines stock_report_delivery_aggregated_move_lines ir.ui.view qweb New
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb New
stock_report_delivery_no_package_section_line stock_report_delivery_no_package_section_line ir.ui.view qweb New
stock_report_delivery_package_section_line stock_report_delivery_package_section_line ir.ui.view qweb New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_report_view_search report.stock.quantity.search report.stock.quantity search New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_assign_serial_numbers stock_assign_serial_numbers stock.assign.serial form New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_list stock.picking.type.list stock.picking.type tree New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_inventory_kanban stock.inventory.kanban stock.inventory kanban New
view_stock_move_line_detailed_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_nosuggest_operations stock.move.operations.nosuggest.form stock.move field Inherits stock.view_stock_move_operations
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_orderpoint_snooze Stock Orderpoint Snooze stock.orderpoint.snooze form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template field Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product field Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_form_editable stock.quant.form.editable stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_quant_tree_editable stock.quant.tree.editable stock.quant tree New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.tree stock.rule tree New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree_editable stock.warehouse.orderpoint.tree.editable stock.warehouse.orderpoint tree New
view_warehouse_orderpoint_tree_editable_config stock.warehouse.orderpoint.tree.editable.config stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (50)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'location': 'set default', 'lot': 'set default', 'package': 'set default'} selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (4)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
  • stock_move_ids One2many → stock.move
    string='Related Stock Moves' args: 'stock.move', 'group_id'
Public methods (2)
  • run(self, procurements, raise_user_error=True)
    @api.model
    Fulfil `procurements` with the help of stock rules. Procurements are needs of products at a certain location. To fulfil these needs, we need to create some sort of documents (`stock.move` by default, but extensions of `_run_` methods allow to create every type of documents). :param procurements: the description of the procurement :type list: list of `~odoo.addons.stock.models.stock_rule.ProcurementGroup.Procurement` :param raise_user_error: will raise either an UserError or a ProcurementException :type raise_user_error: boolan, optional :raises UserError: if `raise_user_error` is True and a procurement isn't fulfillable :raises ProcurementException: if `raise_user_error` is False and a procurement isn't fulfillable
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (4)
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.location.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.location.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.location.route'
Public methods (0)

No public methods.

New fields (12)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • stock_move_ids One2many → stock.move
    help='Technical: used to compute quantities.' args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    help='Technical: used to compute quantities.' args: 'stock.quant', 'product_id'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecast Quantity'
Public methods (14)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_components(self)
  • get_theoretical_quantity(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, to_uom=None)
    @api.model
  • onchange_tracking(self)
    @api.onchange('tracking')
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (10)
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    help='Date at which the replenishment should take place.' required=True args: 'Scheduled Date'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unit of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • route_ids Many2many → stock.location.route
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help="Apply specific route(s) for the replenishment instead of product's default routes." string='Preferred Routes' args: 'stock.location.route'
  • warehouse_id Many2one → stock.warehouse
    domain="[('company_id', '=', company_id)]" required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (22)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • has_available_route_ids Boolean
    compute='_compute_has_available_route_ids' default=<expr> args: 'Routes can be selected on this product'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    readonly=False related='categ_id.total_route_ids' related_sudo=False relation='stock.location.route' string='Category Routes'
  • route_ids Many2many → stock.location.route
    domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • show_on_hand_qty_status_button Boolean
    compute='_compute_show_on_hand_qty_status_button'
  • tracking Selection
    compute='_compute_tracking' default='none' help='Ensure the traceability of a storable product in your warehouse.' readonly=False required=True store=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    ondelete={'product': 'set default'} selection_add=[('product', 'Storable Product')] tracking=True
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (10)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_open_routes_diagram(self)
  • action_product_tmpl_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • onchange_tracking(self)
    @api.onchange('tracking')
  • write(self, vals)

New fields (7)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (2)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse - the usage of source/dest location follows the same logic as the warehouses
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_filter_state(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • internal_transit_location_id Many2one → stock.location
    check_company=True help='Technical field used for resupply routes between warehouses that belong to this company' ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
Public methods (7)
  • create(self, vals)
    @api.model
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on existing companies when module stock is installed.

New fields (22)
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_production_lot Boolean
    implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_sign_delivery Boolean
    implied_group='stock.group_stock_sign_delivery' args: 'Signature'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_procurement_jit Selection
    default='0' help='Reserving products manually in delivery orders or by running the scheduler is advised to better manage priorities in case of long customer lead times or/and frequent stock-outs.' args: [('1', 'Immediately after sales order confirmation'), ('0', 'Manually or based on automatic scheduler')], 'Reservation'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_picking_batch Boolean
    args: 'Batch Pickings'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • stock_mail_confirmation_template_id Many2one
    readonly=False related='company_id.stock_mail_confirmation_template_id'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (4)
  • move_id Many2one → stock.move
    required=True args: 'stock.move'
  • next_serial_count Integer
    default=_default_next_serial_count required=True args: 'Number of SN'
  • next_serial_number Char
    required=True args: 'First SN'
  • product_id Many2one → product.product
    related='move_id.product_id' required=True args: 'product.product', 'Product'
Public methods (1)
  • generate_serial_numbers(self)

New fields (3)
  • backorder_confirmation_line_ids One2many → stock.backorder.confirmation.line
    string='Backorder Confirmation Lines' args: 'stock.backorder.confirmation.line', 'backorder_confirmation_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
  • show_transfers Boolean
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
  • process_cancel_backorder(self)

New fields (3)
  • backorder_confirmation_id Many2one → stock.backorder.confirmation
    args: 'stock.backorder.confirmation', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Transfer'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (4)
  • new_quantity Float
    default=1 digits='Product Unit of Measure' help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    readonly=False related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (2)
  • change_product_qty(self)
    Changes the Product Quantity by creating/editing corresponding quant.
  • check_new_quantity(self)
    @api.constrains('new_quantity')

New fields (3)
  • immediate_transfer_line_ids One2many → stock.immediate.transfer.line
    string='Immediate Transfer Lines' args: 'stock.immediate.transfer.line', 'immediate_transfer_id'
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_transfer_rel'
  • show_transfers Boolean
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (3)
  • immediate_transfer_id Many2one → stock.immediate.transfer
    required=True args: 'stock.immediate.transfer', 'Immediate Transfer'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking', 'Transfer'
  • to_immediate Boolean
    args: 'To Process'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='If the inventory adjustment is not validated, date at which the theoritical quantities have been checked.\nIf the inventory adjustment is validated, date at which the inventory adjustment has been validated.' readonly=True required=True args: 'Inventory Date'
  • exhausted Boolean
    help='Include also products with quantity of 0' readonly=True states={'draft': [('readonly', False)]} args: 'Include Exhausted Products'
  • line_ids One2many → stock.inventory.line
    copy=False readonly=False states={'done': [('readonly', True)]} string='Inventories' args: 'stock.inventory.line', 'inventory_id'
  • location_ids Many2many → stock.location
    check_company=True domain="[('company_id', '=', company_id), ('usage', 'in', ['internal', 'transit'])]" readonly=True states={'draft': [('readonly', False)]} string='Locations' args: 'stock.location'
  • move_ids One2many → stock.move
    states={'done': [('readonly', True)]} string='Created Moves' args: 'stock.move', 'inventory_id'
  • name Char
    default='Inventory' readonly=True required=True states={'draft': [('readonly', False)]} args: 'Inventory Reference'
  • prefill_counted_quantity Selection
    default='counted' help='Allows to start with a pre-filled counted quantity for each lines or with all counted quantities set to zero.' selection=[('counted', 'Default to stock on hand'), ('zero', 'Default to zero')] string='Counted Quantities'
  • product_ids Many2many → product.product
    check_company=True domain="[('type', '=', 'product'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Specify Products to focus your inventory on particular Products.' readonly=True states={'draft': [('readonly', False)]} string='Products' args: 'product.product'
  • start_empty Boolean
    help='Allows to start with an empty inventory.' args: 'Empty Inventory'
  • state Selection
    copy=False default='draft' index=True readonly=True selection=[('draft', 'Draft'), ('cancel', 'Cancelled'), ('confirm', 'In Progress'), ('done', 'Validated')] string='Status' tracking=True
Public methods (10)
  • action_cancel_draft(self)
  • action_check(self)
    Checks the inventory and computes the stock move to do
  • action_open_inventory_lines(self)
  • action_print(self)
  • action_start(self)
  • action_validate(self)
  • action_view_related_move_lines(self)
  • copy_data(self, default=None)
  • post_inventory(self)
  • unlink(self)

New fields (17)
  • categ_id Many2one
    related='product_id.categ_id' store=True
  • company_id Many2one → res.company
    index=True readonly=True related='inventory_id.company_id' store=True args: 'res.company', 'Company'
  • difference_qty Float
    compute='_compute_difference' digits='Product Unit of Measure' help="Indicates the gap between the product's theoretical quantity and its newest quantity." readonly=True search='_search_difference_qty' args: 'Difference'
  • inventory_date Datetime
    default=fields.Datetime.now help='Last date at which the On Hand Quantity has been computed.' readonly=True args: 'Inventory Date'
  • inventory_id Many2one → stock.inventory
    check_company=True index=True ondelete='cascade' args: 'stock.inventory', 'Inventory'
  • is_editable Boolean
    help='Technical field to restrict editing.'
  • location_id Many2one → stock.location
    check_company=True domain=<expr> index=True required=True args: 'stock.location', 'Location'
  • outdated Boolean
    compute='_compute_outdated' search='_search_outdated' string='Quantity outdated'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" index=True args: 'stock.quant.package', 'Pack'
  • partner_id Many2one → res.partner
    check_company=True args: 'res.partner', 'Owner'
  • prod_lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id','=',product_id), ('company_id', '=', company_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    default=0 digits='Product Unit of Measure' readonly=True states={'confirm': [('readonly', False)]} args: 'Counted Quantity'
  • product_tracking Selection
    readonly=True related='product_id.tracking' string='Tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Product Unit of Measure'
  • state Selection
    related='inventory_id.state' string='Status'
  • theoretical_qty Float
    digits='Product Unit of Measure' readonly=True args: 'Theoretical Quantity'
Public methods (4)
  • action_refresh_quantity(self)
  • action_reset_product_qty(self)
    Write `product_qty` to zero on the selected records.
  • create(self, vals_list)
    @api.model_create_multi
    Override to handle the case we create inventory line without `theoretical_qty` because this field is usually computed, but in some case (typicaly in tests), we create inventory line without trigger the onchange, so in this case, we set `theoretical_qty` depending of the product's theoretical quantity. Handles the same problem with `product_uom_id` as this field is normally set in an onchange of `product_id`. Finally, this override checks we don't try to create a duplicated line.
  • write(self, vals)

New fields (18)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • comment Text
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Full Location Name'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • parent_path Char
    index=True
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.removal', 'Removal Strategy'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations: this location consumes the components and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit Location')]
Public methods (4)
  • default_get(self, fields)
    @api.model
  • get_warehouse(self)
    @api.returns('stock.warehouse', <expr>)
    Returns warehouse id of warehouse that contains location
  • should_bypass_reservation(self)
  • write(self, values)

New fields (14)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_location_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (1)
  • toggle_active(self)

New fields (66)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • backorder_id Many2one → stock.picking
    index=True readonly=False related='picking_id.backorder_id' args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date Datetime
    default=fields.Datetime.now help='Scheduled date until move is done, then date of actual move processing' index=True required=True args: 'Date Scheduled'
  • date_deadline Datetime
    help='Date Promise to the customer on the top level document (SO/PO)' readonly=True args: 'Deadline'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' help='Process at this date to be on time' store=True args: 'Delay Alert Date'
  • description_picking Text
    args: 'Description of Picking'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • forecast_availability Float
    compute='_compute_forecast_information' compute_sudo=True digits='Product Unit of Measure' args: 'Forecast Availability'
  • forecast_expected_date Datetime
    compute='_compute_forecast_information' compute_sudo=True args: 'Forecasted Expected date'
  • group_id Many2one → procurement.group
    default=_default_group_id index=True args: 'procurement.group', 'Procurement Group'
  • has_move_lines Boolean
    compute='_compute_has_move_lines'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • inventory_id Many2one → stock.inventory
    check_company=True args: 'stock.inventory', 'Inventory'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True check_company=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    auto_join=True check_company=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • lot_ids Many2many → stock.production.lot
    compute='_compute_lot_ids' inverse='_set_lot_ids' readonly=False string='Serial Numbers' args: 'stock.production.lot'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=['|', ('product_qty', '=', 0.0), ('qty_done', '!=', 0.0)] args: 'stock.move.line', 'move_id'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    index=True required=True args: 'Description'
  • next_serial Char
    args: 'First SN'
  • next_serial_count Integer
    args: 'Number of SN'
  • note Text
    args: 'Notes'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    check_company=True index=True args: 'stock.warehouse.orderpoint', 'Original Reordering Rule'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    check_company=True copy=False args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer'
  • picking_partner_id Many2one → res.partner
    readonly=False related='picking_id.partner_id' args: 'res.partner', 'Transfer Destination Address'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom." args: 'Unit Price'
  • priority Selection
    compute='_compute_priority' default='0' index=True store=True args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    copy=False default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    help='Technical: used in views' readonly=True related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=0.0 digits='Product Unit of Measure' help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity_done Float
    compute='_quantity_done_compute' digits='Product Unit of Measure' inverse='_quantity_done_set' args: 'Quantity Done'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reserved_availability Float
    compute='_compute_reserved_availability' digits='Product Unit of Measure' help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • restrict_partner_id Many2one → res.partner
    check_company=True help="Technical field used to depict a restriction on the ownership of quants to consider when marking this move as 'done'" args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.location.route
    check_company=True help='Preferred route' args: 'stock.location.route', 'stock_location_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'move_id'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_operations Boolean
    readonly=False related='picking_id.picking_type_id.show_operations'
  • show_reserved_availability Boolean
    compute='_compute_show_reserved_availability' args: 'From Supplier'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • warehouse_id Many2one → stock.warehouse
    help='Technical field depicting the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (14)
  • action_assign_serial(self)
    Opens a wizard to assign SN's name on each move lines.
  • action_assign_serial_show_details(self)
    On `self.move_line_ids`, assign `lot_name` according to `self.next_serial` before returning `self.action_show_details`.
  • action_clear_lines_show_details(self)
    Unlink `self.move_line_ids` before returning `self.action_show_details`. Useful for if a user creates too many SNs by accident via action_assign_serial_show_details since there's no way to undo the action.
  • action_product_forecast_report(self)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • default_get(self, fields_list)
    @api.model
  • init(self)
  • name_get(self)
  • onchange_move_line_ids(self)
    @api.onchange('move_line_ids', 'move_line_nosuggest_ids')
  • onchange_product(self)
    @api.onchange('product_id', 'picking_type_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • unlink(self)
  • write(self, vals)

New fields (32)
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    help='Technical link to see who consumed what. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • description_picking Text
    string='Description picking'
  • is_initial_demand_editable Boolean
    readonly=False related='move_id.is_initial_demand_editable'
  • is_locked Boolean
    default=True readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True required=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True required=True args: 'stock.location', 'From'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True help='Change to a better name' index=True args: 'stock.move', 'Stock Move'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' args: 'res.partner', 'From Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    check_company=True args: 'stock.package_level', 'Package Level'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    auto_join=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Transfer'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    help='Technical link to see which line was produced with this. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=False digits=0 inverse='_set_product_qty' store=True args: 'Real Reserved Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    copy=False default=0.0 digits='Product Unit of Measure' required=True args: 'Reserved'
  • qty_done Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Done'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • result_package_id Many2one → stock.quant.package
    check_company=True domain="['|', '|', ('location_id', '=', False), ('location_id', '=', location_dest_id), ('id', '=', package_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • init(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • predefined_date Selection
    default='day' string='Snooze for' args: [('day', '1 Day'), ('week', '1 Week'), ('month', '1 Month'), ('custom', 'Custom')]
  • snoozed_until Date
    args: 'Snooze Date'
Public methods (1)
  • action_snooze(self)

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (13)
  • company_id Many2one → res.company
    index=True required=True args: 'res.company', 'Company'
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', parent.location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', 'child_of', parent.location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • picking_type_code Selection
    related='picking_id.picking_type_code'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (4)
  • action_show_package_details(self)
  • create(self, vals)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (51)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index=True readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date Datetime
    default=fields.Datetime.now help='Creation Date, usually the time of the order' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'Creation Date'
  • date_deadline Datetime
    compute='_compute_date_deadline' help='Date Promise to the customer on the top level document (SO/PO)' store=True args: 'Deadline'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • group_id Many2one → procurement.group
    readonly=True related='move_lines.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_deadline_issue Boolean
    compute='_compute_has_deadline_issue' default=False help='Is late or will be late depending on the deadline and scheduled date' store=True args: 'Is late'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • hide_picking_type Boolean
    compute='_compute_hide_pickign_type'
  • immediate_transfer Boolean
    default=False
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Source Location'
  • move_ids_without_package One2many → stock.move
    compute='_compute_move_without_package' inverse='_set_move_without_package' string='Stock moves not in package' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=[('product_qty', '=', 0.0)] args: 'stock.move.line', 'picking_id'
  • move_lines One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index=True readonly=True args: 'Reference'
  • note Text
    args: 'Notes'
  • origin Char
    help='Reference of the document' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Assign Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Contact'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    default='0' help='Products will be reserved first for the transfers with the highest priorities.' index=True string='Priority' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_lines.product_id' args: 'product.product', 'Product'
  • products_availability Char
    compute='_compute_products_availability' string='Product Availability'
  • products_availability_state Selection
    compute='_compute_products_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True tracking=True args: 'Scheduled Date'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the button "Check Availability" should be displayed.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_mark_as_todo Boolean
    compute='_compute_show_mark_as_todo' help='Technical field used to compute whether the button "Mark as Todo" should be displayed.'
  • show_operations Boolean
    compute='_compute_show_operations'
  • show_reserved Boolean
    related='picking_type_id.show_reserved'
  • show_validate Boolean
    compute='_compute_show_validate' help='Technical field used to decide whether the button "Validate" should be displayed.'
  • signature Image
    attachment=True copy=False help='Signature' args: 'Signature'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'res.users', 'Responsible'
Public methods (18)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_assign_partner(self)
  • action_cancel(self)
  • action_confirm(self)
  • action_picking_move_tree(self)
  • action_put_in_pack(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_toggle_is_locked(self)
  • button_scrap(self)
  • button_validate(self)
  • create(self, vals)
    @api.model
  • do_print_picking(self)
  • do_unreserve(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'partner_id')
  • unlink(self)
  • write(self, vals)

New fields (26)
  • active Boolean
    default=True args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • default_location_dest_id Many2one → stock.location
    check_company=True help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    check_company=True help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • name Char
    required=True translate=True args: 'Operation Type'
  • rate_picking_backorders Integer
    compute='_compute_picking_count'
  • rate_picking_late Integer
    compute='_compute_picking_count'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Code'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=_default_show_operations help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_reserved Boolean
    default=True help='If this checkbox is ticked, Odoo will automatically pre-fill the detailed operations with the corresponding products, locations and lot/serial numbers.' args: 'Pre-fill Detailed Operations'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True ondelete='cascade' args: 'stock.warehouse', 'Warehouse'
Public methods (8)
  • create(self, vals)
    @api.model
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_stock_picking_action_picking_type(self)
  • name_get(self)
    Display 'Warehouse_name: PickingType_name'
  • write(self, vals)

New fields (9)
  • company_id Many2one → res.company
    default=<expr> index=True required=True store=True args: 'res.company', 'Company'
  • display_complete Boolean
    compute='_compute_display_complete'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' required=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • product_id Many2one → product.product
    check_company=True domain=<expr> required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    readonly=False related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (3)
  • action_lot_open_quants(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (6)
  • category_id Many2one → product.category
    default=_default_category_id domain=_domain_category_id ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id), ('id', '!=', location_in_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain=_domain_product_id ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
Public methods (1)
  • write(self, vals)

New fields (15)
  • available_quantity Float
    compute='_compute_available_quantity' help="On hand quantity which hasn't been reserved on a transfer, in the default unit of measure of the product" args: 'Available Quantity'
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • in_date Datetime
    readonly=True args: 'Incoming Date'
  • inventory_quantity Float
    compute='_compute_inventory_quantity' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • location_id Many2one → stock.location
    auto_join=True check_company=True domain=<expr> index=True ondelete='restrict' readonly=True required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain=<expr> index=True ondelete='restrict' readonly=True args: 'stock.production.lot', 'Lot/Serial Number'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' readonly=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" help='The package containing this quant' ondelete='restrict' readonly=True args: 'stock.quant.package', 'Package'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' readonly=True required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (9)
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
    @api.constrains('quantity')
  • create(self, vals)
    @api.model
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Override to set the `inventory_quantity` field if we're in "inventory mode" as well as to compute the sum of the `available_quantity` field.
  • unlink(self)
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (6)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' compute_sudo=True index=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • packaging_id Many2one → product.packaging
    check_company=True index=True args: 'product.packaging', 'Package Type'
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
Public methods (3)
  • action_view_picking(self)
  • name_get(self)
  • unpack(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (7)
  • company_id Many2one
    related='picking_id.company_id'
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (22)
  • action Selection
    index=True required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." index=True required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> domain="[('id', '=?', route_company_id)]" index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this lead time.' args: 'Lead Time'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_id Many2one → stock.location
    check_company=True index=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_code_domain Char
    compute='_compute_picking_type_code_domain'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=?', picking_type_code_domain)]" required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_company_id Many2one
    related='route_id.company_id' string='Route Company'
  • route_id Many2one → stock.location.route
    index=True ondelete='cascade' required=True args: 'stock.location.route', 'Route'
  • route_sequence Integer
    compute_sudo=True readonly=False related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True index=True args: 'stock.warehouse', 'Warehouse'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (17)
  • company_id Many2one → res.company
    default=<expr> required=True states={'done': [('readonly', True)]} string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True default=_get_default_location_id domain="[('usage', '=', 'internal'), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial'
  • move_id Many2one → stock.move
    check_company=True copy=False readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    check_company=True default=_get_default_scrap_location_id domain="[('scrap_location', '=', True), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    default=1.0 digits='Product Unit of Measure' required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' string='Product Tracking'
Public methods (5)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • do_scrap(self)
  • unlink(self)

New fields (0)

No new fields.

Public methods (4)
  • get_html(self, given_context=None)
    @api.model
  • get_lines(self, line_id=None, **kw)
    @api.model
  • get_pdf(self, line_data=[])
  • get_pdf_lines(self, line_data=[])

New fields (2)
  • inventory_id Many2one → stock.inventory
    args: 'stock.inventory', 'Inventory'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)

New fields (3)
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    readonly=True args: [('lot', 'Tracked by lot'), ('serial', 'Tracked by serial number')]
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (28)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' index=True readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver goods directly (1 step)'), ('pick_ship', 'Send goods in output and then deliver (2 steps)'), ('pick_pack_ship', 'Pack goods, send goods in output and then deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'MTO rule'
  • name Char
    default=<expr> index=True required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly (1 step)'), ('two_steps', 'Receive goods in input and then stock (2 steps)'), ('three_steps', 'Receive goods in input, then quality and then stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.location.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.location.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • route_ids Many2many → stock.location.route
    check_company=True domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.location.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • show_resupply Boolean
    compute='_compute_show_resupply'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'View Location'
  • warehouse_count Integer
    compute='_compute_warehouse_count'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
Public methods (6)
  • action_view_all_routes(self)
  • create(self, vals)
    @api.model
  • create_resupply_routes(self, supplier_warehouses)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • unlink(self)
  • write(self, vals)

New fields (25)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • allowed_route_ids Many2many → stock.location.route
    compute='_compute_allowed_route_ids' args: 'stock.location.route'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • json_lead_days_popover Char
    compute='_compute_json_popover'
  • lead_days_date Date
    compute='_compute_lead_days'
  • location_id Many2one → stock.location
    check_company=True index=True ondelete='cascade' required=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_category_id Many2one → product.category
    name='Product Category' related='product_id.categ_id' store=True args: 'product.category'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Max Quantity'
  • product_min_qty Float
    default=0.0 digits='Product Unit of Measure' help='When the virtual stock equals to or goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_forecast Float
    compute='_compute_qty' readonly=True args: 'Forecast'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Multiple Quantity'
  • qty_on_hand Float
    compute='_compute_qty' readonly=True args: 'On Hand'
  • qty_to_order Float
    compute='_compute_qty_to_order' readonly=False store=True args: 'To Order'
  • route_id Many2one → stock.location.route
    domain="[('id', 'in', allowed_route_ids)]" string='Preferred Route' args: 'stock.location.route'
  • rule_ids Many2many → stock.rule
    compute='_compute_rules' string='Rules used' args: 'stock.rule'
  • snoozed_until Date
    help='Hidden until next scheduler.' args: 'Snoozed'
  • trigger Selection
    default='auto' required=True string='Trigger' args: [('auto', 'Auto'), ('manual', 'Manual')]
  • warehouse_id Many2one → stock.warehouse
    check_company=True ondelete='cascade' required=True args: 'stock.warehouse', 'Warehouse'
Public methods (5)
  • action_open_orderpoints(self)
    @api.model
  • action_replenish(self)
  • action_replenish_auto(self)
  • default_get(self, fields)
    @api.model
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_uom_name Char
    required=True args: 'Unit of Measure'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
  • quantity Float
    required=True string='Quantity'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYOperations/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Barad Mahendra, Wolfgang Taferner, Yannick Tivisse, Martin Geubelle, Odoo Online, Nicolas Seinlet, Pierre Masereel, Romain Derie, Jigar Patel, Adrien Dieudonne, RomainLibert, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, jev-odoo, Toufik Ben Jaa, Arnold Moyaux, Adrian Torres, mreficent, Aurélien Warnon, Xavier-Do, David Tran, Denis Roussel, jvm-odoo, mgh-odoo, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, Sébastien Theys, Shreya Modi, david, Nasreddin (bon), alt-odoo, fw-bot, Anh Thao Pham (pta), svs-odoo, Alvaro Fuentes, Kinjal Mehta, Rémy Baranx (bar), Achraf (abz), lul-odoo, Adrien Widart, Hubert (huvw), Naglis Jonaitis, Nasreddin Boulif (bon), Touati Djamel (otd), Prakash Prajapati, Nicolas Galler, Swapnesh Shah, nie, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Rémy Voet (ryv), fja-odoo, Parth Choksi, Aurélien (avd), shreya thakrar, Arnaud Joset, Hetashree Chauhan, Jinal Patel, Pratima Gupta, Ashmawy Walid (was), Arnaud Baes, roen-odoo, Hardik Prajapati, Geoffroy Larue, Laurent Desausoi (lade), Florian Damhaut, Hetal Dhanak, Nicolás Mac Rouillon, 王挺, Jignesh Rathod, Haresh Shyara, Sébastien Alix, Merlin (megu), Kaushalya Mandaliya, arbaes, MerlinGuillaume, Darshil Trivedi, guimarc-br, tranngocson1996, David (dafr), JF Aubert, PNO, Ankita Raval, yhu-odoo, nouraellm
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (151)
XML IDNameModelTypeStatus
assets_common report_stock_rule assets ir.ui.view qweb Inherits web.report_assets_common
assets_common stock_location_barcodes pdf assets ir.ui.view qweb Inherits web.report_assets_common
assets_stock_print_report assets_stock_print_report ir.ui.view qweb Inherits web.assets_common
exception_on_picking exception_on_picking ir.ui.view qweb New
label_barcode_product_product_view label_barcode_product_product_view ir.ui.view qweb New
label_barcode_product_template_view label_barcode_product_template_view ir.ui.view qweb New
label_lot_template_view label_lot_template_view ir.ui.view qweb New
label_package_template_view label_package_template_view ir.ui.view qweb New
label_picking_type_view label_picking_type_view ir.ui.view qweb New
label_product_packaging_view label_product_packaging_view ir.ui.view qweb New
label_product_product_view label_product_product_view ir.ui.view qweb New
label_product_template_view label_product_template_view ir.ui.view qweb New
label_transfer_template_view_pdf label_transfer_template_view_pdf ir.ui.view qweb New
label_transfer_template_view_zpl label_transfer_template_view_zpl ir.ui.view qweb New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level Tree Picking stock.package_level tree New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category div Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product sheet Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template xpath Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
qunit_suite stock tests ir.ui.view qweb Inherits web.qunit_suite
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_mrp_line report_mrp_line ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory report_stock_inventory ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
report_stock_rule_vertical_bar report_stock_rule_vertical_bar ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_assets_backend mrp_workorder assets ir.ui.view qweb Inherits web.assets_backend
stock_inventory_line_search stock.inventory.line.search stock.inventory.line search New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_inventory_line_tree2 stock.inventory.line.tree2 stock.inventory.line tree New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_location_route_view_search stock.location.route.search stock.location.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_move_tree Stock Moves stock.move tree New
stock_move_view_kanban stock.move.kanban2 stock.move kanban New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_putaway_list stock.putaway.rule.tree stock.putaway.rule tree New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_report_view_graph stock_report_view_graph report.stock.quantity graph New
stock_report_view_search report.stock.quantity.search report.stock.quantity search New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_warehouse_view_form_editable stock.warehouse.form.editable stock.warehouse xpath Inherits stock.view_warehouse
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warehouse_view_tree_editable stock.warehouse.tree.editable stock.warehouse xpath Inherits stock.view_warehouse_tree
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_assign_serial_numbers stock_assign_serial_numbers stock.assign.serial form New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_move_tree_receipt_picking_board stock.move.tree3 stock.move tree New
view_overprocessed_transfer stock.overprocessed.transfer.view.form stock.overprocessed.transfer form New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_list stock.picking.type.list stock.picking.type tree New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway_search stock.putaway.rule.search stock.putaway.rule search New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_inventory_kanban stock.inventory.kanban stock.inventory kanban New
view_stock_move_kanban stock.move.kanban stock.move kanban New
view_stock_move_line_detailed_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_nosuggest_operations stock.move.operations.nosuggest.form stock.move field Inherits stock.view_stock_move_operations
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template tree Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product tree Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_quant_tree_editable stock.quant.tree.editable stock.quant tree New
view_stock_quantity_history Inventory Report at Date stock.quantity.history form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.tree stock.rule tree New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (48)

New fields (1)
  • type Selection
    selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (3)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
Public methods (2)
  • run(self, procurements)
    @api.model
    Method used in a procurement case. The purpose is to supply the product passed as argument in the location also given as an argument. In order to be able to find a suitable location that provide the product it will search among stock.rule.
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (4)
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'category_id', 'Putaway Rules'
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.location.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.location.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.location.route'
Public methods (0)

No public methods.

New fields (12)
  • free_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - reserved quantity)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_free_qty' args: 'Free To Use Quantity '
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'product_id', 'Putaway Rules'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • stock_move_ids One2many → stock.move
    help='Technical: used to compute quantities.' args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    help='Technical: used to compute quantities.' args: 'stock.quant', 'product_id'
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecast Quantity'
Public methods (13)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_related_putaway_rules(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_components(self)
  • get_theoretical_quantity(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, to_uom=None)
    @api.model
  • onchange_tracking(self)
    @api.onchange('tracking')
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (10)
  • company_id Many2one → res.company
    args: 'res.company'
  • date_planned Datetime
    help='Date at which the replenishment should take place.' required=True args: 'Scheduled Date'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unity of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • route_ids Many2many → stock.location.route
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help="Apply specific route(s) for the replenishment instead of product's default routes." string='Preferred Routes' args: 'stock.location.route'
  • warehouse_id Many2one → stock.warehouse
    domain="[('company_id', '=', company_id)]" required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (20)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • incoming_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' compute_sudo=False args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'inventory'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    check_company=True company_dependent=True domain="[('usage', '=', 'production'), '|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules' compute_sudo=False
  • responsible_id Many2one → res.users
    check_company=True company_dependent=True default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    readonly=False related='categ_id.total_route_ids' related_sudo=False relation='stock.location.route' string='Category Routes'
  • route_ids Many2many → stock.location.route
    domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, replenished on order, etc.' args: 'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • tracking Selection
    default='none' help='Ensure the traceability of a storable product in your warehouse.' required=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    selection_add=[('product', 'Storable Product')] tracking=True
  • virtual_available Float
    compute='_compute_quantities' compute_sudo=False digits='Product Unit of Measure' search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (9)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_product_tmpl_forecast_report(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_related_putaway_rules(self)
  • action_view_stock_move_lines(self)
  • onchange_tracking(self)
    @api.onchange('tracking')
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • cumulative_quantity Float
    readonly=True string='Cumulative Quantity'
  • date Date
    string='Date'
  • picking_id Many2one → stock.picking
    readonly=True string='Picking' args: 'stock.picking'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • quantity Float
    readonly=True
  • reference Char
    args: 'Reference'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Override read_group in order to display the correct cumulative quantity. The cumulative quantity for a group of moves/quants should be the last for the selected time interval (given by domain). However select the 'last' record's value in a groupby is not possible (only possible aggregation functions are the ones provided by PostgreSQL). The cumulative quantity is recomputed since a search on each group returned by the super would consume too much time. The cumulative quantity is computed based on previous group. - Group1: sum of the quantity of records in group1. - Group2: cumulative_quantity of group1 + sum of quantity of records in group2 - Group3: cumulative_quantity of group2 + sum of quantity of records in group3 ... Since read_group depends on domain, some records could be excluded and the computed cumulative quantity could be different than the one computed in SQL. It's wanted since the customer could play with the domain in order to analyze different quantities in different situations.

New fields (8)
  • company_id Many2one → res.company
    readonly=True args: 'res.company'
  • date Date
    readonly=True string='Date'
  • move_ids One2many → stock.move
    readonly=True args: 'stock.move'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True string='Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • state Selection
    readonly=True string='State' args: [('forecast', 'Forecasted Stock'), ('in', 'Forecasted Receipts'), ('out', 'Forecasted Deliveries')]
  • warehouse_id Many2one → stock.warehouse
    readonly=True args: 'stock.warehouse'
Public methods (1)
  • init(self)
    Because we can transfer a product from a warehouse to another one thanks to a stock move, we need to generate some fake stock moves before processing all of them. That way, in case of an interwarehouse transfer, we will have an outgoing stock move for the source warehouse and an incoming stock move for the destination one. To do so, we select all relevant SM (incoming, outgoing and interwarehouse), then we duplicate all these SM and edit the values: - product_qty is kept if the SM is not the duplicated one or if the SM is an interwarehouse one otherwise, we set the value to 0 (this allows us to filter it out during the SM processing) - the source warehouse is kept if the SM is not the duplicated one - the dest warehouse is kept if the SM is not the duplicated one and is not an interwarehouse OR the SM is the duplicated one and is an interwarehouse - the usage of source/dest location follows the same logic as the warehouses

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • internal_transit_location_id Many2one → stock.location
    check_company=True help='Technical field used for resupply routes between warehouses that belong to this company' ondelete='restrict' args: 'stock.location', 'Internal Transit Location'
  • stock_mail_confirmation_template_id Many2one → mail.template
    default=_default_confirmation_mail_template domain="[('model', '=', 'stock.picking')]" help='Email sent to the customer once the order is done.' string='Email Template confirmation picking' args: 'mail.template'
  • stock_move_email_validation Boolean
    default=False args: 'Email Confirmation picking'
Public methods (7)
  • create(self, vals)
    @api.model
  • create_missing_inventory_loss_location(self)
    @api.model
  • create_missing_production_location(self)
    @api.model
  • create_missing_scrap_location(self)
    @api.model
  • create_missing_scrap_sequence(self)
    @api.model
  • create_missing_transit_location(self)
    @api.model
  • create_missing_warehouse(self)
    @api.model
    This hook is used to add a warehouse on existing companies when module stock is installed.

New fields (22)
  • group_lot_on_delivery_slip Boolean
    group='base.group_user,base.group_portal' implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers on Delivery Slips'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_multi_warehouses Boolean
    implied_group='stock.group_stock_multi_warehouses' args: 'Multi-Warehouses'
  • group_stock_production_lot Boolean
    implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Delivery Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost'
  • module_delivery_fedex Boolean
    args: 'FedEx'
  • module_delivery_ups Boolean
    args: 'UPS'
  • module_delivery_usps Boolean
    args: 'USPS'
  • module_procurement_jit Selection
    default='0' help='Reserving products manually in delivery orders or by running the scheduler is advised to better manage priorities in case of long customer lead times or/and frequent stock-outs.' args: [('1', 'Immediately after sales order confirmation'), ('0', 'Manually or based on automatic scheduler')], 'Reservation'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_picking_batch Boolean
    args: 'Batch Pickings'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • stock_mail_confirmation_template_id Many2one
    readonly=False related='company_id.stock_mail_confirmation_template_id'
  • stock_move_email_validation Boolean
    readonly=False related='company_id.stock_move_email_validation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    check_company=True company_dependent=True domain="['|', ('company_id', '=', False), ('company_id', '=', allowed_company_ids[0])]" help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (4)
  • move_id Many2one → stock.move
    required=True args: 'stock.move'
  • next_serial_count Integer
    default=_default_next_serial_count required=True args: 'Number of SN'
  • next_serial_number Char
    required=True args: 'First SN'
  • product_id Many2one → product.product
    related='move_id.product_id' required=True args: 'product.product', 'Product'
Public methods (1)
  • generate_serial_numbers(self)

New fields (1)
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
Public methods (2)
  • process(self)
  • process_cancel_backorder(self)

New fields (4)
  • new_quantity Float
    default=1 digits='Product Unit of Measure' help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    readonly=False related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (2)
  • change_product_qty(self)
    Changes the Product Quantity by creating/editing corresponding quant.
  • check_new_quantity(self)
    @api.constrains('new_quantity')

New fields (1)
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_transfer_rel'
Public methods (1)
  • process(self)

New fields (10)
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='If the inventory adjustment is not validated, date at which the theoritical quantities have been checked.\nIf the inventory adjustment is validated, date at which the inventory adjustment has been validated.' readonly=True required=True args: 'Inventory Date'
  • line_ids One2many → stock.inventory.line
    copy=False readonly=False states={'done': [('readonly', True)]} string='Inventories' args: 'stock.inventory.line', 'inventory_id'
  • location_ids Many2many → stock.location
    check_company=True domain="[('company_id', '=', company_id), ('usage', 'in', ['internal', 'transit'])]" readonly=True states={'draft': [('readonly', False)]} string='Locations' args: 'stock.location'
  • move_ids One2many → stock.move
    states={'done': [('readonly', True)]} string='Created Moves' args: 'stock.move', 'inventory_id'
  • name Char
    default='Inventory' readonly=True required=True states={'draft': [('readonly', False)]} args: 'Inventory Reference'
  • prefill_counted_quantity Selection
    default='counted' help='Allows to start with prefill counted quantity for each lines or with all counted quantity set to zero.' selection=[('counted', 'Default to stock on hand'), ('zero', 'Default to zero')] string='Counted Quantities'
  • product_ids Many2many → product.product
    check_company=True domain="[('type', '=', 'product'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Specify Products to focus your inventory on particular Products.' readonly=True states={'draft': [('readonly', False)]} string='Products' args: 'product.product'
  • start_empty Boolean
    help='Allows to start with an empty inventory.' args: 'Empty Inventory'
  • state Selection
    copy=False default='draft' index=True readonly=True selection=[('draft', 'Draft'), ('cancel', 'Cancelled'), ('confirm', 'In Progress'), ('done', 'Validated')] string='Status'
Public methods (9)
  • action_cancel_draft(self)
  • action_check(self)
    Checks the inventory and computes the stock move to do
  • action_open_inventory_lines(self)
  • action_start(self)
  • action_validate(self)
  • action_view_related_move_lines(self)
  • copy_data(self, default=None)
  • post_inventory(self)
  • unlink(self)

New fields (17)
  • categ_id Many2one
    related='product_id.categ_id' store=True
  • company_id Many2one → res.company
    index=True readonly=True related='inventory_id.company_id' store=True args: 'res.company', 'Company'
  • difference_qty Float
    compute='_compute_difference' digits='Product Unit of Measure' help="Indicates the gap between the product's theoretical quantity and its newest quantity." readonly=True search='_search_difference_qty' args: 'Difference'
  • inventory_date Datetime
    default=fields.Datetime.now help='Last date at which the On Hand Quantity has been computed.' readonly=True args: 'Inventory Date'
  • inventory_id Many2one → stock.inventory
    check_company=True index=True ondelete='cascade' args: 'stock.inventory', 'Inventory'
  • is_editable Boolean
    help='Technical field to restrict the edition.'
  • location_id Many2one → stock.location
    check_company=True domain=<expr> index=True required=True args: 'stock.location', 'Location'
  • outdated Boolean
    compute='_compute_outdated' search='_search_outdated' string='Quantity outdated'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" index=True args: 'stock.quant.package', 'Pack'
  • partner_id Many2one → res.partner
    check_company=True args: 'res.partner', 'Owner'
  • prod_lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id','=',product_id), ('company_id', '=', company_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    default=0 digits='Product Unit of Measure' args: 'Counted Quantity'
  • product_tracking Selection
    readonly=True related='product_id.tracking' args: 'Tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Product Unit of Measure'
  • state Selection
    related='inventory_id.state' args: 'Status'
  • theoretical_qty Float
    digits='Product Unit of Measure' readonly=True args: 'Theoretical Quantity'
Public methods (4)
  • action_refresh_quantity(self)
  • action_reset_product_qty(self)
    Write `product_qty` to zero on the selected records.
  • create(self, vals_list)
    @api.model_create_multi
    Override to handle the case we create inventory line without `theoretical_qty` because this field is usually computed, but in some case (typicaly in tests), we create inventory line without trigger the onchange, so in this case, we set `theoretical_qty` depending of the product's theoretical quantity. Handles the same problem with `product_uom_id` as this field is normally set in an onchange of `product_id`. Finally, this override checks we don't try to create a duplicated line.
  • write(self, vals)

New fields (18)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • comment Text
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Full Location Name'
  • location_id Many2one → stock.location
    check_company=True help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • parent_path Char
    index=True
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_rule_ids One2many → stock.putaway.rule
    args: 'stock.putaway.rule', 'location_in_id', 'Putaway Rules'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.removal', 'Removal Strategy'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Production: Virtual counterpart location for production operations: this location consumes the components and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('production', 'Production'), ('transit', 'Transit Location')]
Public methods (4)
  • default_get(self, fields)
    @api.model
  • get_warehouse(self)
    @api.returns('stock.warehouse', <expr>)
    Returns warehouse id of warehouse that contains location
  • should_bypass_reservation(self)
  • write(self, values)

New fields (14)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_location_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    check_company=True copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_domain_ids One2many → stock.warehouse
    compute='_compute_warehouses' args: 'stock.warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False domain="[('id', 'in', warehouse_domain_ids)]" args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (3)
  • toggle_active(self)
  • view_categ_ids(self)
  • view_product_ids(self)

New fields (65)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • backorder_id Many2one → stock.picking
    index=True readonly=False related='picking_id.backorder_id' args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date Datetime
    default=fields.Datetime.now help='Move date: scheduled date until move is done, then date of actual move processing' index=True required=True states={'done': [('readonly', True)]} args: 'Date'
  • date_expected Datetime
    default=fields.Datetime.now help='Scheduled date for the processing of this move' index=True required=True states={'done': [('readonly', True)]} args: 'Expected Date'
  • delay_alert Boolean
    args: 'Alert if Delay'
  • description_picking Text
    args: 'Description of Picking'
  • display_assign_serial Boolean
    compute='_compute_display_assign_serial'
  • group_id Many2one → procurement.group
    default=_default_group_id args: 'procurement.group', 'Procurement Group'
  • has_move_lines Boolean
    compute='_compute_has_move_lines'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • inventory_id Many2one → stock.inventory
    check_company=True args: 'stock.inventory', 'Inventory'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True check_company=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    auto_join=True check_company=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=[('product_qty', '=', 0.0)] args: 'stock.move.line', 'move_id'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    index=True required=True args: 'Description'
  • next_serial Char
    args: 'First SN'
  • next_serial_count Integer
    args: 'Number of SN'
  • note Text
    args: 'Notes'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    check_company=True copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    check_company=True copy=False args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    check_company=True index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer Reference'
  • picking_partner_id Many2one → res.partner
    readonly=False related='picking_id.partner_id' args: 'res.partner', 'Transfer Destination Address'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom." args: 'Unit Price'
  • priority Selection
    default='1' args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    help='Technical: used in views' readonly=False related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=0.0 digits='Product Unit of Measure' help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Initial Demand'
  • propagate_cancel Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • propagate_date Boolean
    help='The rescheduling is propagated to the next move.' string='Propagate Rescheduling'
  • propagate_date_minimum_delta Integer
    help='The change must be higher than this value to be propagated' string='Reschedule if Higher Than'
  • quantity_done Float
    compute='_quantity_done_compute' digits='Product Unit of Measure' inverse='_quantity_done_set' args: 'Quantity Done'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reserved_availability Float
    compute='_compute_reserved_availability' digits='Product Unit of Measure' help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • restrict_partner_id Many2one → res.partner
    check_company=True help="Technical field used to depict a restriction on the ownership of quants to consider when marking this move as 'done'" args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.location.route
    check_company=True help='Preferred route' args: 'stock.location.route', 'stock_location_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    check_company=True help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'move_id'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_operations Boolean
    readonly=False related='picking_id.picking_type_id.show_operations'
  • show_reserved_availability Boolean
    compute='_compute_show_reserved_availability' args: 'From Supplier'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • string_availability_info Text
    compute='_compute_string_qty_information' help='Show various information on stock availability for this move' readonly=True args: 'Availability'
  • warehouse_id Many2one → stock.warehouse
    help='Technical field depicting the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (16)
  • action_assign_serial(self)
    Opens a wizard to assign SN's name on each move lines.
  • action_assign_serial_show_details(self)
    On `self.move_line_ids`, assign `lot_name` according to `self.next_serial` before returning `self.action_show_details`.
  • action_clear_lines_show_details(self)
    Unlink `self.move_line_ids` before returning `self.action_show_details`. Useful for if a user creates too many SNs by accident via action_assign_serial_show_details since there's no way to undo the action.
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • init(self)
  • name_get(self)
  • onchange_date(self)
    @api.onchange('date_expected')
  • onchange_move_line_ids(self)
    @api.onchange('move_line_ids', 'move_line_nosuggest_ids')
  • onchange_product(self)
    @api.onchange('product_id', 'picking_type_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • onchange_quantity(self)
    @api.onchange('product_id', 'product_qty')
  • unlink(self)
  • write(self, vals)

New fields (31)
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • consume_line_ids Many2many → stock.move.line
    help='Technical link to see who consumed what. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • description_picking Text
    string='Description picking'
  • is_initial_demand_editable Boolean
    readonly=False related='move_id.is_initial_demand_editable'
  • is_locked Boolean
    default=True readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    check_company=True required=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True required=True args: 'stock.location', 'From'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    check_company=True help='Change to a better name' index=True args: 'stock.move', 'Stock Move'
  • origin Char
    related='move_id.origin' string='Source'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be taken from this owner.' args: 'res.partner', 'From Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    check_company=True args: 'stock.package_level', 'Package Level'
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    auto_join=True check_company=True help='The stock operation where the packing has been made' index=True args: 'stock.picking', 'Stock Picking'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    help='Technical link to see which line was produced with this. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=False digits=0 inverse='_set_product_qty' store=True args: 'Real Reserved Quantity'
  • product_uom_id Many2one → uom.uom
    required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    copy=False default=0.0 digits='Product Unit of Measure' required=True args: 'Reserved'
  • qty_done Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Done'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • result_package_id Many2one → stock.quant.package
    check_company=True domain="['|', '|', ('location_id', '=', False), ('location_id', '=', location_dest_id), ('id', '=', package_id)]" help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (7)
  • check_reserved_done_quantity(self)
    @api.constrains('product_uom_qty')
  • create(self, vals_list)
    @api.model_create_multi
  • init(self)
  • onchange_product_id(self)
    @api.onchange('product_id', 'product_uom_id')
  • onchange_serial_number(self)
    @api.onchange('lot_name', 'lot_id')
    When the user is encoding a move line for a tracked product, we apply some logic to help him. This includes: - automatically switch `qty_done` to 1.0 - warn if he has already encoded `lot_name` in another move line
  • unlink(self)
  • write(self, vals)

New fields (2)
  • overprocessed_product_name Char
    compute='_compute_overprocessed_product_name' readonly=True
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (1)
  • action_confirm(self)

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (13)
  • company_id Many2one → res.company
    index=True required=True args: 'res.company', 'Company'
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', parent.location_dest_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', 'child_of', parent.location_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True args: 'stock.picking', 'Picking'
  • picking_type_code Selection
    related='picking_id.picking_type_code'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (4)
  • action_show_package_details(self)
  • create(self, vals)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (43)
  • backorder_id Many2one → stock.picking
    check_company=True copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index=True readonly=True args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    index=True readonly=True related='picking_type_id.company_id' store=True string='Company' args: 'res.company'
  • date Datetime
    default=fields.Datetime.now help='Creation Date, usually the time of the order' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'Creation Date'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • group_id Many2one → procurement.group
    readonly=True related='move_lines.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • immediate_transfer Boolean
    default=False
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • location_dest_id Many2one → stock.location
    check_company=True default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Source Location'
  • move_ids_without_package One2many → stock.move
    compute='_compute_move_without_package' inverse='_set_move_without_package' string='Stock moves not in package' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=[('product_qty', '=', 0.0)] args: 'stock.move.line', 'picking_id'
  • move_lines One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index=True readonly=True args: 'Reference'
  • note Text
    args: 'Notes'
  • origin Char
    help='Reference of the document' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    check_company=True help='When validating the transfer, the products will be assigned to this owner.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Assign Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Contact'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code' args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')]
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    copy=False args: 'Printed'
  • priority Selection
    compute='_compute_priority' help='Products will be reserved first for the transfers with the highest priorities.' index=True inverse='_set_priority' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True string='Priority' tracking=True args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_lines.product_id' args: 'product.product', 'Product'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' default=fields.Datetime.now help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True tracking=True args: 'Scheduled Date'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the check availability button should be shown.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_mark_as_todo Boolean
    compute='_compute_show_mark_as_todo' help='Technical field used to compute whether the mark as todo button should be shown.'
  • show_operations Boolean
    compute='_compute_show_operations'
  • show_reserved Boolean
    related='picking_type_id.show_reserved'
  • show_validate Boolean
    compute='_compute_show_validate' help='Technical field used to compute whether the validate should be shown.'
  • state Selection
    compute='_compute_state' copy=False help=' * Draft: The transfer is not confirmed yet. Reservation doesn\'t apply.\n * Waiting another operation: This transfer is waiting for another operation before being ready.\n * Waiting: The transfer is waiting for the availability of some products.\n(a) The shipping policy is "As soon as possible": no product could be reserved.\n(b) The shipping policy is "When all products are ready": not all the products could be reserved.\n * Ready: The transfer is ready to be processed.\n(a) The shipping policy is "As soon as possible": at least one product has been reserved.\n(b) The shipping policy is "When all products are ready": all product have been reserved.\n * Done: The transfer has been processed.\n * Cancelled: The transfer has been cancelled.' index=True readonly=True store=True string='Status' tracking=True args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • use_create_lots Boolean
    related='picking_type_id.use_create_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} tracking=True args: 'res.users', 'Responsible'
Public methods (20)
  • action_assign(self)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_assign_partner(self)
  • action_cancel(self)
  • action_confirm(self)
  • action_done(self)
    Changes picking state to done by processing the Stock Moves of the Picking Normally that happens when the button "Done" is pressed on a Picking view. @return: True
  • action_generate_backorder_wizard(self)
  • action_picking_move_tree(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_toggle_is_locked(self)
  • button_scrap(self)
  • button_validate(self)
  • create(self, vals)
    @api.model
  • do_print_picking(self)
  • do_unreserve(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'partner_id')
  • put_in_pack(self)
  • unlink(self)
  • write(self, vals)

New fields (1)
  • user_id Many2one → res.users
    default=<expr> domain=<expr> args: 'res.users', 'Responsible'
Public methods (1)
  • assign_responsible(self)

New fields (26)
  • active Boolean
    default=True args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    required=True args: [('incoming', 'Receipt'), ('outgoing', 'Delivery'), ('internal', 'Internal Transfer')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • default_location_dest_id Many2one → stock.location
    check_company=True help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    check_company=True help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • name Char
    required=True translate=True args: 'Operation Type'
  • rate_picking_backorders Integer
    compute='_compute_picking_count'
  • rate_picking_late Integer
    compute='_compute_picking_count'
  • return_picking_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_code Char
    required=True args: 'Code'
  • sequence_id Many2one → ir.sequence
    check_company=True copy=False args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=_default_show_operations help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_reserved Boolean
    default=True help='If this checkbox is ticked, Odoo will automatically pre-fill the detailed operations with the corresponding products, locations and lot/serial numbers.' args: 'Pre-fill Detailed Operations'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    check_company=True ondelete='cascade' args: 'stock.warehouse', 'Warehouse'
Public methods (8)
  • create(self, vals)
    @api.model
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_stock_picking_action_picking_type(self)
  • name_get(self)
    Display 'Warehouse_name: PickingType_name'
  • write(self, vals)

New fields (9)
  • company_id Many2one → res.company
    index=True required=True stored=True args: 'res.company', 'Company'
  • display_complete Boolean
    compute='_compute_display_complete'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' required=True args: 'Lot/Serial Number'
  • note Html
    string='Description'
  • product_id Many2one → product.product
    check_company=True domain=<expr> required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    readonly=False related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (3)
  • action_lot_open_quants(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (6)
  • category_id Many2one → product.category
    default=_default_category_id domain=_domain_category_id ondelete='cascade' args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • location_in_id Many2one → stock.location
    check_company=True default=_default_location_id domain="[('child_ids', '!=', False), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'stock.location', 'When product arrives in'
  • location_out_id Many2one → stock.location
    check_company=True domain="[('id', 'child_of', location_in_id), ('id', '!=', location_in_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'stock.location', 'Store to'
  • product_id Many2one → product.product
    check_company=True default=_default_product_id domain=_domain_product_id ondelete='cascade' args: 'product.product', 'Product'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
Public methods (1)
  • write(self, vals)

New fields (14)
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • in_date Datetime
    readonly=True args: 'Incoming Date'
  • inventory_quantity Float
    compute='_compute_inventory_quantity' groups='stock.group_stock_manager' inverse='_set_inventory_quantity' args: 'Inventoried Quantity'
  • location_id Many2one → stock.location
    auto_join=True check_company=True domain=<expr> index=True ondelete='restrict' readonly=True required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain=<expr> index=True ondelete='restrict' readonly=True args: 'stock.production.lot', 'Lot/Serial Number'
  • on_hand Boolean
    search='_search_on_hand' store=False args: 'On Hand'
  • owner_id Many2one → res.partner
    check_company=True help='This is the owner of the quant' readonly=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True domain="[('location_id', '=', location_id)]" help='The package containing this quant' ondelete='restrict' readonly=True args: 'stock.quant.package', 'Package'
  • product_id Many2one → product.product
    check_company=True domain=<expr> index=True ondelete='restrict' readonly=True required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    readonly=False related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    help='Quantity of products in this quant, in the default unit of measure of the product' readonly=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (8)
  • action_view_quants(self)
    @api.model
  • action_view_stock_moves(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
    @api.constrains('quantity')
  • create(self, vals)
    @api.model
    Override to handle the "inventory mode" and create a quant as superuser the conditions are met.
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Override to handle the "inventory mode" and set the `inventory_quantity` in view list grouped.
  • write(self, vals)
    Override to handle the "inventory mode" and create the inventory move.

New fields (6)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' compute_sudo=True index=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • packaging_id Many2one → product.packaging
    check_company=True index=True args: 'product.packaging', 'Package Type'
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
Public methods (4)
  • action_view_picking(self)
  • name_get(self)
  • unpack(self)
  • view_content_package(self)

New fields (1)
  • inventory_datetime Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_at_date(self)

New fields (7)
  • company_id Many2one
    related='picking_id.company_id'
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (23)
  • action Selection
    required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." index=True required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this delay.' args: 'Delay'
  • delay_alert Boolean
    help='Log an exception on the picking if this move has to be delayed (due to a change in the previous move scheduled date).' args: 'Alert if Delay'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_id Many2one → stock.location
    check_company=True required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    check_company=True help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_id Many2one → stock.picking.type
    check_company=True required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Take From Stock: the products will be taken from the available stock of the source location.\nTrigger Another Rule: the system will try to find a stock rule to bring the products in the source location. The available stock will be ignored.\nTake From Stock, if Unavailable, Trigger Another Rule: the products will be taken from the available stock of the source location.If there is no stock available, the system will try to find a rule to bring the products in the source location.' required=True string='Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule'), ('mts_else_mto', 'Take From Stock, if unavailable, Trigger Another Rule')]
  • propagate_cancel Boolean
    default=False help='When ticked, if the move created by this rule is cancelled, the next move will be cancelled too.' args: 'Cancel Next Move'
  • propagate_date Boolean
    default=True help='The rescheduling is propagated to the next move.' string='Propagate Rescheduling'
  • propagate_date_minimum_delta Integer
    default=1 help='The change must be higher than this value to be propagated' string='Reschedule if Higher Than'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_id Many2one → stock.location.route
    ondelete='cascade' required=True args: 'stock.location.route', 'Route'
  • route_sequence Integer
    compute_sudo=True readonly=False related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    check_company=True args: 'stock.warehouse', 'Warehouse'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    required=True string='Product Template' args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (17)
  • company_id Many2one → res.company
    default=<expr> required=True states={'done': [('readonly', True)]} string='Company' args: 'res.company'
  • date_done Datetime
    readonly=True args: 'Date'
  • location_id Many2one → stock.location
    check_company=True default=_get_default_location_id domain="[('usage', '=', 'internal'), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial'
  • move_id Many2one → stock.move
    check_company=True readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    check_company=True states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    check_company=True states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    check_company=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    check_company=True default=_get_default_scrap_location_id domain="[('scrap_location', '=', True), ('company_id', 'in', [company_id, False])]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    default=1.0 digits='Product Unit of Measure' required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • state Selection
    default='draft' readonly=True string='Status' tracking=True args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' args: 'Product Tracking'
Public methods (5)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • do_scrap(self)
  • unlink(self)

New fields (0)

No new fields.

Public methods (4)
  • get_html(self, given_context=None)
    @api.model
  • get_lines(self, line_id=None, **kw)
    @api.model
  • get_pdf(self, line_data=[])
  • get_pdf_lines(self, line_data=[])

New fields (2)
  • inventory_id Many2one → stock.inventory
    args: 'stock.inventory', 'Inventory'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)

New fields (3)
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    readonly=True args: [('lot', 'Tracked by lot'), ('serial', 'Tracked by serial number')]
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (28)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' index=True readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver goods directly (1 step)'), ('pick_ship', 'Send goods in output and then deliver (2 steps)'), ('pick_pack_ship', 'Pack goods, send goods in output and then deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'MTO rule'
  • name Char
    default=<expr> index=True required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    check_company=True default=<expr> args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly (1 step)'), ('two_steps', 'Receive goods in input and then stock (2 steps)'), ('three_steps', 'Receive goods in input, then quality and then stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.location.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.location.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • route_ids Many2many → stock.location.route
    check_company=True domain="[('warehouse_selectable', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Defaults routes through the warehouse' args: 'stock.location.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • sequence Integer
    default=10 help='Gives the sequence of this line when displaying the warehouses.'
  • show_resupply Boolean
    compute='_compute_show_resupply'
  • view_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]" required=True args: 'stock.location', 'View Location'
  • warehouse_count Integer
    compute='_compute_warehouse_count'
  • wh_input_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Quality Control Location'
Public methods (5)
  • action_view_all_routes(self)
  • create(self, vals)
    @api.model
  • create_resupply_routes(self, supplier_warehouses)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • write(self, vals)

New fields (15)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • allowed_location_ids One2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_ids'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days Integer
    default=1 help='Number of days after the orderpoint is triggered to receive the products or to order to the vendor' args: 'Lead Time'
  • lead_type Selection
    default='supplier' required=True args: [('net', 'Days to get the products'), ('supplier', 'Days to purchase')], 'Lead Type'
  • location_id Many2one → stock.location
    check_company=True ondelete='cascade' required=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> readonly=True required=True args: 'Name'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '=', 'product'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    digits='Product Unit of Measure' help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Maximum Quantity'
  • product_min_qty Float
    digits='Product Unit of Measure' help='When the virtual stock equals to or goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Minimum Quantity'
  • product_uom Many2one → uom.uom
    default=<expr> readonly=True related='product_id.uom_id' required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_name Char
    readonly=True related='product_uom.display_name' string='Product unit of measure label'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Qty Multiple'
  • warehouse_id Many2one → stock.warehouse
    check_company=True ondelete='cascade' required=True args: 'stock.warehouse', 'Warehouse'
Public methods (4)
  • create(self, vals)
    @api.model
  • default_get(self, fields)
    @api.model
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
    Finds location id for changed warehouse.
  • write(self, vals)

New fields (3)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Sylvain LE GAL, GitHub, Lucas Perais (lpe), Damien Bouvy, Wolfgang Taferner, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, Pierre Masereel, jem-odoo, Adrien Dieudonne, RomainLibert, Christophe Monniez, len-odoo, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, jev-odoo, Arnold Moyaux, Adrian Torres, mreficent, XavierDo, Julien Castiaux, Aurélien Warnon, Xavier-Do, jerome hanke (jhk), Andrea Grazioso (agr-odoo), Loan (lse), Fanny He, William Henrotin, Sébastien Theys, Akim Juillerat, fw-bot, Alex Tuyls, Anh Thao Pham (pta), Kinjal Mehta, Adrien Widart, Nasreddin Boulif (bon), Nicolas Galler, Swapnesh Shah, nie, Tiffany Chang (tic), Nathan Marotte (nama), Simran Gajsinghani, IEL, Yoshi Tashiro, Rémy Voet (ryv)
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (139)
XML IDNameModelTypeStatus
assets_common report_stock_rule assets ir.ui.view qweb Inherits web.report_assets_common
assets_common stock_location_barcodes pdf assets ir.ui.view qweb Inherits web.report_assets_common
assets_stock_print_report assets_stock_print_report ir.ui.view qweb Inherits web.assets_common
exception_on_picking exception_on_picking ir.ui.view qweb New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_level_form_view Package Level stock.package_level form New
package_level_tree_view_picking Package Level Tree Picking stock.package_level tree New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category group Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product sheet Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template field Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template xpath Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_label report_lot_label ir.ui.view qweb New
report_mrp_line report_mrp_line ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_type_label report_picking_type_label ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory report_stock_inventory ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
report_stock_rule report_stock_rule ir.ui.view qweb New
report_stock_rule_left_arrow report_stock_rule_left_arrow ir.ui.view qweb New
report_stock_rule_line report_stock_rule_line ir.ui.view qweb New
report_stock_rule_right_arrow report_stock_rule_right_arrow ir.ui.view qweb New
report_stock_rule_suspension_points report_stock_rule_suspension_points ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_assets_backend mrp_workorder assets ir.ui.view qweb Inherits web.assets_backend
stock_fixed_putaway_strat_form stock.fixed.putaway.strat.form stock.fixed.putaway.strat form New
stock_inventory_line_search stock.inventory.line.search stock.inventory.line search New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_inventory_line_tree2 stock.inventory.line.tree2 stock.inventory.line tree New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_location_route_view_search stock.location.route.search stock.location.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_move_tree Stock Moves stock.move tree New
stock_move_view_kanban stock.move.kanban2 stock.move kanban New
stock_package_destination_form_view stock.package.destination.view stock.package.destination form New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_product_search_form_view product.product.search.stock.form product.product xpath Inherits product.product_search_form_view
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_scrap_view_kanban stock.scrap.kanban stock.scrap kanban New
stock_warehouse_view_form_editable stock.warehouse.form.editable stock.warehouse xpath Inherits stock.view_warehouse
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warehouse_view_tree_editable stock.warehouse.tree.editable stock.warehouse xpath Inherits stock.view_warehouse_tree
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_picking_form stock.move.form stock.move form New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_move_tree_receipt_picking_board stock.move.tree3 stock.move tree New
view_overprocessed_transfer stock.overprocessed.transfer.view.form stock.overprocessed.transfer form New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_list stock.picking.type.list stock.picking.type tree New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_product_replenish Replenish product.replenish form New
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_form_simple stock.production.lot.form.simple stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway product.putaway.form product.putaway form New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_route_rule_form stock.rule.form stock.rule xpath Inherits stock.view_stock_rule_form
view_stock_inventory_kanban stock.inventory.kanban stock.inventory kanban New
view_stock_level_forecast_filter view.stock.level.forecast.filter report.stock.forecast search New
view_stock_level_forecast_graph Stock.forecast.graph report.stock.forecast graph New
view_stock_level_forecast_pivot Stock.forecast.pivot report.stock.forecast pivot New
view_stock_move_kanban stock.move.kanban stock.move kanban New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_nosuggest_operations stock.move.operations.nosuggest.form stock.move field Inherits stock.view_stock_move_operations
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template tree Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product tree Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_quantity_history Inventory Report stock.quantity.history form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_rule_filter stock.rule.select stock.rule search New
view_stock_rule_form stock.rule.form stock.rule form New
view_stock_rule_tree stock.rule.tree stock.rule tree New
view_stock_rules_report Stock Rules Report stock.rules.report form New
view_stock_track_confirmation stock.track.confirmation.view.form stock.track.confirmation form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template xpath Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (46)

New fields (1)
  • type Selection
    selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (3)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
Public methods (2)
  • run(self, product_id, product_qty, product_uom, location_id, name, origin, values)
    @api.model
    Method used in a procurement case. The purpose is to supply the product passed as argument in the location also given as an argument. In order to be able to find a suitable location that provide the product it will search among stock.rule.
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (3)
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.location.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.location.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.location.route'
Public methods (0)

No public methods.

New fields (10)
  • incoming_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • qty_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules'
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules'
  • stock_move_ids One2many → stock.move
    help='Technical: used to compute quantities.' args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    help='Technical: used to compute quantities.' args: 'stock.quant', 'product_id'
  • virtual_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecast Quantity'
Public methods (10)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_update_quantity_on_hand(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_theoretical_quantity(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, to_uom=None)
    @api.model
  • onchange_tracking(self)
    @api.onchange('tracking')
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (3)
  • fixed_location_ids One2many → stock.fixed.putaway.strat
    copy=True domain=[('category_id', '!=', False)] args: 'stock.fixed.putaway.strat', 'putaway_id', 'Fixed Locations Per Product Category'
  • name Char
    required=True args: 'Name'
  • product_location_ids One2many → stock.fixed.putaway.strat
    copy=True domain=[('product_id', '!=', False)] args: 'stock.fixed.putaway.strat', 'putaway_id', 'Fixed Locations Per Product'
Public methods (1)
  • putaway_apply(self, product)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (9)
  • date_planned Datetime
    help='Date at which the replenishment should take place.' args: 'Scheduled Date'
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    String='Product Template' required=True args: 'product.template'
  • product_uom_category_id Many2one → uom.category
    readonly=True related='product_id.uom_id.category_id' required=True args: 'uom.category'
  • product_uom_id Many2one → uom.uom
    required=True string='Unity of measure' args: 'uom.uom'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • route_ids Many2many → stock.location.route
    help="Apply specific route(s) for the replenishment instead of product's default routes." string='Preferred Routes' args: 'stock.location.route'
  • warehouse_id Many2one → stock.warehouse
    required=True string='Warehouse' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • launch_replenishment(self)

New fields (20)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • incoming_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    store=False args: 'stock.location', 'Location'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'inventory')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'production')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules'
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules'
  • responsible_id Many2one → res.users
    default=<expr> help='This user will be responsible of the next activities related to logistic operations for this product.' required=True string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    readonly=False related='categ_id.total_route_ids' relation='stock.location.route' string='Category Routes'
  • route_ids Many2many → stock.location.route
    domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO, etc.' args: 'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Customer Lead Time'
  • tracking Selection
    default='none' help='Ensure the traceability of a storable product in your warehouse.' required=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    selection_add=[('product', 'Storable Product')] track_visibility='onchange'
  • virtual_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    store=False args: 'stock.warehouse', 'Warehouse'
Public methods (7)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_update_quantity_on_hand(self)
  • action_view_orderpoints(self)
  • action_view_stock_move_lines(self)
  • onchange_tracking(self)
    @api.onchange('tracking')
  • write(self, vals)

New fields (6)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • cumulative_quantity Float
    readonly=True string='Cumulative Quantity'
  • date Date
    string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • quantity Float
    readonly=True
Public methods (1)
  • init(self)
    @api.model_cr

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • internal_transit_location_id Many2one → stock.location
    help='Technical field used for resupply routes between warehouses that belong to this company' on_delete='restrict' args: 'stock.location', 'Internal Transit Location'
  • propagation_minimum_delta Integer
    default=1 args: 'Minimum Delta for Propagation of a Date Change on moves linked together'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_transit_location(self)
    Create a transit location with company_id being the given company_id. This is needed in case of resuply routes between warehouses belonging to the same company, because we don't want to create accounting entries at that time.

New fields (20)
  • group_lot_on_delivery_slip Boolean
    implied_group='stock.group_lot_on_delivery_slip' args: 'Display Lots & Serial Numbers'
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_multi_warehouses Boolean
    implied_group='stock.group_stock_multi_warehouses' args: 'Multi-Warehouses'
  • group_stock_production_lot Boolean
    implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Delivery Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings for Stock'
  • module_delivery_bpost Boolean
    args: 'bpost'
  • module_delivery_dhl Boolean
    args: 'DHL USA'
  • module_delivery_easypost Boolean
    args: 'Easypost'
  • module_delivery_fedex Boolean
    args: 'FedEx'
  • module_delivery_ups Boolean
    args: 'UPS'
  • module_delivery_usps Boolean
    args: 'USPS'
  • module_procurement_jit Selection
    help='Reserving products manually in delivery orders or by running the scheduler is advised to better manage priorities in case of long customer lead times or/and frequent stock-outs.' args: [(1, 'Immediately after sales order confirmation'), (0, 'Manually or based on automatic scheduler')], 'Reservation'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_picking_batch Boolean
    oldname='module_stock_picking_wave' args: 'Batch Pickings'
  • propagation_minimum_delta Integer
    readonly=False related='company_id.propagation_minimum_delta' string='Minimum Delta for Propagation'
  • use_propagation_minimum_delta Boolean
    config_parameter='stock.use_propagation_minimum_delta' help='Rescheduling applies to any chain of operations (e.g. Make To Order, Pick Pack Ship). In the case of MTO sales, a vendor delay (updated incoming date) impacts the expected delivery date to the customer. \n This option allows to not propagate the rescheduling if the change is not critical.' oldname='default_new_propagation_minimum_delta' string='No Rescheduling Propagation'
Public methods (2)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)
    @api.multi

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    company_dependent=True help='The stock location used as destination when sending goods to this contact.' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    company_dependent=True help='The stock location used as source when receiving goods from this contact.' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (1)
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
Public methods (2)
  • process(self)
  • process_cancel_backorder(self)

New fields (5)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • new_quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    readonly=False related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (7)
  • change_product_qty(self)
    Changes the Product Quantity by making a Physical Inventory.
  • check_new_quantity(self)
    @api.constrains('new_quantity')
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model
  • onchange_location_id(self)
    @api.onchange('location_id', 'product_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_id_dict(self, product_id)

New fields (5)
  • category_id Many2one → product.category
    args: 'product.category', 'Product Category'
  • fixed_location_id Many2one → stock.location
    required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • putaway_id Many2one → product.putaway
    required=True args: 'product.putaway', 'Put Away Method'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
Public methods (0)

No public methods.

New fields (1)
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_transfer_rel'
Public methods (1)
  • process(self)

New fields (15)
  • category_id Many2one → product.category
    help='Specify Product Category to focus your inventory on a particular Category.' readonly=True states={'draft': [('readonly', False)]} args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='If the inventory adjustment is not validated, date at which the theoritical quantities have been checked.\nIf the inventory adjustment is validated, date at which the inventory adjustment has been validated.' readonly=True required=True args: 'Inventory Date'
  • exhausted Boolean
    readonly=True states={'draft': [('readonly', False)]} args: 'Include Exhausted Products'
  • filter Selection
    default='none' help="If you do an entire inventory, you can choose 'All Products' and it will prefill the inventory with the current stock. If you only do some products (e.g. Cycle Counting) you can choose 'Manual Selection of Products' and the system won't propose anything. You can also let the system propose for a single product / lot /... " required=True selection='_selection_filter' string='Inventory of'
  • line_ids One2many → stock.inventory.line
    copy=True readonly=False states={'done': [('readonly', True)]} string='Inventories' args: 'stock.inventory.line', 'inventory_id'
  • location_id Many2one → stock.location
    default=_default_location_id readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Inventoried Location'
  • lot_id Many2one → stock.production.lot
    copy=False help='Specify Lot/Serial Number to focus your inventory on a particular Lot/Serial Number.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.production.lot', 'Inventoried Lot/Serial Number'
  • move_ids One2many → stock.move
    states={'done': [('readonly', True)]} string='Created Moves' args: 'stock.move', 'inventory_id'
  • name Char
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'Inventory Reference'
  • package_id Many2one → stock.quant.package
    help='Specify Pack to focus your inventory on a particular Pack.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.quant.package', 'Inventoried Pack'
  • partner_id Many2one → res.partner
    help='Specify Owner to focus your inventory on a particular Owner.' readonly=True states={'draft': [('readonly', False)]} args: 'res.partner', 'Inventoried Owner'
  • product_id Many2one → product.product
    help='Specify Product to focus your inventory on a particular Product.' readonly=True states={'draft': [('readonly', False)]} args: 'product.product', 'Inventoried Product'
  • state Selection
    copy=False default='draft' index=True readonly=True selection=[('draft', 'Draft'), ('cancel', 'Cancelled'), ('confirm', 'In Progress'), ('done', 'Validated')] string='Status'
  • total_qty Float
    compute='_compute_total_qty' args: 'Total Quantity'
Public methods (8)
  • action_cancel_draft(self)
  • action_check(self)
    Checks the inventory and computes the stock move to do
  • action_inventory_line_tree(self)
  • action_reset_product_qty(self)
  • action_start(self)
  • action_validate(self)
  • post_inventory(self)
  • unlink(self)
    @api.multi

New fields (14)
  • company_id Many2one → res.company
    index=True readonly=True related='inventory_id.company_id' store=True args: 'res.company', 'Company'
  • inventory_id Many2one → stock.inventory
    index=True ondelete='cascade' args: 'stock.inventory', 'Inventory'
  • inventory_location_id Many2one → stock.location
    readonly=False related='inventory_id.location_id' related_sudo=False args: 'stock.location', 'Inventory Location'
  • location_id Many2one → stock.location
    index=True required=True args: 'stock.location', 'Location'
  • package_id Many2one → stock.quant.package
    index=True args: 'stock.quant.package', 'Pack'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Owner'
  • prod_lot_id Many2one → stock.production.lot
    domain="[('product_id','=',product_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • product_id Many2one → product.product
    domain=[('type', '=', 'product')] index=True required=True args: 'product.product', 'Product'
  • product_qty Float
    default=0 digits=dp.get_precision('Product Unit of Measure') args: 'Checked Quantity'
  • product_tracking Selection
    readonly=True related='product_id.tracking' args: 'Tracking'
  • product_uom_category_id Many2one
    readonly=True related='product_uom_id.category_id' string='Uom category'
  • product_uom_id Many2one → uom.uom
    required=True args: 'uom.uom', 'Product Unit of Measure'
  • state Selection
    readonly=True related='inventory_id.state' args: 'Status'
  • theoretical_qty Float
    compute='_compute_theoretical_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True args: 'Theoretical Quantity'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)
    @api.multi

New fields (19)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False oldname='loc_barcode' args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • comment Text
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Full Location Name'
  • location_id Many2one → stock.location
    help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True args: 'Location Name'
  • parent_path Char
    index=True
  • partner_id Many2one → res.partner
    help='Owner of the location if not internal' args: 'res.partner', 'Owner'
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_strategy_id Many2one → product.putaway
    help='Allows to suggest the exact location (shelf) where to store the product.' args: 'product.putaway', 'Put Away Strategy'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.removal', 'Removal Strategy'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Procurement: Virtual location serving as temporary counterpart for procurement operations when the source (vendor or production) is not known yet. This location should be empty when the procurement scheduler has finished running.\n* Production: Virtual counterpart location for production operations: this location consumes the raw material and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location')]
Public methods (6)
  • default_get(self, fields)
    @api.model
  • get_putaway_strategy(self, product)
    Returns the location where the product has to be put, if any compliant putaway strategy is found. Otherwise returns None.
  • get_warehouse(self)
    @api.returns('stock.warehouse', <expr>)
    Returns warehouse id of warehouse that contains location
  • name_get(self)
  • should_bypass_reservation(self)
  • write(self, values)

New fields (13)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    copy=False args: 'product.category', 'stock_location_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category.' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    copy=False args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form.' args: 'Applicable on Product'
  • rule_ids One2many → stock.rule
    copy=True args: 'stock.rule', 'route_id', 'Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_ids Many2many → stock.warehouse
    copy=False args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse.' args: 'Applicable on Warehouse'
Public methods (3)
  • toggle_active(self)
  • view_categ_ids(self)
  • view_product_ids(self)

New fields (58)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • backorder_id Many2one → stock.picking
    index=True readonly=False related='picking_id.backorder_id' args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date Datetime
    default=fields.Datetime.now help='Move date: scheduled date until move is done, then date of actual move processing' index=True required=True states={'done': [('readonly', True)]} args: 'Date'
  • date_expected Datetime
    default=fields.Datetime.now help='Scheduled date for the processing of this move' index=True required=True states={'done': [('readonly', True)]} args: 'Expected Date'
  • group_id Many2one → procurement.group
    default=_default_group_id args: 'procurement.group', 'Procurement Group'
  • has_move_lines Boolean
    compute='_compute_has_move_lines'
  • has_tracking Selection
    readonly=True related='product_id.tracking' string='Product with Tracking'
  • inventory_id Many2one → stock.inventory
    args: 'stock.inventory', 'Inventory'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    auto_join=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=[('product_qty', '=', 0.0)] args: 'stock.move.line', 'move_id'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    index=True required=True args: 'Description'
  • note Text
    args: 'Notes'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    copy=False help='Move that created the return move' index=True args: 'stock.move', 'Origin return move'
  • package_level_id Many2one → stock.package_level
    args: 'stock.package_level', 'Package Level'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer Reference'
  • picking_partner_id Many2one → res.partner
    readonly=False related='picking_id.partner_id' args: 'res.partner', 'Transfer Destination Address'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom." args: 'Unit Price'
  • priority Selection
    default='1' args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_packaging Many2one → product.packaging
    help='It specifies attributes of packaging like type, quantity of packaging,etc.' args: 'product.packaging', 'Preferred Packaging'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    help='Technical: used in views' readonly=False related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one → uom.uom
    required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Initial Demand'
  • propagate Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • quantity_done Float
    compute='_quantity_done_compute' digits=dp.get_precision('Product Unit of Measure') inverse='_quantity_done_set' args: 'Quantity Done'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reserved_availability Float
    compute='_compute_reserved_availability' digits=dp.get_precision('Product Unit of Measure') help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • restrict_partner_id Many2one → res.partner
    help="Technical field used to depict a restriction on the ownership of quants to consider when marking this move as 'done'" args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.location.route
    help='Preferred route' args: 'stock.location.route', 'stock_location_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → stock.rule
    help='The stock rule that created this stock move' ondelete='restrict' args: 'stock.rule', 'Stock Rule'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'move_id'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_operations Boolean
    readonly=False related='picking_id.picking_type_id.show_operations'
  • show_reserved_availability Boolean
    compute='_compute_show_reserved_availability' args: 'From Supplier'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • string_availability_info Text
    compute='_compute_string_qty_information' help='Show various information on stock availability for this move' readonly=True args: 'Availability'
  • warehouse_id Many2one → stock.warehouse
    help='Technical field depicting the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • init(self)
    @api.model_cr
  • name_get(self)
  • onchange_date(self)
    @api.onchange('date_expected')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • onchange_quantity(self)
    @api.onchange('product_id', 'product_qty')
  • unlink(self)
  • write(self, vals)

New fields (27)
  • consume_line_ids Many2many → stock.move.line
    help='Technical link to see who consumed what. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • is_initial_demand_editable Boolean
    readonly=False related='move_id.is_initial_demand_editable'
  • is_locked Boolean
    default=True readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    required=True args: 'stock.location', 'From'
  • lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number Name'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    help='Change to a better name' index=True args: 'stock.move', 'Stock Move'
  • owner_id Many2one → res.partner
    help='Owner of the quants' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • package_level_id Many2one → stock.package_level
    args: 'stock.package_level', 'Package Level'
  • picking_id Many2one → stock.picking
    auto_join=True help='The stock operation where the packing has been made' args: 'stock.picking', 'Stock Picking'
  • picking_type_entire_packs Boolean
    readonly=True related='picking_id.picking_type_id.show_entire_packs'
  • picking_type_use_create_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_create_lots'
  • picking_type_use_existing_lots Boolean
    readonly=True related='picking_id.picking_type_id.use_existing_lots'
  • produce_line_ids Many2many → stock.move.line
    help='Technical link to see which line was produced with this. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_id Many2one → product.product
    ondelete='cascade' args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=False digits=0 inverse='_set_product_qty' store=True args: 'Real Reserved Quantity'
  • product_uom_id Many2one → uom.uom
    required=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') required=True args: 'Reserved'
  • qty_done Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') args: 'Done'
  • reference Char
    readonly=False related='move_id.reference' related_sudo=False store=True
  • result_package_id Many2one → stock.quant.package
    help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    readonly=False related='move_id.state' related_sudo=False store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
Public methods (7)
  • check_reserved_done_quantity(self)
    @api.constrains('product_uom_qty')
  • create(self, vals_list)
    @api.model_create_multi
  • init(self)
    @api.model_cr
  • onchange_product_id(self)
    @api.onchange('product_id', 'product_uom_id')
  • onchange_serial_number(self)
    @api.onchange('lot_name', 'lot_id')
    When the user is encoding a move line for a tracked product, we apply some logic to help him. This includes: - automatically switch `qty_done` to 1.0 - warn if he has already encoded `lot_name` in another move line
  • unlink(self)
  • write(self, vals)

New fields (2)
  • overprocessed_product_name Char
    compute='_compute_overprocessed_product_name' readonly=True
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (1)
  • action_confirm(self)
    @api.multi

New fields (4)
  • filtered_location One2many → stock.location
    comodel_name='stock.location' compute='_filter_location'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination location'
  • move_line_ids Many2many → stock.move.line
    compute='_compute_move_line_ids' required=True args: 'stock.move.line', 'Products'
  • picking_id Many2one → stock.picking
    required=True args: 'stock.picking'
Public methods (1)
  • action_done(self)

New fields (12)
  • is_done Boolean
    compute='_compute_is_done' inverse='_set_is_done' args: 'Done'
  • is_fresh_package Boolean
    compute='_compute_fresh_pack'
  • location_dest_id Many2one → stock.location
    args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    compute='_compute_location_id' args: 'stock.location', 'From'
  • move_ids One2many → stock.move
    args: 'stock.move', 'package_level_id'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'package_level_id'
  • package_id Many2one → stock.quant.package
    required=True args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Picking'
  • picking_source_location Many2one → stock.location
    readonly=False related='picking_id.location_id' args: 'stock.location'
  • show_lots_m2o Boolean
    compute='_compute_show_lot'
  • show_lots_text Boolean
    compute='_compute_show_lot'
  • state Selection
    compute='_compute_state' string='State' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('assigned', 'Reserved'), ('new', 'New'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (3)
  • create(self, vals)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (39)
  • backorder_id Many2one → stock.picking
    copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.picking', 'Back Order of'
  • backorder_ids One2many → stock.picking
    args: 'stock.picking', 'backorder_id', 'Back Orders'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Creation Date, usually the time of the order' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} track_visibility='onchange' args: 'Creation Date'
  • date_done Datetime
    copy=False help='Date at which the transfer has been processed or cancelled.' readonly=True args: 'Date of Transfer'
  • group_id Many2one → procurement.group
    readonly=True related='move_lines.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • immediate_transfer Boolean
    default=False
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • location_dest_id Many2one → stock.location
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Source Location'
  • move_ids_without_package One2many → stock.move
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] string='Stock moves not in package' args: 'stock.move', 'picking_id'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_line_ids_without_package One2many → stock.move.line
    domain=['|', ('package_level_id', '=', False), ('picking_type_entire_packs', '=', False)] args: 'stock.move.line', 'picking_id', 'Operations without package'
  • move_lines One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Reference'
  • note Text
    args: 'Notes'
  • origin Char
    help='Reference of the document' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    help='Default Owner' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_level_ids One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • package_level_ids_details One2many → stock.package_level
    args: 'stock.package_level', 'picking_id'
  • partner_id Many2one → res.partner
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Partner'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code' args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')]
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    args: 'Printed'
  • priority Selection
    compute='_compute_priority' help='Priority for this picking. Setting manually a value here would set it as priority for all the moves' index=True inverse='_set_priority' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True string='Priority' track_visibility='onchange' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_lines.product_id' args: 'product.product', 'Product'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' store=True track_visibility='onchange' args: 'Scheduled Date'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the check availability button should be shown.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_mark_as_todo Boolean
    compute='_compute_show_mark_as_todo' help='Technical field used to compute whether the mark as todo button should be shown.'
  • show_operations Boolean
    compute='_compute_show_operations'
  • show_validate Boolean
    compute='_compute_show_validate' help='Technical field used to compute whether the validate should be shown.'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: not confirmed yet and will not be scheduled until confirmed.\n * Waiting Another Operation: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows).\n * Waiting: if it is not ready to be sent because the required products could not be reserved.\n * Ready: products are reserved and ready to be sent. If the shipping policy is 'As soon as possible' this happens as soon as anything is reserved.\n * Done: has been processed, can't be modified or cancelled anymore.\n * Cancelled: has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='Status' track_visibility='onchange' args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (22)
  • action_assign(self)
    @api.multi
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_assign_owner(self)
    @api.one
  • action_assign_partner(self)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
    Changes picking state to done by processing the Stock Moves of the Picking Normally that happens when the button "Done" is pressed on a Picking view. @return: True
  • action_generate_backorder_wizard(self)
  • action_picking_move_tree(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_toggle_is_locked(self)
  • button_scrap(self)
  • button_validate(self)
    @api.multi
  • check_destinations(self)
  • create(self, vals)
    @api.model
  • do_print_picking(self)
    @api.multi
  • do_unreserve(self)
    @api.multi
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'partner_id')
  • put_in_pack(self)
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (25)
  • active Boolean
    default=True args: 'Active'
  • barcode Char
    copy=False args: 'Barcode'
  • code Selection
    required=True args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • default_location_dest_id Many2one → stock.location
    help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • last_done_picking Char
    compute='_compute_last_done_picking' args: 'Last 10 Done Pickings'
  • name Char
    required=True translate=True args: 'Operation Type'
  • rate_picking_backorders Integer
    compute='_compute_picking_count'
  • rate_picking_late Integer
    compute='_compute_picking_count'
  • return_picking_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_id Many2one → ir.sequence
    required=True args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If ticked, you will be able to select entire packages to move' args: 'Move Entire Packages'
  • show_operations Boolean
    default=False help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_reserved Boolean
    default=True help='If this checkbox is ticked, Odoo will show which products are reserved (lot/serial number, source location, source package).' args: 'Show Reserved'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    default=<expr> ondelete='cascade' args: 'stock.warehouse', 'Warehouse'
Public methods (8)
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_stock_picking_action_picking_type(self)
  • name_get(self)
    Display 'Warehouse_name: PickingType_name'
  • onchange_picking_code(self)
    @api.onchange('code')
  • onchange_show_operations(self)
    @api.onchange('show_operations')

New fields (6)
  • name Char
    default=<expr> help='Unique Lot/Serial Number' required=True args: 'Lot/Serial Number'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    readonly=False related='product_id.uom_id' store=True args: 'uom.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)
    @api.multi

New fields (11)
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • in_date Datetime
    readonly=True args: 'Incoming Date'
  • location_id Many2one → stock.location
    auto_join=True index=True ondelete='restrict' readonly=True required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    index=True ondelete='restrict' readonly=True args: 'stock.production.lot', 'Lot/Serial Number'
  • owner_id Many2one → res.partner
    help='This is the owner of the quant' readonly=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    help='The package containing this quant' ondelete='restrict' readonly=True args: 'stock.quant.package', 'Package'
  • product_id Many2one → product.product
    index=True ondelete='restrict' readonly=True required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    readonly=False related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
  • quantity Float
    help='Quantity of products in this quant, in the default unit of measure of the product' oldname='qty' readonly=True required=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
Public methods (4)
  • action_view_stock_moves(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
    @api.constrains('quantity')

New fields (6)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True store=True args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True store=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' index=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • packaging_id Many2one → product.packaging
    index=True args: 'product.packaging', 'Package Type'
  • quant_ids One2many → stock.quant
    domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)] readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
Public methods (4)
  • action_view_picking(self)
  • name_get(self)
  • unpack(self)
  • view_content_package(self)

New fields (2)
  • compute_at_date Selection
    help='Choose to analyze the current inventory or from a specific date in the past.' string='Compute' args: [(0, 'Current Inventory'), (1, 'At a Specific Date')]
  • date Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_table(self)

New fields (6)
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), ('return_location', '=', True)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    readonly=False related='move_id.product_uom' string='Unit of Measure' args: 'uom.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (20)
  • action Selection
    required=True selection=[('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." index=True required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • delay Integer
    default=0 help='The expected date of the created transfer will be computed based on this delay.' args: 'Delay'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination Location'
  • location_src_id Many2one → stock.location
    args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    help='Address where goods should be delivered. Optional.' args: 'res.partner', 'Partner Address'
  • picking_type_id Many2one → stock.picking.type
    required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help='Create Procurement: A procurement will be created in the source location and the system will try to find a rule to resolve it. The available stock will be ignored.\n Take from Stock: The products will be taken from the available stock.' required=True string='Move Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Trigger Another Rule')]
  • propagate Boolean
    default=True help='When ticked, if the move is splitted or cancelled, the next move will be too.' args: 'Propagate cancel and split'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_id Many2one → stock.location.route
    ondelete='cascade' required=True args: 'stock.location.route', 'Route'
  • route_sequence Integer
    compute_sudo=True readonly=False related='route_id.sequence' store=True args: 'Route Sequence'
  • rule_message Html
    compute='_compute_action_message'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Warehouse'
Public methods (0)

No public methods.

New fields (4)
  • product_has_variants Boolean
    default=False required=True args: 'Has variants'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    String='Product Template' required=True args: 'product.template'
  • warehouse_ids Many2many → stock.warehouse
    help='Show the routes that apply on selected warehouses.' required=True string='Warehouses' args: 'stock.warehouse'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • print_report(self)

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (15)
  • date_expected Datetime
    default=fields.Datetime.now args: 'Expected Date'
  • location_id Many2one → stock.location
    default=_get_default_location_id domain="[('usage', '=', 'internal')]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    default=_get_default_scrap_location_id domain="[('scrap_location', '=', True)]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' args: 'Product Tracking'
Public methods (7)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • create(self, vals)
    @api.model
  • do_scrap(self)
    @api.multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • unlink(self)

New fields (0)

No new fields.

Public methods (4)
  • get_html(self, given_context=None)
    @api.model
  • get_lines(self, line_id=None, **kw)
    @api.model
  • get_pdf(self, line_data=[])
  • get_pdf_lines(self, line_data=[])

New fields (2)
  • inventory_id Many2one → stock.inventory
    args: 'stock.inventory', 'Inventory'
  • tracking_line_ids One2many → stock.track.line
    args: 'stock.track.line', 'wizard_id'
Public methods (1)
  • action_confirm(self)
    @api.one

New fields (3)
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • tracking Selection
    readonly=True args: [('lot', 'Tracked by lot'), ('serial', 'Tracked by serial number')]
  • wizard_id Many2one → stock.track.confirmation
    readonly=True args: 'stock.track.confirmation'
Public methods (0)

No public methods.

New fields (28)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' index=True readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Crossdock Route'
  • delivery_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Deliver goods directly (1 step)'), ('pick_ship', 'Send goods in output and then deliver (2 steps)'), ('pick_pack_ship', 'Pack goods, send goods in output and then deliver (3 steps)')], 'Outgoing Shipments'
  • in_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    domain=[('usage', '=', 'internal')] required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'MTO rule'
  • name Char
    default=<expr> index=True required=True args: 'Warehouse'
  • out_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly (1 step)'), ('two_steps', 'Receive goods in input and then stock (2 steps)'), ('three_steps', 'Receive goods in input, then quality and then stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.location.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.location.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    help='Routes will be created automatically to resupply this warehouse from the warehouses ticked' args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply From'
  • route_ids Many2many → stock.location.route
    domain="[('warehouse_selectable', '=', True)]" help='Defaults routes through the warehouse' args: 'stock.location.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • show_resupply Boolean
    compute='_compute_show_resupply'
  • view_location_id Many2one → stock.location
    domain=[('usage', '=', 'view')] required=True args: 'stock.location', 'View Location'
  • warehouse_count Integer
    compute='_compute_warehouse_count'
  • warehouse_count Integer
    compute='_compute_warehouse_count'
  • wh_input_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Quality Control Location'
Public methods (5)
  • action_view_all_routes(self)
  • create(self, vals)
    @api.model
  • create_resupply_routes(self, supplier_warehouses)
  • get_rules_dict(self)
    Define the rules source/destination locations, picking_type and action needed for each warehouse route configuration.
  • write(self, vals)

New fields (13)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days Integer
    default=1 help='Number of days after the orderpoint is triggered to receive the products or to order to the vendor' args: 'Lead Time'
  • lead_type Selection
    default='supplier' required=True args: [('net', 'Day(s) to get the products'), ('supplier', 'Day(s) to purchase')], 'Lead Type'
  • location_id Many2one → stock.location
    ondelete='cascade' required=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> required=True args: 'Name'
  • product_id Many2one → product.product
    domain=[('type', '=', 'product')] ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Maximum Quantity'
  • product_min_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Minimum Quantity'
  • product_uom Many2one → uom.uom
    default=<expr> readonly=True related='product_id.uom_id' required=True args: 'uom.uom', 'Product Unit of Measure'
  • qty_multiple Float
    default=1 digits=dp.get_precision('Product Unit of Measure') help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Qty Multiple'
  • warehouse_id Many2one → stock.warehouse
    ondelete='cascade' required=True args: 'stock.warehouse', 'Warehouse'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
    Finds location id for changed warehouse.

New fields (3)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Joren Van Onder, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Atul Patel, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Olivier Colson, Wolfgang Taferner, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Pierre Masereel, Laurent Smet, Denis Vermylen (dve), fwi-odoo, Adrien Dieudonne, Christophe Monniez, len-odoo, Nans Lefebvre, amoyaux, Arnold Moyaux, tdi-odoo, Adrian Torres, rar-odoo, Daniel Reis, Loan (lse), Andrea, Fanny He, Enric Tobella, William Henrotin, Xavier Dubuc
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - barcodes
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (129)
XML IDNameModelTypeStatus
assets_common stock_location_barcodes pdf assets ir.ui.view qweb Inherits web.report_assets_common
assets_stock_print_report assets_stock_print_report ir.ui.view qweb Inherits web.assets_common
inventory_planner inventory_planner ir.ui.view qweb New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
procurement_group_form_view procurement.group.form procurement.group form New
product_category_form_view_inherit product.category.form product.category group Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product sheet Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template field Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template field Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_barcode report_lot_barcode ir.ui.view qweb New
report_mrp_line report_mrp_line ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_stock_body_print report_stock_body_print ir.ui.view qweb New
report_stock_inventory report_stock_inventory ir.ui.view qweb New
report_stock_inventory_print report_stock_inventory_print ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.stock res.config.settings xpath Inherits base.res_config_settings_view_form
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_assets_backend mrp_workorder assets ir.ui.view qweb Inherits web.assets_backend
stock_incoterms_form stock.incoterms.form stock.incoterms form New
stock_incoterms_view_search stock.incoterms.search stock.incoterms search New
stock_inventory_line_search stock.inventory.line.search stock.inventory.line search New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_inventory_line_tree2 stock.inventory.line.tree2 stock.inventory.line tree New
stock_location_path_filter stock.location.path.select stock.location.path search New
stock_location_path_form stock.location.path.form stock.location.path form New
stock_location_path_tree stock.location.path.tree stock.location.path tree New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_location_route_view_search stock.location.route.search stock.location.route search New
stock_location_view_form_editable stock.location.form.editable stock.location xpath Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.tree2.editable stock.location xpath Inherits stock.view_location_tree2
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_move_tree Stock Moves stock.move tree New
stock_move_view_kanban stock.move.kanban2 stock.move kanban New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_quant_view_graph stock.quant.graph stock.quant graph New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_warehouse_view_form_editable stock.warehouse.form.editable stock.warehouse xpath Inherits stock.view_warehouse
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
stock_warehouse_view_tree_editable stock.warehouse.tree.editable stock.warehouse xpath Inherits stock.view_warehouse_tree
stock_warn_insufficient_qty_form_view stock.warn.insufficient.qty stock.warn.insufficient.qty form New
stock_warn_insufficient_qty_scrap_form_view stock.warn.insufficient.qty.scrap stock.warn.insufficient.qty.scrap xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_incoterms_tree stock.incoterms.tree stock.incoterms tree New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_kandan stock.move.kanban stock.move kanban New
view_move_line_form stock.move.line.form stock.move.line form New
view_move_line_tree stock.move.line.tree stock.move.line tree New
view_move_picking_form stock.move.form stock.move form New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_move_tree_receipt_picking_board stock.move.tree3 stock.move tree New
view_overprocessed_transfer stock.overprocessed.transfer.view.form stock.overprocessed.transfer form New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_move_tree stock.picking.move.tree stock.move tree New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_list stock.picking.type.list stock.picking.type tree New
view_picking_type_tree Operation types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Schedulers Manually stock.scheduler.compute form New
view_procurement_rule_filter procurement.rule.select procurement.rule search New
view_procurement_rule_form procurement.rule.form procurement.rule form New
view_procurement_rule_tree procurement.rule.tree procurement.rule tree New
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_form_simple stock.production.lot.form.simple stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway product.putaway.form product.putaway form New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_kanban stock.quant.package.kanban stock.quant.package kanban New
view_quant_package_picking_tree stock.quant.package.picking.tree stock.quant.package tree New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_stock_inventory_kanban stock.inventory.kanban stock.inventory kanban New
view_stock_level_forecast_filter view.stock.level.forecast.filter report.stock.forecast search New
view_stock_level_forecast_graph Stock.forecast.graph report.stock.forecast graph New
view_stock_level_forecast_pivot Stock.forecast.pivot report.stock.forecast pivot New
view_stock_move_kanban stock.move.kanban stock.move kanban New
view_stock_move_line_kanban stock.move.line.kanban stock.move.line kanban New
view_stock_move_line_operation_tree stock.move.line.operations.tree stock.move.line tree New
view_stock_move_nosuggest_operations stock.move.operations.nosuggest.form stock.move field Inherits stock.view_stock_move_operations
view_stock_move_operations stock.move.operations.form stock.move form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template tree Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product tree Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_quantity_history Inventory Report stock.quantity.history form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_warehouse_orderpoint_kanban stock.warehouse.orderpoint.kanban stock.warehouse.orderpoint kanban New
view_template_property_form product.template.stock.property.form.inherit product.template group Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (42)

New fields (1)
  • type Selection
    selection_add=[('weight', 'Weighted Product'), ('location', 'Location'), ('lot', 'Lot'), ('package', 'Package')]
Public methods (0)

No public methods.

New fields (3)
  • move_type Selection
    default='direct' required=True string='Delivery Type' args: [('direct', 'Partial'), ('one', 'All at once')]
  • name Char
    default=<expr> required=True args: 'Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
Public methods (2)
  • run(self, product_id, product_qty, product_uom, location_id, name, origin, values)
    @api.model
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (18)
  • action Selection
    required=True selection=[('move', 'Move From Another Location')] string='Action'
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the rule without removing it.' args: 'Active'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • delay Integer
    default=0 args: 'Number of Days'
  • group_id Many2one → procurement.group
    args: 'procurement.group', 'Fixed Procurement Group'
  • group_propagation_option Selection
    default='propagate' string='Propagation of Procurement Group' args: [('none', 'Leave Empty'), ('propagate', 'Propagate'), ('fixed', 'Fixed')]
  • location_id Many2one → stock.location
    args: 'stock.location', 'Procurement Location'
  • location_src_id Many2one → stock.location
    help='Source location is action=move' args: 'stock.location', 'Source Location'
  • name Char
    help='This field will fill the packing origin and the name of its moves' required=True translate=True args: 'Name'
  • partner_address_id Many2one → res.partner
    args: 'res.partner', 'Partner Address'
  • picking_type_id Many2one → stock.picking.type
    help='Operation Type determines the way the picking should be shown in the view, reports, ...' required=True args: 'stock.picking.type', 'Operation Type'
  • procure_method Selection
    default='make_to_stock' help="Determines the procurement method of the stock move that will be generated: whether it will need to 'take from the available stock' in its source location or needs to ignore its stock and create a procurement over there." required=True string='Move Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Create Procurement')]
  • propagate Boolean
    default=True help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_id Many2one → stock.location.route
    ondelete='cascade' required=True args: 'stock.location.route', 'Route'
  • route_sequence Integer
    related='route_id.sequence' store=True args: 'Route Sequence'
  • sequence Integer
    default=20 args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    help='The warehouse this rule is for' args: 'stock.warehouse', 'Served Warehouse'
Public methods (0)

No public methods.

New fields (3)
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.location.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.location.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.location.route'
Public methods (0)

No public methods.

New fields (10)
  • incoming_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Quantity of planned incoming products.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Quantity of planned outgoing products.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • qty_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules'
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules'
  • stock_move_ids One2many → stock.move
    help='Technical: used to compute quantities.' args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    help='Technical: used to compute quantities.' args: 'stock.quant', 'product_id'
  • virtual_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecast Quantity'
Public methods (7)
  • action_open_product_lot(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • onchange_tracking(self)
    @api.onchange('tracking')
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)

New fields (2)
  • fixed_location_ids One2many → stock.fixed.putaway.strat
    copy=True help='When the method is fixed, this location will be used to store the products' args: 'stock.fixed.putaway.strat', 'putaway_id', 'Fixed Locations Per Product Category'
  • name Char
    required=True args: 'Name'
Public methods (1)
  • putaway_apply(self, product)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (20)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • description_pickingin Text
    translate=True args: 'Description on Receptions'
  • description_pickingout Text
    translate=True args: 'Description on Delivery Orders'
  • incoming_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    search=<expr> store=False args: 'stock.location', 'Location'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'inventory')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_production Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'production')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules'
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules'
  • responsible_id Many2one → res.users
    default=<expr> required=True string='Responsible' args: 'res.users'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' relation='stock.location.route' string='Category Routes'
  • route_ids Many2many → stock.location.route
    domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,...' args: 'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="The average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers." args: 'Customer Lead Time'
  • tracking Selection
    default='none' required=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    selection_add=[('product', 'Stockable Product')] track_visibility='onchange'
  • virtual_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    search=<expr> store=False args: 'stock.warehouse', 'Warehouse'
Public methods (7)
  • action_open_product_lot(self)
  • action_open_quants(self)
  • action_view_orderpoints(self)
  • action_view_routes(self)
  • action_view_stock_move_lines(self)
  • onchange_tracking(self)
    @api.onchange('tracking')
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)

New fields (5)
  • cumulative_quantity Float
    readonly=True string='Cumulative Quantity'
  • date Date
    string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • quantity Float
    readonly=True
Public methods (1)
  • init(self)
    @api.model_cr

New fields (2)
  • internal_transit_location_id Many2one → stock.location
    help='Technical field used for resupply routes between warehouses that belong to this company' on_delete='restrict' args: 'stock.location', 'Internal Transit Location'
  • propagation_minimum_delta Integer
    default=1 args: 'Minimum Delta for Propagation of a Date Change on moves linked together'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_transit_location(self)
    @api.one
    Create a transit location with company_id being the given company_id. This is needed in case of resuply routes between warehouses belonging to the same company, because we don't want to create accounting entries at that time.

New fields (18)
  • group_stock_adv_location Boolean
    help='Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks).' implied_group='stock.group_adv_location' args: 'Multi-Step Routes'
  • group_stock_multi_locations Boolean
    help='Store products in specific locations of your warehouse (e.g. bins, racks) and to track inventory accordingly.' implied_group='stock.group_stock_multi_locations' args: 'Storage Locations'
  • group_stock_multi_warehouses Boolean
    implied_group='stock.group_stock_multi_warehouses' args: 'Multi-Warehouses'
  • group_stock_production_lot Boolean
    implied_group='stock.group_production_lot' args: 'Lots & Serial Numbers'
  • group_stock_tracking_lot Boolean
    implied_group='stock.group_tracking_lot' args: 'Delivery Packages'
  • group_stock_tracking_owner Boolean
    implied_group='stock.group_tracking_owner' args: 'Consignment'
  • group_warning_stock Boolean
    implied_group='stock.group_warning_stock' args: 'Warnings'
  • module_delivery_bpost Boolean
    args: 'bpost'
  • module_delivery_dhl Boolean
    args: 'DHL USA'
  • module_delivery_fedex Boolean
    args: 'FedEx'
  • module_delivery_ups Boolean
    args: 'UPS'
  • module_delivery_usps Boolean
    args: 'USPS'
  • module_procurement_jit Selection
    help='Reserving products manually in delivery orders or by running the scheduler is advised to better manage priorities in case of long customer lead times or/and frequent stock-outs.' args: [(1, 'Immediately after sales order confirmation'), (0, 'Manually or based on automatic scheduler')], 'Reservation'
  • module_product_expiry Boolean
    help='Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n Such dates are set automatically at lot/serial number creation based on values set on the product (in days).' args: 'Expiration Dates'
  • module_stock_barcode Boolean
    args: 'Barcode Scanner'
  • module_stock_picking_batch Boolean
    oldname='module_stock_picking_wave' args: 'Batch Pickings'
  • propagation_minimum_delta Integer
    related='company_id.propagation_minimum_delta' string='No Rescheduling Propagation'
  • use_propagation_minimum_delta Boolean
    help='Rescheduling applies to any chain of operations (e.g. Make To Order, Pick Pack Ship). In the case of MTO sales, a vendor delay (updated incoming date) impacts the expected delivery date to the customer. \n This option allows to not propagate the rescheduling if the change is not critical.' oldname='default_new_propagation_minimum_delta' string='No Rescheduling Propagation'
Public methods (3)
  • get_values(self)
    @api.model
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • set_values(self)
    @api.multi

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    company_dependent=True help='This stock location will be used, instead of the default one, as the destination location for goods you send to this partner' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    company_dependent=True help='This stock location will be used, instead of the default one, as the source location for goods you receive from the current partner' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (1)
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_backorder_rel'
Public methods (2)
  • process(self)
  • process_cancel_backorder(self)

New fields (6)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id','=',product_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • new_quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (7)
  • change_product_qty(self)
    Changes the Product Quantity by making a Physical Inventory.
  • check_new_quantity(self)
    @api.constrains('new_quantity')
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model
  • onchange_location_id(self)
    @api.onchange('location_id', 'product_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_id_dict(self, product_id)

New fields (4)
  • category_id Many2one → product.category
    required=True args: 'product.category', 'Product Category'
  • fixed_location_id Many2one → stock.location
    required=True args: 'stock.location', 'Location'
  • putaway_id Many2one → product.putaway
    required=True args: 'product.putaway', 'Put Away Method'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
Public methods (0)

No public methods.

New fields (1)
  • pick_ids Many2many → stock.picking
    args: 'stock.picking', 'stock_picking_transfer_rel'
Public methods (1)
  • process(self)

New fields (3)
  • active Boolean
    default=True help='By unchecking the active field, you may hide an INCOTERM you will not use.' args: 'Active'
  • code Char
    help='Incoterm Standard Code' required=True size=3 args: 'Code'
  • name Char
    help='Incoterms are series of sales terms. They are used to divide transaction costs and responsibilities between buyer and seller and reflect state-of-the-art transportation practices.' required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (15)
  • category_id Many2one → product.category
    help='Specify Product Category to focus your inventory on a particular Category.' readonly=True states={'draft': [('readonly', False)]} args: 'product.category', 'Inventoried Category'
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='The date that will be used for the stock level check of the products and the validation of the stock move related to this inventory.' readonly=True required=True args: 'Inventory Date'
  • exhausted Boolean
    readonly=True states={'draft': [('readonly', False)]} args: 'Include Exhausted Products'
  • filter Selection
    default='none' help="If you do an entire inventory, you can choose 'All Products' and it will prefill the inventory with the current stock. If you only do some products (e.g. Cycle Counting) you can choose 'Manual Selection of Products' and the system won't propose anything. You can also let the system propose for a single product / lot /... " required=True selection='_selection_filter' string='Inventory of'
  • line_ids One2many → stock.inventory.line
    copy=True readonly=False states={'done': [('readonly', True)]} string='Inventories' args: 'stock.inventory.line', 'inventory_id'
  • location_id Many2one → stock.location
    default=_default_location_id readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Inventoried Location'
  • lot_id Many2one → stock.production.lot
    copy=False help='Specify Lot/Serial Number to focus your inventory on a particular Lot/Serial Number.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.production.lot', 'Inventoried Lot/Serial Number'
  • move_ids One2many → stock.move
    states={'done': [('readonly', True)]} string='Created Moves' args: 'stock.move', 'inventory_id'
  • name Char
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'Inventory Reference'
  • package_id Many2one → stock.quant.package
    help='Specify Pack to focus your inventory on a particular Pack.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.quant.package', 'Inventoried Pack'
  • partner_id Many2one → res.partner
    help='Specify Owner to focus your inventory on a particular Owner.' readonly=True states={'draft': [('readonly', False)]} args: 'res.partner', 'Inventoried Owner'
  • product_id Many2one → product.product
    help='Specify Product to focus your inventory on a particular Product.' readonly=True states={'draft': [('readonly', False)]} args: 'product.product', 'Inventoried Product'
  • state Selection
    copy=False default='draft' index=True readonly=True selection=[('draft', 'Draft'), ('cancel', 'Cancelled'), ('confirm', 'In Progress'), ('done', 'Validated')] string='Status'
  • total_qty Float
    compute='_compute_total_qty' args: 'Total Quantity'
Public methods (10)
  • action_cancel_draft(self)
  • action_check(self)
    Checks the inventory and computes the stock move to do
  • action_done(self)
  • action_inventory_line_tree(self)
  • action_reset_product_qty(self)
  • action_start(self)
  • onchange_filter(self)
    @api.onchange('filter')
  • onchange_location_id(self)
    @api.onchange('location_id')
  • post_inventory(self)
  • unlink(self)
    @api.multi

New fields (16)
  • company_id Many2one → res.company
    index=True readonly=True related='inventory_id.company_id' store=True args: 'res.company', 'Company'
  • inventory_id Many2one → stock.inventory
    index=True ondelete='cascade' args: 'stock.inventory', 'Inventory'
  • inventory_location_id Many2one → stock.location
    related='inventory_id.location_id' related_sudo=False args: 'stock.location', 'Location'
  • location_id Many2one → stock.location
    index=True required=True args: 'stock.location', 'Location'
  • location_name Char
    related='location_id.complete_name' store=True args: 'Location Name'
  • package_id Many2one → stock.quant.package
    index=True args: 'stock.quant.package', 'Pack'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Owner'
  • prod_lot_id Many2one → stock.production.lot
    domain="[('product_id','=',product_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • prodlot_name Char
    readonly=True related='prod_lot_id.name' store=True args: 'Serial Number Name'
  • product_code Char
    compute_sudo=True readonly=True related='product_id.default_code' store=True args: 'Product Code'
  • product_id Many2one → product.product
    domain=[('type', '=', 'product')] index=True required=True args: 'product.product', 'Product'
  • product_name Char
    compute_sudo=True readonly=True related='product_id.name' store=True args: 'Product Name'
  • product_qty Float
    default=0 digits=dp.get_precision('Product Unit of Measure') args: 'Checked Quantity'
  • product_uom_id Many2one → product.uom
    default=<expr> required=True args: 'product.uom', 'Product Unit of Measure'
  • state Selection
    readonly=True related='inventory_id.state' args: 'Status'
  • theoretical_qty Float
    compute='_compute_theoretical_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True args: 'Theoretical Quantity'
Public methods (4)
  • create(self, values)
    @api.model
  • onchange_product(self)
    @api.onchange('product_id')
  • onchange_quantity_context(self)
    @api.onchange('product_id', 'location_id', 'product_uom_id', 'prod_lot_id', 'partner_id', 'package_id')
  • write(self, values)
    @api.multi

New fields (20)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False oldname='loc_barcode' args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • comment Text
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Full Location Name'
  • location_id Many2one → stock.location
    help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True translate=True args: 'Location Name'
  • parent_left Integer
    index=True args: 'Left Parent'
  • parent_right Integer
    index=True args: 'Right Parent'
  • partner_id Many2one → res.partner
    help='Owner of the location if not internal' args: 'res.partner', 'Owner'
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_strategy_id Many2one → product.putaway
    help='Defines the default method used for suggesting the exact location (shelf) where to store the products. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.putaway', 'Put Away Strategy'
  • quant_ids One2many → stock.quant
    args: 'stock.quant', 'location_id'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.removal', 'Removal Strategy'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Procurement: Virtual location serving as temporary counterpart for procurement operations when the source (vendor or production) is not known yet. This location should be empty when the procurement scheduler has finished running.\n* Production: Virtual counterpart location for production operations: this location consumes the raw material and produces finished products\n* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location')]
Public methods (7)
  • default_get(self, fields)
    @api.model
  • get_putaway_strategy(self, product)
    Returns the location where the product has to be put, if any compliant putaway strategy is found. Otherwise returns None.
  • get_warehouse(self)
    @api.returns('stock.warehouse', <expr>)
    Returns warehouse id of warehouse that contains location
  • name_get(self)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
    search full name and barcode
  • should_bypass_reservation(self)
  • write(self, values)

New fields (13)
  • active Boolean
    default=True args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one. With 'Automatic No Step Added', the location is replaced in the original move." index=True required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='Number of days needed to transfer the goods' args: 'Delay (days)'
  • location_dest_id Many2one → stock.location
    help='The new location where the goods need to go' index=True ondelete='cascade' required=True args: 'stock.location', 'Destination Location'
  • location_from_id Many2one → stock.location
    help='This rule can be applied when a move is confirmed that has this location as destination location' index=True ondelete='cascade' required=True args: 'stock.location', 'Source Location'
  • name Char
    required=True args: 'Operation Name'
  • picking_type_id Many2one → stock.picking.type
    help='This is the operation type that will be put on the stock moves' required=True args: 'stock.picking.type', 'Operation Type'
  • propagate Boolean
    default=True help='If checked, when the previous move is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • route_id Many2one → stock.location.route
    ondelete='cascade' required=True args: 'stock.location.route', 'Route'
  • route_sequence Integer
    related='route_id.sequence' store=True args: 'Route Sequence'
  • sequence Integer
    args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Warehouse'
Public methods (0)

No public methods.

New fields (14)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    args: 'product.category', 'stock_location_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route Name'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category. It will take priority over the Warehouse route. ' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form. It will take priority over the Warehouse route. ' args: 'Applicable on Product'
  • pull_ids One2many → procurement.rule
    copy=True help='The demand represented by a procurement from e.g. a sale order, a reordering rule, another move, needs to be solved by applying a procurement rule. Depending on the action on the procurement rule,this triggers a purchase order, manufacturing order or another move. This way we create chains in the reverse order from the endpoint with the original demand to the starting point. That way, it is always known where we need to go and that is why they are preferred over push rules.' args: 'procurement.rule', 'route_id', 'Procurement Rules'
  • push_ids One2many → stock.location.path
    copy=True help='When a move is foreseen to a location, the push rule will automatically create a move to a next location after. This is mainly only needed when creating manual operations e.g. 2/3 step manual purchase order or 2/3 step finished product manual manufacturing order. In other cases, it is important to use pull rules where you know where you are going based on a demand.' args: 'stock.location.path', 'route_id', 'Push Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_ids Many2many → stock.warehouse
    args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse. This behaviour can be overridden by the routes on the Product/Product Categories or by the Preferred Routes on the Procurement' args: 'Applicable on Warehouse'
Public methods (3)
  • view_categ_ids(self)
  • view_product_ids(self)
  • write(self, values)
    when a route is deactivated, deactivate also its pull and push rules

New fields (58)
  • additional Boolean
    default=False args: "Whether the move was added after the picking's confirmation"
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • backorder_id Many2one → stock.picking
    index=True related='picking_id.backorder_id' args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date Datetime
    default=fields.Datetime.now help='Move date: scheduled date until move is done, then date of actual move processing' index=True required=True states={'done': [('readonly', True)]} args: 'Date'
  • date_expected Datetime
    default=fields.Datetime.now help='Scheduled date for the processing of this move' index=True required=True states={'done': [('readonly', True)]} args: 'Expected Date'
  • group_id Many2one → procurement.group
    default=_default_group_id args: 'procurement.group', 'Procurement Group'
  • has_move_lines Boolean
    compute='_compute_has_move_lines'
  • has_tracking Selection
    readonly=True related='product_id.tracking' string='Product with Tracking'
  • inventory_id Many2one → stock.inventory
    args: 'stock.inventory', 'Inventory'
  • is_initial_demand_editable Boolean
    compute='_compute_is_initial_demand_editable' args: 'Is initial demand editable'
  • is_locked Boolean
    compute='_compute_is_locked' readonly=True
  • is_quantity_done_editable Boolean
    compute='_compute_is_quantity_done_editable' args: 'Is quantity done editable'
  • location_dest_id Many2one → stock.location
    auto_join=True help='Location where the system will stock the finished products.' index=True required=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    auto_join=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True args: 'stock.location', 'Source Location'
  • move_dest_ids Many2many → stock.move
    copy=False help='Optional: next stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_orig_id', 'move_dest_id', 'Destination Moves'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'move_id'
  • move_line_nosuggest_ids One2many → stock.move.line
    domain=[('product_qty', '=', 0.0)] args: 'stock.move.line', 'move_id'
  • move_orig_ids Many2many → stock.move
    copy=False help='Optional: previous stock move when chaining them' args: 'stock.move', 'stock_move_move_rel', 'move_dest_id', 'move_orig_id', 'Original Move'
  • name Char
    index=True required=True args: 'Description'
  • note Text
    args: 'Notes'
  • ordered_qty Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Ordered Quantity'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    copy=False help='Move that created the return move' args: 'stock.move', 'Origin return move'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_code Selection
    readonly=True related='picking_id.picking_type_id.code'
  • picking_id Many2one → stock.picking
    index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer Reference'
  • picking_partner_id Many2one → res.partner
    related='picking_id.partner_id' args: 'res.partner', 'Transfer Destination Address'
  • picking_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Operation Type'
  • price_unit Float
    copy=False help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom." args: 'Unit Price'
  • priority Selection
    default='1' args: PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability. The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous, this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_packaging Many2one → product.packaging
    help='It specifies attributes of packaging like type, quantity of packaging,etc.' args: 'product.packaging', 'Preferred Packaging'
  • product_qty Float
    compute='_compute_product_qty' compute_sudo=True digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    help='Technical: used in views' related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one → product.uom
    required=True args: 'product.uom', 'Unit of Measure'
  • product_uom_qty Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Initial Demand'
  • propagate Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • push_rule_id Many2one → stock.location.path
    help='The push rule that created this stock move' ondelete='restrict' args: 'stock.location.path', 'Push Rule'
  • quantity_done Float
    compute='_quantity_done_compute' digits=dp.get_precision('Product Unit of Measure') inverse='_quantity_done_set' args: 'Quantity Done'
  • reference Char
    compute='_compute_reference' store=True string='Reference'
  • reserved_availability Float
    compute='_compute_reserved_availability' digits=dp.get_precision('Product Unit of Measure') help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • restrict_partner_id Many2one → res.partner
    help="Technical field used to depict a restriction on the ownership of quants to consider when marking this move as 'done'" args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.location.route
    help='Preferred route' args: 'stock.location.route', 'stock_location_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → procurement.rule
    help='The procurement rule that created this stock move' ondelete='restrict' args: 'procurement.rule', 'Procurement Rule'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'move_id'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • show_details_visible Boolean
    compute='_compute_show_details_visible' args: 'Details Visible'
  • show_operations Boolean
    related='picking_id.picking_type_id.show_operations'
  • show_reserved_availability Boolean
    compute='_compute_show_reserved_availability' args: 'From Supplier'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • string_availability_info Text
    compute='_compute_string_qty_information' help='Show various information on stock availability for this move' readonly=True args: 'Availability'
  • warehouse_id Many2one → stock.warehouse
    help='Technical field depicting the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (11)
  • action_show_details(self)
    Returns an action that will open a form view (in a popup) allowing to work on all the move lines of a particular move. This form view is used when "show operations" is not checked on the picking type.
  • create(self, vals)
    @api.model
  • default_get(self, fields_list)
    @api.model
  • init(self)
    @api.model_cr
  • name_get(self)
  • onchange_date(self)
    @api.onchange('date_expected')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • onchange_quantity(self)
    @api.onchange('product_id', 'product_qty')
  • unlink(self)
  • write(self, vals)

New fields (26)
  • consume_line_ids Many2many → stock.move.line
    help='Technical link to see who consumed what. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id'
  • date Datetime
    default=fields.Datetime.now required=True args: 'Date'
  • from_loc Char
    compute='_compute_location_description'
  • in_entire_package Boolean
    compute='_compute_in_entire_package'
  • is_initial_demand_editable Boolean
    related='move_id.is_initial_demand_editable'
  • is_locked Boolean
    default=True readonly=True related='move_id.is_locked'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'To'
  • location_id Many2one → stock.location
    required=True args: 'stock.location', 'From'
  • lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot'
  • lot_name Char
    args: 'Lot/Serial Number'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • move_id Many2one → stock.move
    help='Change to a better name' index=True args: 'stock.move', 'Stock Move'
  • ordered_qty Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Ordered Quantity'
  • owner_id Many2one → res.partner
    help='Owner of the quants' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    ondelete='restrict' args: 'stock.quant.package', 'Source Package'
  • picking_id Many2one → stock.picking
    help='The stock operation where the packing has been made' args: 'stock.picking', 'Stock Picking'
  • produce_line_ids Many2many → stock.move.line
    help='Technical link to see which line was produced with this. ' args: 'stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id'
  • product_id Many2one → product.product
    ondelete='cascade' args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' digits=0 inverse='_set_product_qty' store=True args: 'Real Reserved Quantity'
  • product_uom_id Many2one → product.uom
    required=True args: 'product.uom', 'Unit of Measure'
  • product_uom_qty Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') required=True args: 'Reserved'
  • qty_done Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') args: 'Done'
  • reference Char
    related='move_id.reference' store=True
  • result_package_id Many2one → stock.quant.package
    help='If set, the operations are packed into this package' ondelete='restrict' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='move_id.state' store=True
  • to_loc Char
    compute='_compute_location_description'
Public methods (6)
  • check_reserved_done_quantity(self)
    @api.constrains('product_uom_qty')
  • create(self, vals)
    @api.model
  • onchange_product_id(self)
    @api.onchange('product_id', 'product_uom_id')
  • onchange_serial_number(self)
    @api.onchange('lot_name', 'lot_id')
    When the user is encoding a move line for a tracked product, we apply some logic to help him. This includes: - automatically switch `qty_done` to 1.0 - warn if he has already encoded `lot_name` in another move line
  • unlink(self)
  • write(self, vals)
    Through the interface, we allow users to change the charateristics of a move line. If a quantity has been reserved for this move line, we impact the reservation directly to free the old quants and allocate the new ones.

New fields (2)
  • overprocessed_product_name Char
    compute='_compute_overprocessed_product_name' readonly=True
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (1)
  • action_confirm(self)
    @api.multi

New fields (35)
  • backorder_id Many2one → stock.picking
    copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Creation Date, usually the time of the order' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} track_visibility='onchange' args: 'Creation Date'
  • date_done Datetime
    copy=False help='Completion Date of Transfer' readonly=True args: 'Date of Transfer'
  • entire_package_detail_ids One2many → stock.quant.package
    compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of detailed operations' args: 'stock.quant.package'
  • entire_package_ids One2many → stock.quant.package
    compute='_compute_entire_package_ids' help='Those are the entire packages of a picking shown in the view of operations' args: 'stock.quant.package'
  • group_id Many2one → procurement.group
    readonly=True related='move_lines.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_packages Boolean
    compute='_compute_has_packages' help='Check the existence of destination packages on move lines' args: 'Has Packages'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • has_tracking Boolean
    compute='_compute_has_tracking'
  • is_locked Boolean
    default=True help='When the picking is not done this allows changing the initial demand. When the picking is done this allows changing the done quantities.'
  • location_dest_id Many2one → stock.location
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Source Location'
  • move_line_exist Boolean
    compute='_compute_move_line_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'picking_id', 'Operations'
  • move_lines One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=False default='/' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Reference'
  • note Text
    args: 'Notes'
  • origin Char
    help='Reference of the document' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    help='Default Owner' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Owner'
  • partner_id Many2one → res.partner
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Partner'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code' args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')]
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • printed Boolean
    args: 'Printed'
  • priority Selection
    compute='_compute_priority' help='Priority for this picking. Setting manually a value here would set it as priority for all the moves' index=True inverse='_set_priority' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True string='Priority' track_visibility='onchange' args: PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    readonly=True related='move_lines.product_id' args: 'product.product', 'Product'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_scheduled_date' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True track_visibility='onchange' args: 'Scheduled Date'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' help='Technical field used to compute whether the check availability button should be shown.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_mark_as_todo Boolean
    compute='_compute_show_mark_as_todo' help='Technical field used to compute whether the mark as todo button should be shown.'
  • show_operations Boolean
    compute='_compute_show_operations'
  • show_validate Boolean
    compute='_compute_show_validate' help='Technical field used to compute whether the validate should be shown.'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: not confirmed yet and will not be scheduled until confirmed.\n * Waiting Another Operation: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows).\n * Waiting: if it is not ready to be sent because the required products could not be reserved.\n * Ready: products are reserved and ready to be sent. If the shipping policy is 'As soon as possible' this happens as soon as anything is reserved.\n * Done: has been processed, can't be modified or cancelled anymore.\n * Cancelled: has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='Status' track_visibility='onchange' args: [('draft', 'Draft'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting'), ('assigned', 'Ready'), ('done', 'Done'), ('cancel', 'Cancelled')]
Public methods (22)
  • action_assign(self)
    @api.multi
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_assign_owner(self)
    @api.one
  • action_assign_partner(self)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
    Changes picking state to done by processing the Stock Moves of the Picking Normally that happens when the button "Done" is pressed on a Picking view. @return: True
  • action_generate_backorder_wizard(self)
  • action_picking_move_tree(self)
  • action_see_move_scrap(self)
  • action_see_packages(self)
  • action_toggle_is_locked(self)
  • button_scrap(self)
  • button_validate(self)
    @api.multi
  • create(self, vals)
    @api.model
  • do_print_picking(self)
    @api.multi
  • do_transfer(self)
  • do_unreserve(self)
    @api.multi
  • force_assign(self)
    @api.multi
    Changes state of picking to available if moves are confirmed or waiting. @return: True
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'partner_id')
  • put_in_pack(self)
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (25)
  • active Boolean
    default=True args: 'Active'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    args: 'barcode.nomenclature', 'Barcode Nomenclature'
  • code Selection
    required=True args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • default_location_dest_id Many2one → stock.location
    help='This is the default destination location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    help='This is the default source location when you create a picking manually with this operation type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • last_done_picking Char
    compute='_compute_last_done_picking' args: 'Last 10 Done Pickings'
  • name Char
    required=True translate=True args: 'Operation Types Name'
  • rate_picking_backorders Integer
    compute='_compute_picking_count'
  • rate_picking_late Integer
    compute='_compute_picking_count'
  • return_picking_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Operation Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_id Many2one → ir.sequence
    required=True args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If checked, this shows the packs to be moved as a whole in the Operations tab all the time, even if there was no entire pack reserved.' args: 'Allow moving packs'
  • show_operations Boolean
    default=False help='If this checkbox is ticked, the pickings lines will represent detailed stock operations. If not, the picking lines will represent an aggregate of detailed stock operations.' args: 'Show Detailed Operations'
  • show_reserved Boolean
    default=True help='If this checkbox is ticked, Odoo will show which products are reserved (lot/serial number, source location, source package).' args: 'Show Reserved'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this operation type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    default=<expr> ondelete='cascade' args: 'stock.warehouse', 'Warehouse'
Public methods (9)
  • get_action_picking_tree_backorder(self)
  • get_action_picking_tree_late(self)
  • get_action_picking_tree_ready(self)
  • get_action_picking_tree_waiting(self)
  • get_stock_picking_action_picking_type(self)
  • name_get(self)
    Display 'Warehouse_name: PickingType_name'
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • onchange_picking_code(self)
    @api.onchange('code')
  • onchange_show_operations(self)
    @api.onchange('show_operations')

New fields (7)
  • create_date Datetime
    args: 'Creation Date'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' required=True args: 'Lot/Serial Number'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' args: 'Quantity'
  • product_uom_id Many2one → product.uom
    related='product_id.uom_id' store=True args: 'product.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)
    @api.multi

New fields (11)
  • company_id Many2one
    readonly=True related='location_id.company_id' store=True string='Company'
  • in_date Datetime
    readonly=True args: 'Incoming Date'
  • location_id Many2one → stock.location
    auto_join=True ondelete='restrict' readonly=True required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    ondelete='restrict' readonly=True args: 'stock.production.lot', 'Lot/Serial Number'
  • owner_id Many2one → res.partner
    help='This is the owner of the quant' readonly=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    help='The package containing this quant' ondelete='restrict' readonly=True args: 'stock.quant.package', 'Package'
  • product_id Many2one → product.product
    ondelete='restrict' readonly=True required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom_id Many2one → product.uom
    readonly=True related='product_id.uom_id' args: 'product.uom', 'Unit of Measure'
  • quantity Float
    help='Quantity of products in this quant, in the default unit of measure of the product' oldname='qty' readonly=True required=True args: 'Quantity'
  • reserved_quantity Float
    default=0.0 help='Quantity of reserved products in this quant, in the default unit of measure of the product' readonly=True required=True args: 'Reserved Quantity'
Public methods (4)
  • action_view_stock_moves(self)
  • check_location_id(self)
    @api.constrains('location_id')
  • check_product_id(self)
    @api.constrains('product_id')
  • check_quantity(self)
    @api.constrains('quantity')

New fields (12)
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True search='_search_company' args: 'res.company', 'Company'
  • current_destination_location_id Many2one → stock.location
    compute='_compute_current_picking_info' args: 'stock.location'
  • current_picking_id Boolean
    compute='_compute_current_picking_info'
  • current_picking_move_line_ids One2many → stock.move.line
    compute='_compute_current_picking_info' args: 'stock.move.line'
  • current_source_location_id Many2one → stock.location
    compute='_compute_current_picking_info' args: 'stock.location'
  • is_processed Boolean
    compute='_compute_current_picking_info'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True search='_search_location' args: 'stock.location', 'Location'
  • move_line_ids One2many → stock.move.line
    args: 'stock.move.line', 'result_package_id'
  • name Char
    copy=False default=<expr> index=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' index=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • packaging_id Many2one → product.packaging
    help="This field should be completed only if everything inside the package share the same product, otherwise it doesn't really makes sense." index=True args: 'product.packaging', 'Package Type'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
Public methods (5)
  • action_toggle_processed(self)
    This method set the quantity done to the reserved quantity of all move lines of a package or to 0 if the package is already processed
  • action_view_picking(self)
  • name_get(self)
  • unpack(self)
  • view_content_package(self)

New fields (2)
  • compute_at_date Selection
    help='Choose to analyze the current inventory or from a specific date in the past.' string='Compute' args: [(0, 'Current Inventory'), (1, 'At a Specific Date')]
  • date Datetime
    default=fields.Datetime.now help='Choose a date to get the inventory at that date' args: 'Inventory at Date'
Public methods (1)
  • open_table(self)

New fields (6)
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), ('return_location', '=', True)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
  • default_get(self, fields)
    @api.model

New fields (5)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    domain="[('id', '=', product_id)]" required=True string='Product' args: 'product.product'
  • quantity Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity'
  • uom_id Many2one → product.uom
    related='move_id.product_uom' string='Unit of Measure' args: 'product.uom'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)

New fields (15)
  • date_expected Datetime
    default=fields.Datetime.now args: 'Expected Date'
  • location_id Many2one → stock.location
    default=_get_default_location_id domain="[('usage', '=', 'internal')]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_id Many2one → product.uom
    required=True states={'done': [('readonly', True)]} args: 'product.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    default=_get_default_scrap_location_id domain="[('scrap_location', '=', True)]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' args: 'Product Tracking'
Public methods (7)
  • action_get_stock_move_lines(self)
  • action_get_stock_picking(self)
  • action_validate(self)
  • create(self, vals)
    @api.model
  • do_scrap(self)
    @api.multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • unlink(self)

New fields (0)

No new fields.

Public methods (13)
  • downstream_traceability(self, level, stream=False, line_id=False, model=False, model_obj=False, parent_quant=False)
    @api.model
  • final_vals_to_lines(self, final_vals, level)
    @api.model
  • get_html(self, given_context=None)
    @api.model
  • get_lines(self, line_id=None, **kw)
    @api.model
  • get_links(self, move_line)
    @api.model
  • get_move_lines_downstream(self, move_lines)
    @api.model
  • get_move_lines_upstream(self, move_lines)
    @api.model
  • get_pdf(self, line_data=[])
  • get_pdf_lines(self, line_data=[])
  • get_produced_or_consumed_vals(self, move_lines, level, model, stream, parent_id)
    @api.model
  • make_dict_head(self, level, parent_id, model=False, stream=False, move_line=False)
  • make_dict_move(self, level, parent_id, move_line, stream=False, unfoldable=False)
  • upstream_traceability(self, level, stream=False, line_id=False, model=False, model_obj=False, parent_quant=False)
    @api.model

New fields (26)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' index=True readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Crossdock Route'
  • default_resupply_wh_id Many2one → stock.warehouse
    help='Goods will always be resupplied from this warehouse' args: 'stock.warehouse', 'Default Resupply Warehouse'
  • delivery_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Ship directly from stock (Ship only)'), ('pick_ship', 'Bring goods to output location before shipping (Pick + Ship)'), ('pick_pack_ship', 'Make packages into a dedicated location, then bring them to the output location for shipping (Pick + Pack + Ship)')], 'Outgoing Shippings'
  • in_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    domain=[('usage', '=', 'internal')] required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → procurement.rule
    args: 'procurement.rule', 'MTO rule'
  • name Char
    default=<expr> index=True required=True args: 'Warehouse Name'
  • out_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly in stock (1 step)'), ('two_steps', 'Unload in input location then go to stock (2 steps)'), ('three_steps', 'Unload in input location, go through a quality control before being admitted in stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.location.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.location.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply Warehouses'
  • route_ids Many2many → stock.location.route
    domain="[('warehouse_selectable', '=', True)]" help='Defaults routes through the warehouse' args: 'stock.location.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • view_location_id Many2one → stock.location
    domain=[('usage', '=', 'view')] required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Quality Control Location'
Public methods (8)
  • action_view_all_routes(self)
  • create(self, vals)
    @api.model
  • create_resupply_routes(self, supplier_warehouses, default_resupply_wh)
  • create_routes(self)
  • create_sequences_and_picking_types(self)
  • get_routes_dict(self)
  • onchange_resupply_warehouses(self)
    @api.depends('default_resupply_wh_id', 'resupply_wh_ids')
  • write(self, vals)

New fields (13)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by procurement rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days Integer
    default=1 help='Number of days after the orderpoint is triggered to receive the products or to order to the vendor' args: 'Lead Time'
  • lead_type Selection
    default='supplier' required=True args: [('net', 'Day(s) to get the products'), ('supplier', 'Day(s) to purchase')], 'Lead Type'
  • location_id Many2one → stock.location
    ondelete='cascade' required=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> required=True args: 'Name'
  • product_id Many2one → product.product
    domain=[('type', '=', 'product')] ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Maximum Quantity'
  • product_min_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Minimum Quantity'
  • product_uom Many2one → product.uom
    default=<expr> readonly=True related='product_id.uom_id' required=True args: 'product.uom', 'Product Unit of Measure'
  • qty_multiple Float
    default=1 digits=dp.get_precision('Product Unit of Measure') help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Qty Multiple'
  • warehouse_id Many2one → stock.warehouse
    ondelete='cascade' required=True args: 'stock.warehouse', 'Warehouse'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
    Finds location id for changed warehouse.

New fields (3)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quant_ids Many2many → stock.quant
    compute='_compute_quant_ids' args: 'stock.quant'
Public methods (1)
  • action_done(self)

New fields (1)
  • scrap_id Many2one → stock.scrap
    args: 'stock.scrap', 'Scrap'
Public methods (1)
  • action_done(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Joren Van Onder, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Julien Legros, xmo-odoo, Richard Mathot, qdp-odoo, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Martin Geubelle, Pierre Masereel, Denis Vermylen (dve), Tanguy Charlier, len-odoo, amoyaux, Nicolas Vannieuwerburgh, Arnold Moyaux, tdi-odoo, Laurent Mignon (ACSONE)
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - report
    - procurement
    - barcodes
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage multi-warehouses, multi- and structured stock locations
==============================================================

The warehouse and inventory management is based on a hierarchical location structure, from warehouses to storage bins.
The double entry inventory system allows you to manage customers, vendors as well as manufacturing inventories.

Odoo has the capacity to manage lots and serial numbers ensuring compliance with the traceability requirements imposed by the majority of industries.

Key Features
------------
* Moves history and planning,
* Minimum stock rules
* Support for barcodes
* Rapid detection of mistakes through double entry system
* Traceability (Serial Numbers, Packages, ...)

Dashboard / Reports for Inventory Management will include:
----------------------------------------------------------
* Incoming Products (Graph)
* Outgoing Products (Graph)
* Procurement in Exception
* Inventory Analysis
* Last Product Inventories
* Moves Analysis
    

Code Analysis

Views touched (110)
XML IDNameModelTypeStatus
assets_common stock_location_barcodes pdf assets ir.ui.view qweb Inherits report.assets_common
external_layout_barcode_right external_layout_barcode_right ir.ui.view qweb Inherits report.external_layout
external_layout_header_barcode_right external_layout_header_barcode_right ir.ui.view qweb Inherits report.external_layout_header
inventory_planner inventory_planner ir.ui.view qweb New
procurement_group_form_view_herited procurement.group.view.form.inherit.picking procurement.group div Inherits procurement.procurement_group_form_view
product_category_form_view_inherit product.category.form product.category group Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_kanban_stock_view Product Kanban Stock product.product field Inherits product.product_kanban_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product sheet Inherits product.product_variant_easy_edit_view
product_product_view_form_procurement_button product.product.stock.stat.button.group product.product xpath Inherits procurement.product_product_view_form_procurement_button
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template field Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template field Inherits product.product_template_search_view
product_template_view_form_procurement_button product.template.stock.stat.button.group product.template xpath Inherits procurement.product_template_view_form_procurement_button
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_barcode report_lot_barcode ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_stock_lines_date_form report.stock.lines.date.form report.stock.lines.date form New
report_stock_lines_date_search report.stock.lines.date.search report.stock.lines.date search New
report_stock_lines_date_tree report.stock.lines.date.tree report.stock.lines.date tree New
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_incoterms_form stock.incoterms.form stock.incoterms form New
stock_incoterms_view_search stock.incoterms.search stock.incoterms search New
stock_inventory_line_search stock.inventory.line.search stock.inventory.line search New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_inventory_line_tree2 stock.inventory.line.tree2 stock.inventory.line tree New
stock_location_path_filter stock.location.path.select stock.location.path search New
stock_location_path_form stock.location.path.form stock.location.path form New
stock_location_path_tree stock.location.path.tree stock.location.path tree New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_location_route_view_search stock.location.route.search stock.location.route search New
stock_move_tree Stock Moves stock.move tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_scrap_form_view stock.scrap.form stock.scrap form New
stock_scrap_form_view2 stock.scrap.form2 stock.scrap form New
stock_scrap_search_view stock.scrap.search stock.scrap search New
stock_scrap_tree_view stock.scrap.tree stock.scrap tree New
stock_warehouse_view_search stock.warehouse.search stock.warehouse search New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer stock.immediate.transfer.view.form stock.immediate.transfer form New
view_incoterms_tree stock.incoterms.tree stock.incoterms tree New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_make_procurment_wizard Procurement Request make.procurement form New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_picking_form stock.move.form stock.move form New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_move_tree_receipt_picking_board stock.move.tree3 stock.move tree New
view_pack_operation_details_form stock.pack.operation.details.form stock.pack.operation form New
view_pack_operation_details_form_save stock.pack.operation.details.form.save stock.pack.operation group Inherits stock.view_pack_operation_details_form
view_pack_operation_lot_form stock.pack.operation.lots.form stock.pack.operation form New
view_pack_operation_lot_lot_form stock.pack.operation.lots.form stock.pack.operation.lot form New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.view_emails_partner_info_form
view_partner_stock_warnings_form res.partner.stock.warning res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_type_form Operation Types stock.picking.type form New
view_picking_type_list stock.picking.type.list stock.picking.type tree New
view_picking_type_tree Picking types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Reordering Rules procurement.orderpoint.compute form New
view_procurement_form_stock_inherit procurement.order.form.stock.inherit procurement.order xpath Inherits procurement.procurement_form_view
view_procurement_rule_form_stock_inherit procurement.rule.form.stock.inherit procurement.rule xpath Inherits procurement.view_procurement_rule_form
view_procurement_rule_tree_stock_inherit procurement.rule.tree.stock.inherit procurement.rule xpath Inherits procurement.view_procurement_rule_tree
view_procurement_tree_stock_inherit procurement.order.tree.stock.inherit procurement.order xpath Inherits procurement.procurement_tree_view
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway product.putaway.form product.putaway form New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_stock_config_settings stock settings stock.config.settings form New
view_stock_level_forecast_filter view.stock.level.forecast.filter report.stock.forecast search New
view_stock_level_forecast_graph Stock.forecast.graph report.stock.forecast graph New
view_stock_level_forecast_pivot Stock.forecast.pivot report.stock.forecast pivot New
view_stock_product_template_tree product.template.stock.tree.inherit product.template tree Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product tree Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_graph_value stock.quant.graph stock.quant graph New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_return_picking_form Return lines stock.return.picking form New
view_template_property_form product.template.stock.property.form.inherit product.template page Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (42)

New fields (1)
  • type Selection
    selection_add=[('weight', _('Weighted Product')), ('location', _('Location')), ('lot', _('Lot')), ('package', _('Package'))]
Public methods (0)

No public methods.

New fields (9)
  • date_planned Date
    default=fields.Date.context_today required=True args: 'Planned Date'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' string='Variant Number'
  • qty Float
    default=1.0 digits=(16, 2) required=True args: 'Quantity'
  • res_model Char
    args: 'Res Model'
  • route_ids Many2many → stock.location.route
    string='Preferred Routes' args: 'stock.location.route'
  • uom_id Many2one → product.uom
    required=True args: 'product.uom', 'Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    required=True args: 'stock.warehouse', 'Warehouse'
Public methods (5)
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model
  • make_procurement(self)
    @api.multi
    Creates procurement order for selected product.
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_id_dict(self, product_id)

New fields (1)
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Partner'
Public methods (0)

No public methods.

New fields (7)
  • location_id Many2one → stock.location
    args: 'stock.location', 'Procurement Location'
  • move_dest_id Many2one → stock.move
    help='Move which caused (created) the procurement' args: 'stock.move', 'Destination Move'
  • move_ids One2many → stock.move
    help='Moves created by the procurement' args: 'stock.move', 'procurement_id', 'Moves'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'Minimum Stock Rule'
  • partner_dest_id Many2one → res.partner
    help='In case of dropshipping, we need to know the destination address more precisely' args: 'res.partner', 'Customer Address'
  • route_ids Many2many → stock.location.route
    help='Preferred route to be followed by the procurement order. Usually copied from the generating document (SO) but could be set up manually.' args: 'stock.location.route', 'stock_location_route_procurement', 'procurement_id', 'route_id', 'Preferred Routes'
  • warehouse_id Many2one → stock.warehouse
    help='Warehouse to consider for the route selection' args: 'stock.warehouse', 'Warehouse'
Public methods (6)
  • cancel(self)
    @api.multi
  • do_view_pickings(self)
    @api.multi
    Return an action to display the pickings belonging to the same procurement group of given ids.
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • propagate_cancels(self)
    @api.multi
  • run(self, autocommit=False)
    @api.multi
  • run_scheduler(self, use_new_cursor=False, company_id=False)
    @api.model
    Call the scheduler in order to check the running procurements (super method), to check the minimum stock rules and the availability of moves. This function is intended to be run for all the companies at the same time, so we run functions as SUPERUSER to avoid intercompanies and access rights issues.

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)
    @api.multi

New fields (11)
  • delay Integer
    default=0 args: 'Number of Days'
  • location_id Many2one → stock.location
    args: 'stock.location', 'Procurement Location'
  • location_src_id Many2one → stock.location
    help='Source location is action=move' args: 'stock.location', 'Source Location'
  • partner_address_id Many2one → res.partner
    args: 'res.partner', 'Partner Address'
  • picking_type_id Many2one → stock.picking.type
    help='Picking Type determines the way the picking should be shown in the view, reports, ...' required=True args: 'stock.picking.type', 'Picking Type'
  • procure_method Selection
    default='make_to_stock' help="Determines the procurement method of the stock move that will be generated: whether it will need to 'take from the available stock' in its source location or needs to ignore its stock and create a procurement over there." required=True string='Move Supply Method' args: [('make_to_stock', 'Take From Stock'), ('make_to_order', 'Create Procurement')]
  • propagate Boolean
    default=True help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • propagate_warehouse_id Many2one → stock.warehouse
    help='The warehouse to propagate on the created move/procurement, which can be different of the warehouse this rule is for (e.g for resupplying rules from another warehouse)' args: 'stock.warehouse', 'Warehouse to Propagate'
  • route_id Many2one → stock.location.route
    help='If route_id is False, the rule is global' args: 'stock.location.route', 'Route'
  • route_sequence Integer
    related='route_id.sequence' store=True args: 'Route Sequence'
  • warehouse_id Many2one → stock.warehouse
    help='The warehouse this rule is for' args: 'stock.warehouse', 'Served Warehouse'
Public methods (0)

No public methods.

New fields (3)
  • removal_strategy_id Many2one → product.removal
    help='Set a specific removal strategy that will be used regardless of the source location for this product category' args: 'product.removal', 'Force Removal Strategy'
  • route_ids Many2many → stock.location.route
    domain=[('product_categ_selectable', '=', True)] args: 'stock.location.route', 'stock_location_route_categ', 'categ_id', 'route_id', 'Routes'
  • total_route_ids Many2many → stock.location.route
    compute='_compute_total_route_ids' readonly=True string='Total routes' args: 'stock.location.route'
Public methods (0)

No public methods.

New fields (12)
  • delivery_count Integer
    compute='_compute_delivery_count' args: 'Delivery'
  • incoming_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Quantity of products that are planned to arrive.\nIn a context with a single Stock Location, this includes goods arriving to this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods arriving to any Stock Location with 'internal' type." search='_search_incoming_qty' args: 'Incoming'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' args: 'Reordering Rules'
  • orderpoint_ids One2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'
  • outgoing_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Quantity of products that are planned to leave.\nIn a context with a single Stock Location, this includes goods leaving this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods leaving any Stock Location with 'internal' type." search='_search_outgoing_qty' args: 'Outgoing'
  • qty_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Current quantity of products.\nIn a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nstored in the Stock Location of the Warehouse of this Shop, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_qty_available' args: 'Quantity On Hand'
  • reception_count Integer
    compute='_compute_reception_count' args: 'Receipt'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules'
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules'
  • stock_move_ids One2many → stock.move
    help='Technical: used to compute quantities.' args: 'stock.move', 'product_id'
  • stock_quant_ids One2many → stock.quant
    help='Technical: used to compute quantities.' args: 'stock.quant', 'product_id'
  • virtual_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type." search='_search_virtual_available' args: 'Forecast Quantity'
Public methods (6)
  • action_view_routes(self)
    @api.multi
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • onchange_tracking(self)
    @api.onchange('tracking')
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model
  • view_header_get(self, view_id, view_type)
    @api.model
  • write(self, values)
    @api.multi

New fields (3)
  • fixed_location_ids One2many → stock.fixed.putaway.strat
    copy=True help='When the method is fixed, this location will be used to store the products' args: 'stock.fixed.putaway.strat', 'putaway_id', 'Fixed Locations Per Product Category'
  • method Selection
    default='fixed' required=True args: '_get_putaway_options', 'Method'
  • name Char
    required=True args: 'Name'
Public methods (1)
  • putaway_apply(self, product)

New fields (2)
  • method Char
    help='FIFO, LIFO...' required=True args: 'Method'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (18)
  • description_picking Text
    translate=True args: 'Description on Picking'
  • incoming_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_incoming_qty' args: 'Incoming'
  • location_id Many2one → stock.location
    args: 'stock.location', 'Location'
  • nbr_reordering_rules Integer
    compute='_compute_nbr_reordering_rules' args: 'Reordering Rules'
  • outgoing_qty Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_outgoing_qty' args: 'Outgoing'
  • property_stock_inventory Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'inventory')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory.' args: 'stock.location', 'Inventory Location'
  • property_stock_procurement Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'procurement')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated by procurements.' args: 'stock.location', 'Procurement Location'
  • property_stock_production Many2one → stock.location
    company_dependent=True domain=[('usage', 'like', 'production')] help='This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders.' args: 'stock.location', 'Production Location'
  • qty_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_qty_available' args: 'Quantity On Hand'
  • reordering_max_qty Float
    compute='_compute_nbr_reordering_rules'
  • reordering_min_qty Float
    compute='_compute_nbr_reordering_rules'
  • route_from_categ_ids Many2many
    related='categ_id.total_route_ids' relation='stock.location.route' string='Category Routes'
  • route_ids Many2many → stock.location.route
    domain=[('product_selectable', '=', True)] help='Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,...' args: 'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes'
  • sale_delay Float
    default=0 help="The average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers." args: 'Customer Lead Time'
  • tracking Selection
    default='none' required=True string='Tracking' args: [('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')]
  • type Selection
    selection_add=[('product', 'Stockable Product')]
  • virtual_available Float
    compute='_compute_quantities' digits=dp.get_precision('Product Unit of Measure') search='_search_virtual_available' args: 'Forecasted Quantity'
  • warehouse_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Warehouse'
Public methods (7)
  • action_open_quants(self)
    @api.multi
  • action_view_orderpoints(self)
    @api.multi
  • action_view_routes(self)
    @api.multi
  • action_view_stock_moves(self)
    @api.multi
  • onchange_tracking(self)
    @api.onchange('tracking')
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model
  • write(self, vals)
    @api.multi

New fields (5)
  • cumulative_quantity Float
    readonly=True string='Cumulative Quantity'
  • date Date
    string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • quantity Float
    readonly=True
Public methods (1)
  • init(self)
    @api.model_cr

New fields (5)
  • active Boolean
    readonly=True args: 'Active'
  • date Datetime
    readonly=True args: 'Date of latest Inventory'
  • id Integer
    readonly=True args: 'Product Id'
  • move_date Datetime
    readonly=True args: 'Date of latest Stock Move'
  • product_id Many2one → product.product
    index=True readonly=True args: 'product.product', 'Product'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (2)
  • internal_transit_location_id Many2one → stock.location
    help='Technical field used for resupply routes between warehouses that belong to this company' on_delete='restrict' args: 'stock.location', 'Internal Transit Location'
  • propagation_minimum_delta Integer
    default=1 args: 'Minimum Delta for Propagation of a Date Change on moves linked together'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_transit_location(self)
    @api.one
    Create a transit location with company_id being the given company_id. This is needed in case of resuply routes between warehouses belonging to the same company, because we don't want to create accounting entries at that time.

New fields (4)
  • picking_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Stock Picking'
  • picking_warn_msg Text
    args: 'Message for Stock Picking'
  • property_stock_customer Many2one → stock.location
    company_dependent=True help='This stock location will be used, instead of the default one, as the destination location for goods you send to this partner' string='Customer Location' args: 'stock.location'
  • property_stock_supplier Many2one → stock.location
    company_dependent=True help='This stock location will be used, instead of the default one, as the source location for goods you receive from the current partner' string='Vendor Location' args: 'stock.location'
Public methods (0)

No public methods.

New fields (1)
  • pick_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
    @api.multi
  • process_cancel_backorder(self)
    @api.multi

New fields (6)
  • location_id Many2one → stock.location
    domain="[('usage', '=', 'internal')]" required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id','=',product_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • new_quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') help='This quantity is expressed in the Default Unit of Measure of the product.' required=True args: 'New Quantity on Hand'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    required=True args: 'product.template', 'Template'
  • product_variant_count Integer
    related='product_tmpl_id.product_variant_count' args: 'Variant Count'
Public methods (7)
  • change_product_qty(self)
    @api.multi
    Changes the Product Quantity by making a Physical Inventory.
  • check_new_quantity(self)
    @api.constrains('new_quantity')
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model
  • onchange_location_id(self)
    @api.onchange('location_id', 'product_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_id_dict(self, product_id)

New fields (26)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • decimal_precision Integer
    help='As an example, a decimal precision of 2 will allow weights like: 9.99 kg, whereas a decimal precision of 4 will allow weights like: 0.0231 kg.' args: 'Decimal precision on weight'
  • group_product_variant Selection
    help='Work with product variant allows you to define some variant of the same products, an ease the product management in the ecommerce for example' implied_group='product.group_product_variant' args: [(0, 'No variants on products'), (1, 'Products can have several attributes, defining variants (Example: size, color,...)')], 'Product Variants'
  • group_stock_adv_location Selection
    help='This option supplements the warehouse application by effectively implementing Push and Pull inventory flows through Routes.' implied_group='stock.group_adv_location' args: [(0, 'No automatic routing of products'), (1, 'Advanced routing of products using rules')], 'Routes'
  • group_stock_multi_locations Boolean
    implied_group='stock.group_stock_multi_locations' args: 'Manage several stock locations'
  • group_stock_multi_warehouses Boolean
    implied_group='stock.group_stock_multi_warehouses' args: 'Manage several warehouses'
  • group_stock_packaging Selection
    help='Allows you to create and manage your packaging dimensions and types you want to be maintained in your system.' implied_group='product.group_stock_packaging' args: [(0, 'Do not manage packaging'), (1, 'Manage available packaging options per products')], 'Packaging Methods'
  • group_stock_production_lot Selection
    help='This allows you to assign a lot (or serial number) to the pickings and moves. This can make it possible to know which production lot was sent to a certain client, ...' implied_group='stock.group_production_lot' args: [(0, 'Do not track individual product items'), (1, 'Track lots or serial numbers')], 'Lots and Serial Numbers'
  • group_stock_tracking_lot Selection
    help='This allows to manipulate packages. You can put something in, take something from a package, but also move entire packages and put them even in another package. ' implied_group='stock.group_tracking_lot' args: [(0, 'Do not manage packaging'), (1, 'Record packages used on packing: pallets, boxes, ...')], 'Packages'
  • group_stock_tracking_owner Selection
    help='This way you can receive products attributed to a certain owner. ' implied_group='stock.group_tracking_owner' args: [(0, 'All products in your warehouse belong to your company'), (1, 'Manage consignee stocks (advanced)')], 'Product Owners'
  • group_uom Selection
    help='Allows you to select and maintain different units of measure for products.' implied_group='product.group_uom' args: [(0, 'Products have only one unit of measure (easier)'), (1, 'Some products may be sold/purchased in different units of measure (advanced)')], 'Units of Measure'
  • group_warning_stock Selection
    implied_group='stock.group_warning_stock' args: [(0, 'All the partners can be used in pickings'), (1, 'An informative or blocking warning can be set on a partner')], 'Warning'
  • module_delivery_dhl Boolean
    args: 'DHL integration'
  • module_delivery_fedex Boolean
    args: 'Fedex integration'
  • module_delivery_temando Boolean
    args: 'Temando integration'
  • module_delivery_ups Boolean
    args: 'UPS integration'
  • module_delivery_usps Boolean
    args: 'USPS integration'
  • module_procurement_jit Selection
    help='Allows you to automatically reserve the available\n products when confirming a sale order.\n This installs the module procurement_jit.' args: [(1, 'Reserve products immediately after the sale order confirmation'), (0, 'Reserve products manually or based on automatic scheduler')], 'Procurements'
  • module_product_expiry Selection
    help='Track different dates on products and serial numbers.\n The following dates can be tracked:\n - end of life\n - best before date\n - removal date\n - alert date.\n This installs the module product_expiry.' args: [(0, 'Do not use Expiration Date on serial numbers'), (1, 'Define Expiration Date on serial numbers')], 'Expiration Dates'
  • module_quality Boolean
    help='This module allows you to generate quality alerts and quality check' string='Quality'
  • module_stock_barcode Boolean
    args: 'Barcode scanner support'
  • module_stock_calendar Selection
    help='This allows you to handle minimum stock rules differently by the possibility to take into account the purchase and delivery calendars \n-This installs the module stock_calendar.' args: [(0, 'Set lead times in calendar days (easy)'), (1, "Adapt lead times using the suppliers' open days calendars (advanced)")], 'Minimum Stock Rules'
  • module_stock_dropshipping Selection
    help='\nCreates the dropship route and add more complex tests\n-This installs the module stock_dropshipping.' args: [(0, 'Suppliers always deliver to your warehouse(s)'), (1, 'Allow suppliers to deliver directly to your customers')], 'Dropshipping'
  • module_stock_picking_wave Selection
    help='Install the picking wave module which will help you grouping your pickings and processing them in batch' args: [(0, 'Manage pickings one at a time'), (1, 'Manage picking in batch per worker')], 'Picking Waves'
  • propagation_minimum_delta Integer
    related='company_id.propagation_minimum_delta' args: 'Minimum days to trigger a propagation of date change in pushed/pull flows.'
  • warehouse_and_location_usage_level Selection
    args: [(0, 'Manage only 1 Warehouse with only 1 stock location'), (1, 'Manage only 1 Warehouse, composed by several stock locations'), (2, 'Manage several Warehouses, each one composed by several stock locations')], 'Warehouses and Locations usage level'
Public methods (6)
  • default_get(self, fields)
    @api.model
  • get_default_decimal_precision(self, fields)
    @api.model
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • onchange_warehouse_and_location_usage_level(self)
    @api.onchange('warehouse_and_location_usage_level')
  • set_decimal_precision(self)
    @api.multi
  • set_group_stock_multi_locations(self)
    @api.multi
    If we are not in multiple locations, we can deactivate the internal picking types of the warehouses, so they won't appear in the dashboard. Otherwise, activate them.

New fields (4)
  • category_id Many2one → product.category
    required=True args: 'product.category', 'Product Category'
  • fixed_location_id Many2one → stock.location
    required=True args: 'stock.location', 'Location'
  • putaway_id Many2one → product.putaway
    required=True args: 'product.putaway', 'Put Away Method'
  • sequence Integer
    help='Give to the more specialized category, a higher priority to have them in top of the list.' args: 'Priority'
Public methods (0)

No public methods.

New fields (1)
  • pick_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)
    @api.multi

New fields (3)
  • active Boolean
    default=True help='By unchecking the active field, you may hide an INCOTERM you will not use.' args: 'Active'
  • code Char
    help='Incoterm Standard Code' required=True size=3 args: 'Code'
  • name Char
    help='Incoterms are series of sales terms. They are used to divide transaction costs and responsibilities between buyer and seller and reflect state-of-the-art transportation practices.' required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (15)
  • category_id Many2one → product.category
    help='Specify Product Category to focus your inventory on a particular Category.' readonly=True states={'draft': [('readonly', False)]} args: 'product.category', 'Inventoried Category'
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='The date that will be used for the stock level check of the products and the validation of the stock move related to this inventory.' readonly=True required=True args: 'Inventory Date'
  • exhausted Boolean
    readonly=True states={'draft': [('readonly', False)]} args: 'Include Exhausted Products'
  • filter Selection
    default='none' help="If you do an entire inventory, you can choose 'All Products' and it will prefill the inventory with the current stock. If you only do some products (e.g. Cycle Counting) you can choose 'Manual Selection of Products' and the system won't propose anything. You can also let the system propose for a single product / lot /... " required=True selection='_selection_filter' string='Inventory of'
  • line_ids One2many → stock.inventory.line
    copy=True readonly=False states={'done': [('readonly', True)]} string='Inventories' args: 'stock.inventory.line', 'inventory_id'
  • location_id Many2one → stock.location
    default=_default_location_id readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Inventoried Location'
  • lot_id Many2one → stock.production.lot
    copy=False help='Specify Lot/Serial Number to focus your inventory on a particular Lot/Serial Number.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.production.lot', 'Inventoried Lot/Serial Number'
  • move_ids One2many → stock.move
    states={'done': [('readonly', True)]} string='Created Moves' args: 'stock.move', 'inventory_id'
  • name Char
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'Inventory Reference'
  • package_id Many2one → stock.quant.package
    help='Specify Pack to focus your inventory on a particular Pack.' readonly=True states={'draft': [('readonly', False)]} args: 'stock.quant.package', 'Inventoried Pack'
  • partner_id Many2one → res.partner
    help='Specify Owner to focus your inventory on a particular Owner.' readonly=True states={'draft': [('readonly', False)]} args: 'res.partner', 'Inventoried Owner'
  • product_id Many2one → product.product
    help='Specify Product to focus your inventory on a particular Product.' readonly=True states={'draft': [('readonly', False)]} args: 'product.product', 'Inventoried Product'
  • state Selection
    copy=False default='draft' index=True readonly=True selection=[('draft', 'Draft'), ('cancel', 'Cancelled'), ('confirm', 'In Progress'), ('done', 'Validated')] string='Status'
  • total_qty Float
    compute='_compute_total_qty' args: 'Total Quantity'
Public methods (10)
  • action_cancel_draft(self)
    @api.multi
  • action_check(self)
    @api.multi
    Checks the inventory and computes the stock move to do
  • action_done(self)
    @api.multi
  • action_inventory_line_tree(self)
    @api.multi
  • action_reset_product_qty(self)
    @api.multi
  • action_start(self)
    @api.multi
  • onchange_filter(self)
    @api.onchange('filter')
  • onchange_location_id(self)
    @api.onchange('location_id')
  • post_inventory(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (16)
  • company_id Many2one → res.company
    index=True readonly=True related='inventory_id.company_id' store=True args: 'res.company', 'Company'
  • inventory_id Many2one → stock.inventory
    index=True ondelete='cascade' args: 'stock.inventory', 'Inventory'
  • inventory_location_id Many2one → stock.location
    related='inventory_id.location_id' related_sudo=False args: 'stock.location', 'Location'
  • location_id Many2one → stock.location
    index=True required=True args: 'stock.location', 'Location'
  • location_name Char
    related='location_id.complete_name' store=True args: 'Location Name'
  • package_id Many2one → stock.quant.package
    index=True args: 'stock.quant.package', 'Pack'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Owner'
  • prod_lot_id Many2one → stock.production.lot
    domain="[('product_id','=',product_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • prodlot_name Char
    readonly=True related='prod_lot_id.name' store=True args: 'Serial Number Name'
  • product_code Char
    related='product_id.default_code' store=True args: 'Product Code'
  • product_id Many2one → product.product
    index=True required=True args: 'product.product', 'Product'
  • product_name Char
    readonly=True related='product_id.name' store=True args: 'Product Name'
  • product_qty Float
    default=0 digits=dp.get_precision('Product Unit of Measure') args: 'Checked Quantity'
  • product_uom_id Many2one → product.uom
    default=<expr> required=True args: 'product.uom', 'Product Unit of Measure'
  • state Selection
    readonly=True related='inventory_id.state' args: 'Status'
  • theoretical_qty Float
    compute='_compute_theoretical_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True args: 'Theoretical Quantity'
Public methods (4)
  • create(self, values)
    @api.model
  • onchange_product(self)
    @api.onchange('product_id')
  • onchange_quantity_context(self)
    @api.onchange('product_id', 'location_id', 'product_uom_id', 'prod_lot_id', 'partner_id', 'package_id')
  • write(self, values)
    @api.multi

New fields (19)
  • active Boolean
    default=True help='By unchecking the active field, you may hide a location without deleting it.' args: 'Active'
  • barcode Char
    copy=False oldname='loc_barcode' args: 'Barcode'
  • child_ids One2many → stock.location
    args: 'stock.location', 'location_id', 'Contains'
  • comment Text
    args: 'Additional Information'
  • company_id Many2one → res.company
    default=<expr> help='Let this field empty if this location is shared between companies' index=True args: 'res.company', 'Company'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Full Location Name'
  • location_id Many2one → stock.location
    help="The parent location that includes this location. Example : The 'Dispatch Zone' is the 'Gate 1' parent location." index=True ondelete='cascade' args: 'stock.location', 'Parent Location'
  • name Char
    required=True translate=True args: 'Location Name'
  • parent_left Integer
    index=True args: 'Left Parent'
  • parent_right Integer
    index=True args: 'Right Parent'
  • partner_id Many2one → res.partner
    help='Owner of the location if not internal' args: 'res.partner', 'Owner'
  • posx Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Corridor (X)'
  • posy Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Shelves (Y)'
  • posz Integer
    default=0 help='Optional localization details, for information purpose only' args: 'Height (Z)'
  • putaway_strategy_id Many2one → product.putaway
    help='Defines the default method used for suggesting the exact location (shelf) where to store the products. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.putaway', 'Put Away Strategy'
  • removal_strategy_id Many2one → product.removal
    help='Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.' args: 'product.removal', 'Removal Strategy'
  • return_location Boolean
    help='Check this box to allow using this location as a return location.' args: 'Is a Return Location?'
  • scrap_location Boolean
    default=False help='Check this box to allow using this location to put scrapped/damaged goods.' args: 'Is a Scrap Location?'
  • usage Selection
    default='internal' help="* Vendor Location: Virtual location representing the source location for products coming from your vendors\n* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n* Internal Location: Physical locations inside your own warehouses,\n* Customer Location: Virtual location representing the destination location for products sent to your customers\n* Inventory Loss: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n* Procurement: Virtual location serving as temporary counterpart for procurement operations when the source (vendor or production) is not known yet. This location should be empty when the procurement scheduler has finished running.\n* Production: Virtual counterpart location for production operations: this location consumes the raw material and produces finished products\n* Transit Location: Counterpart location that should be used in inter-companies or inter-warehouses operations" index=True required=True string='Location Type' args: [('supplier', 'Vendor Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory Loss'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location')]
Public methods (4)
  • default_get(self, fields)
    @api.model
  • get_putaway_strategy(self, product)
    Returns the location where the product has to be put, if any compliant putaway strategy is found. Otherwise returns None.
  • get_warehouse(self)
    @api.multi@api.returns('stock.warehouse', <expr>)
    Returns warehouse id of warehouse that contains location
  • name_get(self)
    @api.multi

New fields (13)
  • active Boolean
    default=True args: 'Active'
  • auto Selection
    default='manual' help="The 'Manual Operation' value will create a stock move after the current one.With 'Automatic No Step Added', the location is replaced in the original move." index=True required=True string='Automatic Move' args: [('manual', 'Manual Operation'), ('transparent', 'Automatic No Step Added')]
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • delay Integer
    default=0 help='Number of days needed to transfer the goods' args: 'Delay (days)'
  • location_dest_id Many2one → stock.location
    help='The new location where the goods need to go' index=True ondelete='cascade' required=True args: 'stock.location', 'Destination Location'
  • location_from_id Many2one → stock.location
    help='This rule can be applied when a move is confirmed that has this location as destination location' index=True ondelete='cascade' required=True args: 'stock.location', 'Source Location'
  • name Char
    required=True args: 'Operation Name'
  • picking_type_id Many2one → stock.picking.type
    help='This is the picking type that will be put on the stock moves' required=True args: 'stock.picking.type', 'Picking Type'
  • propagate Boolean
    default=True help='If checked, when the previous move is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • route_id Many2one → stock.location.route
    args: 'stock.location.route', 'Route'
  • route_sequence Integer
    related='route_id.sequence' store=True args: 'Route Sequence'
  • sequence Integer
    args: 'Sequence'
  • warehouse_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Warehouse'
Public methods (0)

No public methods.

New fields (14)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the route without removing it.' args: 'Active'
  • categ_ids Many2many → product.category
    args: 'product.category', 'stock_location_route_categ', 'route_id', 'categ_id', 'Product Categories'
  • company_id Many2one → res.company
    default=<expr> help='Leave this field empty if this route is shared between all companies' index=True args: 'res.company', 'Company'
  • name Char
    required=True translate=True args: 'Route Name'
  • product_categ_selectable Boolean
    help='When checked, the route will be selectable on the Product Category. It will take priority over the Warehouse route. ' args: 'Applicable on Product Category'
  • product_ids Many2many → product.template
    args: 'product.template', 'stock_route_product', 'route_id', 'product_id', 'Products'
  • product_selectable Boolean
    default=True help='When checked, the route will be selectable in the Inventory tab of the Product form. It will take priority over the Warehouse route. ' args: 'Applicable on Product'
  • pull_ids One2many → procurement.rule
    copy=True args: 'procurement.rule', 'route_id', 'Procurement Rules'
  • push_ids One2many → stock.location.path
    copy=True args: 'stock.location.path', 'route_id', 'Push Rules'
  • sequence Integer
    default=0 args: 'Sequence'
  • supplied_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplied Warehouse'
  • supplier_wh_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Supplying Warehouse'
  • warehouse_ids Many2many → stock.warehouse
    args: 'stock.warehouse', 'stock_route_warehouse', 'route_id', 'warehouse_id', 'Warehouses'
  • warehouse_selectable Boolean
    help='When a warehouse is selected for this route, this route should be seen as the default route when products pass through this warehouse. This behaviour can be overridden by the routes on the Product/Product Categories or by the Preferred Routes on the Procurement' args: 'Applicable on Warehouse'
Public methods (3)
  • view_categ_ids(self)
    @api.multi
  • view_product_ids(self)
    @api.multi
  • write(self, values)
    @api.multi
    when a route is deactivated, deactivate also its pull and push rules

New fields (51)
  • availability Float
    compute='_compute_product_availability' help='Quantity in stock that can still be reserved for this move' readonly=True args: 'Forecasted Quantity'
  • backorder_id Many2one → stock.picking
    index=True related='picking_id.backorder_id' args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date Datetime
    default=fields.Datetime.now help='Move date: scheduled date until move is done, then date of actual move processing' index=True required=True states={'done': [('readonly', True)]} args: 'Date'
  • date_expected Datetime
    default=fields.Datetime.now help='Scheduled date for the processing of this move' index=True required=True states={'done': [('readonly', True)]} args: 'Expected Date'
  • group_id Many2one → procurement.group
    default=_default_group_id args: 'procurement.group', 'Procurement Group'
  • inventory_id Many2one → stock.inventory
    args: 'stock.inventory', 'Inventory'
  • linked_move_operation_ids One2many → stock.move.operation.link
    help='Operations that impact this move for the computation of the remaining quantities' readonly=True args: 'stock.move.operation.link', 'move_id', 'Linked Operations'
  • location_dest_id Many2one → stock.location
    auto_join=True help='Location where the system will stock the finished products.' index=True required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    auto_join=True help='Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' index=True required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_ids Many2many → stock.production.lot
    compute='_compute_lot_ids' string='Lots/Serial Numbers' args: 'stock.production.lot'
  • move_dest_id Many2one → stock.move
    copy=False help='Optional: next stock move when chaining them' index=True args: 'stock.move', 'Destination Move'
  • move_orig_ids One2many → stock.move
    help='Optional: previous stock move when chaining them' args: 'stock.move', 'move_dest_id', 'Original Move'
  • name Char
    index=True required=True args: 'Description'
  • note Text
    args: 'Notes'
  • ordered_qty Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Ordered Quantity'
  • origin Char
    args: 'Source Document'
  • origin_returned_move_id Many2one → stock.move
    copy=False help='Move that created the return move' args: 'stock.move', 'Origin return move'
  • partially_available Boolean
    copy=False help='Checks if the move has some stock reserved' readonly=True args: 'Partially Available'
  • partner_id Many2one → res.partner
    help='Optional address where goods are to be delivered, specifically used for allotment' states={'done': [('readonly', True)]} args: 'res.partner', 'Destination Address '
  • picking_id Many2one → stock.picking
    index=True states={'done': [('readonly', True)]} args: 'stock.picking', 'Transfer Reference'
  • picking_partner_id Many2one → res.partner
    related='picking_id.partner_id' args: 'res.partner', 'Transfer Destination Address'
  • picking_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Picking Type'
  • price_unit Float
    help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom." args: 'Unit Price'
  • priority Selection
    default='1' args: procurement.PROCUREMENT_PRIORITIES, 'Priority'
  • procure_method Selection
    default='make_to_stock' help='By default, the system will take from the stock in the source location and passively wait for availability.The other possibility allows you to directly create a procurement on the source location (and thus ignore its current stock) to gather products. If we want to chain moves and have this one to wait for the previous,this second option should be chosen.' required=True string='Supply Method' args: [('make_to_stock', 'Default: Take From Stock'), ('make_to_order', 'Advanced: Apply Procurement Rules')]
  • procurement_id Many2one → procurement.order
    args: 'procurement.order', 'Procurement'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] index=True required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_packaging Many2one → product.packaging
    help='It specifies attributes of packaging like type, quantity of packaging,etc.' args: 'product.packaging', 'Preferred Packaging'
  • product_qty Float
    compute='_compute_product_qty' digits=0 help='Quantity in the default UoM of the product' inverse='_set_product_qty' store=True args: 'Real Quantity'
  • product_tmpl_id Many2one → product.template
    help='Technical: used in views' related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom Many2one → product.uom
    required=True states={'done': [('readonly', True)]} args: 'product.uom', 'Unit of Measure'
  • product_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') help="This is the quantity of products from an inventory point of view. For moves in the state 'done', this is the quantity of products that were actually moved. For other moves, this is the quantity of product that is planned to be moved. Lowering this quantity does not generate a backorder. Changing this quantity on assigned moves affects the product reservation, and should be done with care." required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • propagate Boolean
    default=True help='If checked, when this move is cancelled, cancel the linked move too' args: 'Propagate cancel and split'
  • push_rule_id Many2one → stock.location.path
    help='The push rule that created this stock move' args: 'stock.location.path', 'Push Rule'
  • quant_ids Many2many → stock.quant
    copy=False args: 'stock.quant', 'stock_quant_move_rel', 'move_id', 'quant_id', 'Moved Quants'
  • remaining_qty Float
    compute='_get_remaining_qty' digits=0 help='Remaining Quantity in default UoM according to operations matched with this move' states={'done': [('readonly', True)]} args: 'Remaining Quantity'
  • reserved_availability Float
    compute='_compute_reserved_availability' help='Quantity that has already been reserved for this move' readonly=True args: 'Quantity Reserved'
  • reserved_quant_ids One2many → stock.quant
    args: 'stock.quant', 'reservation_id', 'Reserved quants'
  • restrict_lot_id Many2one → stock.production.lot
    help="Technical field used to depict a restriction on the lot/serial number of quants to consider when marking this move as 'done'" args: 'stock.production.lot', 'Lot/Serial Number'
  • restrict_partner_id Many2one → res.partner
    help="Technical field used to depict a restriction on the ownership of quants to consider when marking this move as 'done'" args: 'res.partner', 'Owner '
  • returned_move_ids One2many → stock.move
    help='Optional: all returned moves created from this move' args: 'stock.move', 'origin_returned_move_id', 'All returned moves'
  • route_ids Many2many → stock.location.route
    help='Preferred route to be followed by the procurement order' args: 'stock.location.route', 'stock_location_route_move', 'move_id', 'route_id', 'Destination route'
  • rule_id Many2one → procurement.rule
    help='The procurement rule that created this stock move' args: 'procurement.rule', 'Procurement Rule'
  • scrapped Boolean
    readonly=True related='location_dest_id.scrap_location' store=True args: 'Scrapped'
  • sequence Integer
    default=10 args: 'Sequence'
  • split_from Many2one → stock.move
    copy=False help='Technical field used to track the origin of a split move, which can be useful in case of debug' args: 'stock.move', 'Move Split From'
  • state Selection
    copy=False default='draft' help="* New: When the stock move is created and not yet confirmed.\n* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n* Available: When products are reserved, it is set to 'Available'.\n* Done: When the shipment is processed, the state is 'Done'." index=True readonly=True string='Status' args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('assigned', 'Available'), ('done', 'Done')]
  • string_availability_info Text
    compute='_compute_string_qty_information' help='Show various information on stock availability for this move' readonly=True args: 'Availability'
  • warehouse_id Many2one → stock.warehouse
    help='Technical field depicting the warehouse to consider for the route selection on the next procurement (if any).' args: 'stock.warehouse', 'Warehouse'
Public methods (25)
  • action_assign(self, no_prepare=False)
    @api.multi
    Checks the product type and accordingly writes the state.
  • action_cancel(self)
    @api.multi
    Cancels the moves and if all moves are cancelled it cancels the picking.
  • action_confirm(self)
    @api.multi
    Confirms stock move or put it in waiting if it's linked to another move.
  • action_done(self)
    @api.multi
    Process completely the moves given and if all moves are done, it will finish the picking.
  • action_show_picking(self)
    @api.multi
  • assign_picking(self)
    @api.multi
    Try to assign the moves to an existing picking that has not been reserved yet and has the same procurement group, locations and picking type (moves should already have them identical). Otherwise, create a new picking to assign them to.
  • check_recompute_pack_op(self)
    @api.multi
  • check_tracking(self, pack_operation)
    @api.multi
    Checks if serial number is assigned to stock move or not and raise an error if it had to.
  • create(self, vals)
    @api.model
  • do_unreserve(self)
    @api.multi
  • force_assign(self)
    @api.multi
  • get_ancestors(self)
    @api.returns('self')@api.multi
    Find the first level ancestors of given move
  • get_price_unit(self)
    Returns the unit price to store on the quant
  • get_removal_strategy(self)
    Returns the removal strategy to consider for the given move/ops
  • init(self)
    @api.model_cr
  • name_get(self)
    @api.multi
  • onchange_date(self)
    @api.onchange('date_expected')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_quantity(self)
    @api.onchange('product_id', 'product_qty')
  • quants_unreserve(self)
  • recalculate_move_state(self)
    Recompute the state of moves given because their reserved quants were used to fulfill another operation
  • set_default_price_unit_from_product(self)
    Set price to move, important in inter-company moves or receipts with only one partner
  • split(self, qty, restrict_lot_id=False, restrict_partner_id=False)
    @api.multi
    Splits qty from move move into a new move :param qty: float. quantity to split (given in product UoM) :param restrict_lot_id: optional production lot that can be given in order to force the new move to restrict its choice of quants to this lot. :param restrict_partner_id: optional partner that can be given in order to force the new move to restrict its choice of quants to the ones belonging to this partner. :param context: dictionay. can contains the special key 'source_location_id' in order to force the source location when copying the move :returns: id of the backorder move created
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (4)
  • move_id Many2one → stock.move
    ondelete='cascade' required=True args: 'stock.move', 'Move'
  • operation_id Many2one → stock.pack.operation
    ondelete='cascade' required=True args: 'stock.pack.operation', 'Operation'
  • qty Float
    help='Quantity of products to consider when talking about the contribution of this pack operation towards the remaining quantity of the move (and inverse). Given in the product main uom.' args: 'Quantity'
  • reserved_quant_id Many2one → stock.quant
    help='Technical field containing the quant that created this link between an operation and a stock move. Used at the stock_move_obj.action_done() time to avoid seeking a matching quant again' args: 'stock.quant', 'Reserved Quant'
Public methods (0)

No public methods.

New fields (5)
  • location_id Many2one → stock.location
    required=True args: 'stock.location', 'Location'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity'
  • product_uom Many2one → product.uom
    required=True args: 'product.uom', 'Product Unit of Measure'
  • restrict_lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot/Serial Number'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • move_scrap(self)
    @api.multi

New fields (24)
  • date Datetime
    default=fields.Date.context_today required=True args: 'Date'
  • fresh_record Boolean
    default=True args: 'Newly created pack operation'
  • from_loc Char
    compute='_compute_location_description' default=_get_default_from_loc string='From'
  • is_done Boolean
    compute='_compute_is_done' oldname='processed_boolean' readonly=False string='Done'
  • linked_move_operation_ids One2many → stock.move.operation.link
    help='Moves impacted by this operation for the computation of the remaining quantities' readonly=True string='Linked Moves' args: 'stock.move.operation.link', 'operation_id'
  • location_dest_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    required=True args: 'stock.location', 'Source Location'
  • lots_visible Boolean
    compute='_compute_lots_visible'
  • ordered_qty Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Ordered Quantity'
  • owner_id Many2one → res.partner
    help='Owner of the quants' args: 'res.partner', 'Owner'
  • pack_lot_ids One2many → stock.pack.operation.lot
    args: 'stock.pack.operation.lot', 'operation_id', 'Lots/Serial Numbers Used'
  • package_id Many2one → stock.quant.package
    args: 'stock.quant.package', 'Source Package'
  • picking_destination_location_id Many2one → stock.location
    related='picking_id.location_dest_id' args: 'stock.location'
  • picking_id Many2one → stock.picking
    help='The stock operation where the packing has been made' required=True args: 'stock.picking', 'Stock Picking'
  • picking_source_location_id Many2one → stock.location
    related='picking_id.location_id' args: 'stock.location'
  • product_id Many2one → product.product
    ondelete='cascade' args: 'product.product', 'Product'
  • product_qty Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') required=True args: 'To Do'
  • product_uom_id Many2one → product.uom
    args: 'product.uom', 'Unit of Measure'
  • qty_done Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') args: 'Done'
  • qty_done_uom_ordered Float
    compute='_compute_qty_done_uom_ordered' digits=dp.get_precision('Product Unit of Measure') help='Quantity done in UOM ordered' args: 'Quantity Done'
  • remaining_qty Float
    compute='_get_remaining_qty' digits=0 help='Remaining quantity in default UoM according to moves matched with this operation.' string='Remaining Qty'
  • result_package_id Many2one → stock.quant.package
    help='If set, the operations are packed into this package' ondelete='cascade' required=False args: 'stock.quant.package', 'Destination Package'
  • state Selection
    related='picking_id.state' selection=[('draft', 'Draft'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
  • to_loc Char
    compute='_compute_location_description' default=_get_default_to_loc string='To'
Public methods (9)
  • action_split_lots(self)
    @api.multi
  • create(self, vals)
    @api.model
  • on_change_is_done(self)
    @api.onchange('is_done')
  • onchange_product_id(self)
    @api.multi@api.onchange('product_id', 'product_uom_id')
  • save(self)
    @api.multi
  • show_details(self)
    @api.multi
  • split_quantities(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (6)
  • lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot/Serial Number'
  • lot_name Char
    args: 'Lot/Serial Number'
  • operation_id Many2one → stock.pack.operation
    args: 'stock.pack.operation'
  • plus_visible Boolean
    compute='_compute_plus_visible' default=True
  • qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') args: 'Done'
  • qty_todo Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') args: 'To Do'
Public methods (3)
  • action_add_quantity(self, quantity)
  • do_minus(self)
    @api.multi
  • do_plus(self)
    @api.multi

New fields (31)
  • backorder_id Many2one → stock.picking
    copy=False help='If this shipment was split, then this field links to the shipment which contains the already processed part.' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.picking', 'Back Order of'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now help='Creation Date, usually the time of the order' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} track_visibility='onchange' args: 'Creation Date'
  • date_done Datetime
    copy=False help='Completion Date of Transfer' readonly=True args: 'Date of Transfer'
  • group_id Many2one → procurement.group
    readonly=True related='move_lines.group_id' store=True args: 'procurement.group', 'Procurement Group'
  • has_scrap_move Boolean
    compute='_has_scrap_move' args: 'Has Scrap Moves'
  • launch_pack_operations Boolean
    copy=False args: 'Launch Pack Operations'
  • location_dest_id Many2one → stock.location
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Destination Location Zone'
  • location_id Many2one → stock.location
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Source Location Zone'
  • max_date Datetime
    compute='_compute_dates' help='Scheduled time for the last part of the shipment to be processed' index=True store=True args: 'Max. Expected Date'
  • min_date Datetime
    compute='_compute_dates' help='Scheduled time for the first part of the shipment to be processed. Setting manually a value here would set it as expected date for all the stock moves.' index=True inverse='_set_min_date' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True track_visibility='onchange' args: 'Scheduled Date'
  • move_lines One2many → stock.move
    copy=True string='Stock Moves' args: 'stock.move', 'picking_id'
  • move_type Selection
    default='direct' help='It specifies goods to be deliver partially or all at once' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: [('direct', 'Partial'), ('one', 'All at once')], 'Delivery Type'
  • name Char
    copy=False default='/' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Reference'
  • note Text
    args: 'Notes'
  • origin Char
    help='Reference of the document' index=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source Document'
  • owner_id Many2one → res.partner
    help='Default Owner' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Owner'
  • pack_operation_exist Boolean
    compute='_compute_pack_operation_exist' help='Check the existence of pack operation on the picking' args: 'Has Pack Operations'
  • pack_operation_ids One2many → stock.pack.operation
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.pack.operation', 'picking_id', 'Related Packing Operations'
  • pack_operation_pack_ids One2many → stock.pack.operation
    domain=[('product_id', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.pack.operation', 'picking_id', 'Pack'
  • pack_operation_product_ids One2many → stock.pack.operation
    domain=[('product_id', '!=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.pack.operation', 'picking_id', 'Non pack'
  • partner_id Many2one → res.partner
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.partner', 'Partner'
  • picking_type_code Selection
    readonly=True related='picking_type_id.code' args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')]
  • picking_type_entire_packs Boolean
    readonly=True related='picking_type_id.show_entire_packs'
  • picking_type_id Many2one → stock.picking.type
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Picking Type'
  • printed Boolean
    args: 'Printed'
  • priority Selection
    compute='_compute_priority' help='Priority for this picking. Setting manually a value here would set it as priority for all the moves' index=True inverse='_set_priority' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True string='Priority' track_visibility='onchange' args: procurement.PROCUREMENT_PRIORITIES
  • product_id Many2one → product.product
    related='move_lines.product_id' args: 'product.product', 'Product'
  • quant_reserved_exist Boolean
    compute='_compute_quant_reserved_exist' help='Check the existance of quants linked to this picking' args: 'Has quants already reserved'
  • recompute_pack_op Boolean
    copy=False help='True if reserved quants changed, which mean we might need to recompute the package operations' args: 'Recompute pack operation?'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: not confirmed yet and will not be scheduled until confirmed\n * Waiting Another Operation: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows)\n * Waiting Availability: still waiting for the availability of products\n * Partially Available: some products are available and reserved\n * Ready to Transfer: products reserved, simply waiting for confirmation.\n * Transferred: has been processed, can't be modified or cancelled anymore\n * Cancelled: has been cancelled, can't be confirmed anymore" index=True readonly=True store=True string='Status' track_visibility='onchange' args: [('draft', 'Draft'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Operation'), ('confirmed', 'Waiting Availability'), ('partially_available', 'Partially Available'), ('assigned', 'Available'), ('done', 'Done')]
Public methods (24)
  • action_assign(self)
    @api.multi
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_assign_owner(self)
    @api.one
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
    Changes picking state to done by processing the Stock Moves of the Picking Normally that happens when the button "Done" is pressed on a Picking view. @return: True
  • action_see_move_scrap(self)
    @api.multi
  • button_scrap(self)
    @api.multi
  • check_backorder(self)
  • create(self, vals)
    @api.model
  • do_new_transfer(self)
    @api.multi
  • do_prepare_partial(self)
    @api.multi
  • do_print_picking(self)
    @api.multi
  • do_recompute_remaining_quantities(self, done_qtys=False)
  • do_transfer(self)
    @api.multi
    If no pack operation, we do simple action_done of the picking. Otherwise, do the pack operations.
  • do_unreserve(self)
    @api.multi
    Will remove all quants for picking in picking_ids
  • force_assign(self)
    @api.multi
    Changes state of picking to available if moves are confirmed or waiting. @return: True
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'partner_id')
  • picking_recompute_remaining_quantities(self, done_qtys=False)
  • put_in_pack(self)
    @api.multi
  • recheck_availability(self)
    @api.multi
  • recompute_remaining_qty(self, done_qtys=False)
  • rereserve_quants(self, move_ids=[])
    Unreserve quants then try to reassign quants.
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (23)
  • active Boolean
    default=True args: 'Active'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    args: 'barcode.nomenclature', 'Barcode Nomenclature'
  • code Selection
    required=True args: [('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')], 'Type of Operation'
  • color Integer
    args: 'Color'
  • count_picking Integer
    compute='_compute_picking_count'
  • count_picking_backorders Integer
    compute='_compute_picking_count'
  • count_picking_draft Integer
    compute='_compute_picking_count'
  • count_picking_late Integer
    compute='_compute_picking_count'
  • count_picking_ready Integer
    compute='_compute_picking_count'
  • count_picking_waiting Integer
    compute='_compute_picking_count'
  • default_location_dest_id Many2one → stock.location
    help='This is the default destination location when you create a picking manually with this picking type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the customer location on the partner. ' args: 'stock.location', 'Default Destination Location'
  • default_location_src_id Many2one → stock.location
    help='This is the default source location when you create a picking manually with this picking type. It is possible however to change it or that the routes put another location. If it is empty, it will check for the supplier location on the partner. ' args: 'stock.location', 'Default Source Location'
  • last_done_picking Char
    compute='_compute_last_done_picking' args: 'Last 10 Done Pickings'
  • name Char
    required=True translate=True args: 'Picking Type Name'
  • rate_picking_backorders Integer
    compute='_compute_picking_count'
  • rate_picking_late Integer
    compute='_compute_picking_count'
  • return_picking_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Picking Type for Returns'
  • sequence Integer
    help="Used to order the 'All Operations' kanban view" args: 'Sequence'
  • sequence_id Many2one → ir.sequence
    required=True args: 'ir.sequence', 'Reference Sequence'
  • show_entire_packs Boolean
    help='If checked, this shows the packs to be moved as a whole in the Operations tab all the time, even if there was no entire pack reserved.' args: 'Allow moving packs'
  • use_create_lots Boolean
    default=True help='If this is checked only, it will suppose you want to create new Lots/Serial Numbers, so you can provide them in a text field. ' args: 'Create New Lots/Serial Numbers'
  • use_existing_lots Boolean
    default=True help='If this is checked, you will be able to choose the Lots/Serial Numbers. You can also decide to not put lots in this picking type. This means it will create stock with no lot or not put a restriction on the lot taken. ' args: 'Use Existing Lots/Serial Numbers'
  • warehouse_id Many2one → stock.warehouse
    default=<expr> ondelete='cascade' args: 'stock.warehouse', 'Warehouse'
Public methods (8)
  • get_action_picking_tree_backorder(self)
    @api.multi
  • get_action_picking_tree_late(self)
    @api.multi
  • get_action_picking_tree_ready(self)
    @api.multi
  • get_action_picking_tree_waiting(self)
    @api.multi
  • get_stock_picking_action_picking_type(self)
    @api.multi
  • name_get(self)
    @api.multi
    Display 'Warehouse_name: PickingType_name'
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • onchange_picking_code(self)
    @api.onchange('code')

New fields (7)
  • create_date Datetime
    args: 'Creation Date'
  • name Char
    default=<expr> help='Unique Lot/Serial Number' required=True args: 'Lot/Serial Number'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] required=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_product_qty' args: 'Quantity'
  • product_uom_id Many2one → product.uom
    related='product_id.uom_id' store=True args: 'product.uom', 'Unit of Measure'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'lot_id', 'Quants'
  • ref Char
    help="Internal reference number in case it differs from the manufacturer's lot/serial number" args: 'Internal Reference'
Public methods (2)
  • action_traceability(self)
    @api.multi
  • create(self, vals)
    @api.model

New fields (19)
  • company_id Many2one → res.company
    default=<expr> help='The company to which the quants belong' index=True readonly=True required=True args: 'res.company', 'Company'
  • cost Float
    group_operator='avg' args: 'Unit Cost'
  • create_date Datetime
    readonly=True args: 'Creation Date'
  • history_ids Many2many → stock.move
    copy=False help='Moves that operate(d) on this quant' string='Moves' args: 'stock.move', 'stock_quant_move_rel', 'quant_id', 'move_id'
  • in_date Datetime
    index=True readonly=True args: 'Incoming Date'
  • inventory_value Float
    compute='_compute_inventory_value' readonly=True args: 'Inventory Value'
  • location_id Many2one → stock.location
    auto_join=True index=True ondelete='restrict' readonly=True required=True args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    index=True ondelete='restrict' readonly=True args: 'stock.production.lot', 'Lot/Serial Number'
  • name Char
    compute='_compute_name' string='Identifier'
  • negative_dest_location_id Many2one → stock.location
    help='Technical field used to record the destination location of a move that created a negative quant' readonly=True related='negative_move_id.location_dest_id' args: 'stock.location', 'Negative Destination Location'
  • negative_move_id Many2one → stock.move
    help='If this is a negative quant, this will be the move that caused this negative quant.' readonly=True args: 'stock.move', 'Move Negative Quant'
  • owner_id Many2one → res.partner
    help='This is the owner of the quant' index=True readonly=True args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    help='The package containing this quant' index=True readonly=True string='Package' args: 'stock.quant.package'
  • packaging_type_id Many2one → product.packaging
    readonly=True related='package_id.packaging_id' store=True string='Type of packaging' args: 'product.packaging'
  • product_id Many2one → product.product
    index=True ondelete='restrict' readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → product.uom
    readonly=True related='product_id.uom_id' string='Unit of Measure' args: 'product.uom'
  • propagated_from_id Many2one → stock.quant
    help='The negative quant this is coming from' index=True readonly=True args: 'stock.quant', 'Linked Quant'
  • qty Float
    help='Quantity of products in this quant, in the default unit of measure of the product' index=True readonly=True required=True args: 'Quantity'
  • reservation_id Many2one → stock.move
    help='The move the quant is reserved for' index=True readonly=True args: 'stock.move', 'Reserved for Move'
Public methods (9)
  • action_view_quant_history(self)
    @api.multi
    Returns an action that display the history of the quant, which mean all the stock moves that lead to this quant creation with this quant quantity.
  • init(self)
    @api.model_cr
  • move_quants_write(self, move, location_dest_id, dest_package_id, lot_id=False, entire_pack=False)
    @api.multi
  • quants_get_preferred_domain(self, qty, move, ops=False, lot_id=False, domain=None, preferred_domain_list=[])
    @api.model
    This function tries to find quants for the given domain and move/ops, by trying to first limit the choice on the quants that match the first item of preferred_domain_list as well. But if the qty requested is not reached it tries to find the remaining quantity by looping on the preferred_domain_list (tries with the second item and so on). Make sure the quants aren't found twice => all the domains of preferred_domain_list should be orthogonal
  • quants_get_reservation(self, qty, move, pack_operation_id=False, lot_id=False, company_id=False, domain=None, preferred_domain_list=None)
    This function tries to find quants for the given domain and move/ops, by trying to first limit the choice on the quants that match the first item of preferred_domain_list as well. But if the qty requested is not reached it tries to find the remaining quantity by looping on the preferred_domain_list (tries with the second item and so on). Make sure the quants aren't found twice => all the domains of preferred_domain_list should be orthogonal
  • quants_move(self, quants, move, location_to, location_from=False, lot_id=False, owner_id=False, src_package_id=False, dest_package_id=False, entire_pack=False)
    @api.model
    Moves all given stock.quant in the given destination location. Unreserve from current move. :param quants: list of tuple(browse record(stock.quant) or None, quantity to move) :param move: browse record (stock.move) :param location_to: browse record (stock.location) depicting where the quants have to be moved :param location_from: optional browse record (stock.location) explaining where the quant has to be taken (may differ from the move source location in case a removal strategy applied). This parameter is only used to pass to _quant_create_from_move if a negative quant must be created :param lot_id: ID of the lot that must be set on the quants to move :param owner_id: ID of the partner that must own the quants to move :param src_package_id: ID of the package that contains the quants to move :param dest_package_id: ID of the package that must be set on the moved quant
  • quants_reserve(self, quants, move, link=False)
    @api.model
    This function reserves quants for the given move and optionally given link. If the total of quantity reserved is enough, the move state is also set to 'assigned' :param quants: list of tuple(quant browse record or None, qty to reserve). If None is given as first tuple element, the item will be ignored. Negative quants should not be received as argument :param move: browse record :param link: browse record (stock.move.operation.link)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
    Overwrite the read_group in order to sum the function field 'inventory_value' in group by
  • unlink(self)
    @api.multi

New fields (12)
  • ancestor_ids One2many → stock.quant.package
    compute='_compute_ancestor_ids' string='Ancestors' args: 'stock.quant.package'
  • children_ids One2many → stock.quant.package
    readonly=True args: 'stock.quant.package', 'parent_id', 'Contained Packages'
  • children_quant_ids One2many → stock.quant
    compute='_compute_children_quant_ids' string='All Bulk Content' args: 'stock.quant'
  • company_id Many2one → res.company
    compute='_compute_package_info' index=True readonly=True search='_search_company' args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    compute='_compute_package_info' index=True readonly=True search='_search_location' args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> index=True args: 'Package Reference'
  • owner_id Many2one → res.partner
    compute='_compute_package_info' index=True readonly=True search='_search_owner' args: 'res.partner', 'Owner'
  • packaging_id Many2one → product.packaging
    help="This field should be completed only if everything inside the package share the same product, otherwise it doesn't really makes sense." index=True args: 'product.packaging', 'Package Type'
  • parent_id Many2one → stock.quant.package
    help='The package containing this item' ondelete='restrict' readonly=True args: 'stock.quant.package', 'Parent Package'
  • parent_left Integer
    index=True args: 'Left Parent'
  • parent_right Integer
    index=True args: 'Right Parent'
  • quant_ids One2many → stock.quant
    readonly=True args: 'stock.quant', 'package_id', 'Bulk Content'
Public methods (4)
  • action_view_related_picking(self)
    @api.multi
    Returns an action that display the picking related to this package (source or destination).
  • name_get(self)
    @api.multi
  • unpack(self)
    @api.multi
  • view_content_package(self)
    @api.multi

New fields (5)
  • location_id Many2one → stock.location
    domain="['|', ('id', '=', original_location_id), '&', ('return_location', '=', True), ('id', 'child_of', parent_location_id)]" args: 'stock.location', 'Return Location'
  • move_dest_exists Boolean
    readonly=True args: 'Chained Move Exists'
  • original_location_id Many2one → stock.location
    args: 'stock.location'
  • parent_location_id Many2one → stock.location
    args: 'stock.location'
  • product_return_moves One2many → stock.return.picking.line
    args: 'stock.return.picking.line', 'wizard_id', 'Moves'
Public methods (2)
  • create_returns(self)
    @api.multi
  • default_get(self, fields)
    @api.model

New fields (4)
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • quantity Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity'
  • wizard_id Many2one → stock.return.picking
    string='Wizard' args: 'stock.return.picking'
Public methods (0)

No public methods.

New fields (15)
  • date_expected Datetime
    default=fields.Datetime.now args: 'Expected Date'
  • location_id Many2one → stock.location
    default=_get_default_location_id domain="[('usage', '=', 'internal')]" required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Scrap Move'
  • name Char
    copy=False default=<expr> readonly=True required=True states={'done': [('readonly', True)]} args: 'Reference'
  • origin Char
    string='Source Document'
  • owner_id Many2one → res.partner
    states={'done': [('readonly', True)]} args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    states={'done': [('readonly', True)]} args: 'stock.quant.package', 'Package'
  • picking_id Many2one → stock.picking
    states={'done': [('readonly', True)]} args: 'stock.picking', 'Picking'
  • product_id Many2one → product.product
    required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_uom_id Many2one → product.uom
    required=True states={'done': [('readonly', True)]} args: 'product.uom', 'Unit of Measure'
  • scrap_location_id Many2one → stock.location
    default=_get_default_scrap_location_id domain="[('scrap_location', '=', True)]" states={'done': [('readonly', True)]} args: 'stock.location', 'Scrap Location'
  • scrap_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
  • tracking Selection
    readonly=True related='product_id.tracking' args: 'Product Tracking'
Public methods (7)
  • action_done(self)
    @api.multi
  • action_get_stock_move(self)
    @api.multi
  • action_get_stock_picking(self)
    @api.multi
  • create(self, vals)
    @api.model
  • do_scrap(self)
    @api.multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • unlink(self)
    @api.multi

New fields (26)
  • active Boolean
    default=True args: 'Active'
  • code Char
    help='Short name used to identify your warehouse' required=True size=5 args: 'Short Name'
  • company_id Many2one → res.company
    default=<expr> help='The company is automatically set from your user preferences.' index=True readonly=True required=True args: 'res.company', 'Company'
  • crossdock_route_id Many2one → stock.location.route
    args: 'stock.location.route', 'Crossdock Route'
  • default_resupply_wh_id Many2one → stock.warehouse
    help='Goods will always be resupplied from this warehouse' args: 'stock.warehouse', 'Default Resupply Warehouse'
  • delivery_route_id Many2one → stock.location.route
    args: 'stock.location.route', 'Delivery Route'
  • delivery_steps Selection
    default='ship_only' help='Default outgoing route to follow' required=True args: [('ship_only', 'Ship directly from stock (Ship only)'), ('pick_ship', 'Bring goods to output location before shipping (Pick + Ship)'), ('pick_pack_ship', 'Make packages into a dedicated location, then bring them to the output location for shipping (Pick + Pack + Ship)')], 'Outgoing Shippings'
  • in_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'In Type'
  • int_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Internal Type'
  • lot_stock_id Many2one → stock.location
    domain=[('usage', '=', 'internal')] required=True args: 'stock.location', 'Location Stock'
  • mto_pull_id Many2one → procurement.rule
    args: 'procurement.rule', 'MTO rule'
  • name Char
    default=<expr> index=True required=True args: 'Warehouse Name'
  • out_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Out Type'
  • pack_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Pack Type'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Address'
  • pick_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Pick Type'
  • reception_route_id Many2one → stock.location.route
    args: 'stock.location.route', 'Receipt Route'
  • reception_steps Selection
    default='one_step' help='Default incoming route to follow' required=True args: [('one_step', 'Receive goods directly in stock (1 step)'), ('two_steps', 'Unload in input location then go to stock (2 steps)'), ('three_steps', 'Unload in input location, go through a quality control before being admitted in stock (3 steps)')], 'Incoming Shipments'
  • resupply_route_ids One2many → stock.location.route
    help='Routes will be created for these resupply warehouses and you can select them on products and product categories' args: 'stock.location.route', 'supplied_wh_id', 'Resupply Routes'
  • resupply_wh_ids Many2many → stock.warehouse
    args: 'stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply Warehouses'
  • route_ids Many2many → stock.location.route
    domain="[('warehouse_selectable', '=', True)]" help='Defaults routes through the warehouse' args: 'stock.location.route', 'stock_route_warehouse', 'warehouse_id', 'route_id', 'Routes'
  • view_location_id Many2one → stock.location
    domain=[('usage', '=', 'view')] required=True args: 'stock.location', 'View Location'
  • wh_input_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Input Location'
  • wh_output_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Output Location'
  • wh_pack_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Packing Location'
  • wh_qc_stock_loc_id Many2one → stock.location
    args: 'stock.location', 'Quality Control Location'
Public methods (9)
  • action_view_all_routes(self)
    @api.multi
  • change_route(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_resupply_routes(self, supplier_warehouses, default_resupply_wh)
  • create_routes(self)
    @api.multi
  • create_sequences_and_picking_types(self)
  • get_routes_dict(self)
  • onchange_resupply_warehouses(self)
    @api.depends('default_resupply_wh_id', 'resupply_wh_ids')
  • write(self, vals)
    @api.multi

New fields (14)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the orderpoint without removing it.' args: 'Active'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • group_id Many2one → procurement.group
    copy=False help='Moves created through this orderpoint will be put in this procurement group. If none is given, the moves generated by procurement rules will be grouped into one big picking.' args: 'procurement.group', 'Procurement Group'
  • lead_days Integer
    default=1 help='Number of days after the orderpoint is triggered to receive the products or to order to the vendor' args: 'Lead Time'
  • lead_type Selection
    default='supplier' required=True args: [('net', 'Day(s) to get the products'), ('supplier', 'Day(s) to purchase')], 'Lead Type'
  • location_id Many2one → stock.location
    ondelete='cascade' required=True args: 'stock.location', 'Location'
  • name Char
    copy=False default=<expr> required=True args: 'Name'
  • procurement_ids One2many → procurement.order
    args: 'procurement.order', 'orderpoint_id', 'Created Procurements'
  • product_id Many2one → product.product
    domain=[('type', '=', 'product')] ondelete='cascade' required=True args: 'product.product', 'Product'
  • product_max_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='When the virtual stock goes below the Min Quantity, Odoo generates a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity.' required=True args: 'Maximum Quantity'
  • product_min_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='When the virtual stock goes below the Min Quantity specified for this field, Odoo generates a procurement to bring the forecasted quantity to the Max Quantity.' required=True args: 'Minimum Quantity'
  • product_uom Many2one → product.uom
    default=<expr> readonly=True related='product_id.uom_id' required=True args: 'product.uom', 'Product Unit of Measure'
  • qty_multiple Float
    default=1 digits=dp.get_precision('Product Unit of Measure') help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True args: 'Qty Multiple'
  • warehouse_id Many2one → stock.warehouse
    ondelete='cascade' required=True args: 'stock.warehouse', 'Warehouse'
Public methods (4)
  • default_get(self, fields)
    @api.model
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
    Finds location id for changed warehouse.
  • subtract_procurements_from_orderpoints(self)
    @api.multi
    This function returns quantity of product that needs to be deducted from the orderpoint computed quantity because there's already a procurement created with aim to fulfill it.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Fabien Meghazi, Christophe Simonis, David Monjoie, Joren Van Onder, Goffin Simon, Cedric Snauwaert, Simon Lejeune, Frédéric van der Essen, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Damien Bouvy, Arthur Maniet, Yannick Tivisse, qsm-odoo, Martin Geubelle, Pierre Masereel, pimodoo, gde-odoo, Ludovic Laffineur lla
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - report
    - procurement
    - barcodes
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage multi-warehouses, multi- and structured stock locations
==============================================================

The warehouse and inventory management is based on a hierarchical location structure, from warehouses to storage bins.
The double entry inventory system allows you to manage customers, vendors as well as manufacturing inventories.

OpenERP has the capacity to manage lots and serial numbers ensuring compliance with the traceability requirements imposed by the majority of industries.

Key Features
------------
* Moves history and planning,
* Minimum stock rules
* Support for barcodes
* Rapid detection of mistakes through double entry system
* Traceability (Serial Numbers, Packages, ...)

Dashboard / Reports for Inventory Management will include:
----------------------------------------------------------
* Incoming Products (Graph)
* Outgoing Products (Graph)
* Procurement in Exception
* Inventory Analysis
* Last Product Inventories
* Moves Analysis
    

Code Analysis

Views touched (101)
XML IDNameModelTypeStatus
assets_common stock_location_barcodes pdf assets ir.ui.view qweb Inherits report.assets_common
external_layout_barcode_right external_layout_barcode_right ir.ui.view qweb Inherits report.external_layout
external_layout_header_barcode_right external_layout_header_barcode_right ir.ui.view qweb Inherits report.external_layout_header
inventory_planner inventory_planner ir.ui.view qweb New
procurement_group_form_view_herited procurement.group.form.herited procurement.group div Inherits procurement.procurement_group_form_view
product_category_form_view_inherit product.category.form product.category group Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product data Inherits product.product_normal_form_view
product_kanban_stock_view Product Kanban Stock product.product field Inherits product.product_kanban_view
product_product_view_form_easy_inherit_stock product.product.view.form.easy.inherit.stock product.product sheet Inherits product.product_variant_easy_edit_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template data Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template field Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template field Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
report_delivery_document report_delivery_document ir.ui.view qweb New
report_deliveryslip report_deliveryslip ir.ui.view qweb New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_barcode report_lot_barcode ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_stock_lines_date_form report.stock.lines.date.form report.stock.lines.date form New
report_stock_lines_date_search report.stock.lines.date.search report.stock.lines.date search New
report_stock_lines_date_tree report.stock.lines.date.tree report.stock.lines.date tree New
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_incoterms_form stock.incoterms.form stock.incoterms form New
stock_inventory_line_search stock.inventory.line.search stock.inventory.line search New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_inventory_line_tree2 stock.inventory.line.tree2 stock.inventory.line tree New
stock_location_path_filter stock.location.path.select stock.location.path search New
stock_location_path_form stock.location.path.form stock.location.path form New
stock_location_path_tree stock.location.path.tree stock.location.path tree New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_move_tree Stock Moves stock.move tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
view_backorder_confirmation stock_backorder_confirmation stock.backorder.confirmation form New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_immediate_transfer view_immediate_transfer stock.immediate.transfer form New
view_incoterms_tree stock.incoterms.tree stock.incoterms tree New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_make_procurment_wizard Procurement Request make.procurement form New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_picking_form stock.move.form stock.move form New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_pivot stock.move.pivot stock.move pivot New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_move_tree_receipt_picking_board stock.move.tree3 stock.move tree New
view_pack_operation_details_form stock.pack.operation.details.form stock.pack.operation form New
view_pack_operation_details_form_save stock.pack.operation.details.form.save stock.pack.operation group Inherits stock.view_pack_operation_details_form
view_pack_operation_lot_form stock.pack.operation.lots.form stock.pack.operation form New
view_pack_operation_lot_lot_form stock.pack.operation.lots.form stock.pack.operation.lot form New
view_partner_stock_form res.partner.stock.property.form.inherit res.partner xpath Inherits mail.view_emails_partner_info_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_type_form Picking Types stock.picking.type form New
view_picking_type_list stock.picking.type.list stock.picking.type tree New
view_picking_type_tree Picking types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Run Reordering Rules procurement.orderpoint.compute form New
view_procurement_form_stock_inherit procurement.order.form.stock.inherit procurement.order xpath Inherits procurement.procurement_form_view
view_procurement_rule_form_stock_inherit procurement.rule.form.stock.inherit procurement.rule xpath Inherits procurement.view_procurement_rule_form
view_procurement_rule_tree_stock_inherit procurement.rule.tree.stock.inherit procurement.rule xpath Inherits procurement.view_procurement_rule_tree
view_procurement_tree_stock_inherit procurement.order.tree.stock.inherit procurement.order xpath Inherits procurement.procurement_tree_view
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway product.putaway.form product.putaway form New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_stock_config_settings stock settings stock.config.settings form New
view_stock_level_forecast_filter view.stock.level.forecast.filter report.stock.forecast search New
view_stock_level_forecast_graph Stock.forecast.graph report.stock.forecast graph New
view_stock_level_forecast_pivot Stock.forecast.pivot report.stock.forecast pivot New
view_stock_move_scrap_wizard Scrap Move stock.move.scrap form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template tree Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product tree Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_graph_value stock.quant.graph stock.quant graph New
view_stock_quant_pivot stock.quant.pivot stock.quant pivot New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_return_picking_form Return lines stock.return.picking form New
view_template_property_form product.template.stock.property.form.inherit product.template div Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (7)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • cumulative_quantity Float
    readonly=True string='Cumulative Quantity'
  • date Date
    string='Date'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' string='Product' args: 'product.template'
  • quantity Float
    readonly=True
Public methods (1)
  • init(self, cr)

New fields (1)
  • pick_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • process(self)
    @api.multi
  • process_cancel_backorder(self)
    @api.multi

New fields (1)
  • pick_id Many2one → stock.picking
    args: 'stock.picking'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (28)
  • action_assign(self, cr, uid, ids, context=None)
    Check availability of picking moves. This has the effect of changing the state and reserve quants on available moves, and may also impact the state of the picking as it is computed based on move's states. @return: True
  • action_assign_owner(self, cr, uid, ids, context=None)
  • action_cancel(self, cr, uid, ids, context=None)
  • action_confirm(self, cr, uid, ids, context=None)
  • action_done(self, cr, uid, ids, context=None)
    Changes picking state to done by processing the Stock Moves of the Picking Normally that happens when the button "Done" is pressed on a Picking view. @return: True
  • check_backorder(self, cr, uid, picking, context=None)
  • create(self, cr, user, vals, context=None)
  • create_lots_for_picking(self, cr, uid, ids, context=None)
  • default_get(self, fields)
    @api.model
  • do_new_transfer(self, cr, uid, ids, context=None)
  • do_prepare_partial(self, cr, uid, picking_ids, context=None)
    @api.cr_uid_ids_context
  • do_print_picking(self, cr, uid, ids, context=None)
    This function prints the picking list
  • do_recompute_remaining_quantities(self, cr, uid, picking_ids, done_qtys=False, context=None)
    @api.cr_uid_ids_context
  • do_split(self, cr, uid, picking_ids, context=None)
    @api.cr_uid_ids_context
    just split the picking (create a backorder) without making it 'done'
  • do_transfer(self, cr, uid, ids, context=None)
    If no pack operation, we do simple action_done of the picking Otherwise, do the pack operations
  • do_unreserve(self, cr, uid, picking_ids, context=None)
    @api.cr_uid_ids_context
    Will remove all quants for picking in picking_ids
  • force_assign(self, cr, uid, ids, context=None)
    Changes state of picking to available if moves are confirmed or waiting. @return: True
  • get_min_max_date(self, cr, uid, ids, field_name, arg, context=None)
    Finds minimum and maximum dates for picking. @return: Dictionary of values
  • launch_packops(self, cr, uid, ids, context=None)
  • onchange_picking_type(self, cr, uid, ids, picking_type_id, partner_id, context=None)
  • picking_recompute_remaining_quantities(self, cr, uid, picking, done_qtys=False, context=None)
  • put_in_pack(self, cr, uid, ids, context=None)
  • recheck_availability(self, cr, uid, picking_ids, context=None)
    @api.cr_uid_ids_context
  • recompute_remaining_qty(self, cr, uid, picking, done_qtys=False, context=None)
  • rereserve_pick(self, cr, uid, ids, context=None)
    This can be used to provide a button that rereserves taking into account the existing pack operations
  • rereserve_quants(self, cr, uid, picking, move_ids=[], context=None)
    Unreserve quants then try to reassign quants.
  • unlink(self, cr, uid, ids, context=None)
  • write(self, cr, uid, ids, vals, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Rucha (Open ERP), Randhir Mayatra (OpenERP), Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, Martin Trigaux, Foram Katharotiya (OpenERP), Purnendu Singh (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Vo Minh Thu, Josse Colpaert, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, niv-openerp, ggh-openerp, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Anael Closson, Cedric Snauwaert, Simon Lejeune, Frédéric van der Essen, Vishmita, Nicolas Martinelli, Chirag Dodiya (OpenERP Trainee), Amit Bhavsar (Open ERP), Lionel Sausin, Paramjit Singh Sahota, Hiral Patel (OpenERP), Richard Mathot, qdp-odoo, Géry Debongnie, jke-openerp, Aaron Bohy, bth-openerp, Bharat R. Devnani (OpenERP), Richard Mathot (OpenERP), ged-odoo, Jeremy Kersten, Gery Debongnie, Randhir Mayatra rma-openerp, sgo@tinyerp.com, Lucas Perais (lpe), Darshan Kalola (OpenERP), Darshan Kalola, Jitendra Prajapati (OpenERP), Sunil Sharma (OpenERP Trainee), Damien Bouvy, Yogesh Parekh (OpenERP), Sunil Sharma (OpenERP), Rakesh Sindhav (OpenERP), Jaydeep Barot, Pooja Zankhariya (OpenERP), Mantavya Gajjar, Sanjay Gohel (OpenERP)
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:38
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - report
    - procurement
    - board
    - web_kanban_gauge
    - web_kanban_sparkline
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage multi-warehouses, multi- and structured stock locations
==============================================================

The warehouse and inventory management is based on a hierarchical location structure, from warehouses to storage bins.
The double entry inventory system allows you to manage customers, suppliers as well as manufacturing inventories.

OpenERP has the capacity to manage lots and serial numbers ensuring compliance with the traceability requirements imposed by the majority of industries.

Key Features
------------
* Moves history and planning,
* Minimum stock rules
* Support for barcodes
* Rapid detection of mistakes through double entry system
* Traceability (Serial Numbers, Packages, ...)

Dashboard / Reports for Warehouse Management will include:
----------------------------------------------------------
* Incoming Products (Graph)
* Outgoing Products (Graph)
* Procurement in Exception
* Inventory Analysis
* Last Product Inventories
* Moves Analysis
    

Code Analysis

Views touched (83)
XML IDNameModelTypeStatus
assets_backend stock assets ir.ui.view qweb Inherits web.assets_backend
barcode_index Barcode Scanner ir.ui.view qweb New
procurement_group_form_view_herited procurement.group.form.herited procurement.group xpath Inherits procurement.procurement_group_form_view
product_category_form_view_inherit product.category.form product.category xpath Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product xpath Inherits product.product_normal_form_view
product_kanban_stock_view Product Kanban Stock product.product field Inherits product.product_kanban_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template xpath Inherits product.product_template_only_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template field Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template field Inherits product.product_template_search_view
quant_package_search_view stock.quant.package.search stock.quant.package search New
quant_search_view stock.quant.search stock.quant search New
report_inventory report_inventory ir.ui.view qweb New
report_location_barcode report_location_barcode ir.ui.view qweb New
report_lot_barcode report_lot_barcode ir.ui.view qweb New
report_package_barcode report_package_barcode ir.ui.view qweb New
report_package_barcode_small report_package_barcode_small ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_stock_lines_date_form report.stock.lines.date.form report.stock.lines.date form New
report_stock_lines_date_search report.stock.lines.date.search report.stock.lines.date search New
report_stock_lines_date_tree report.stock.lines.date.tree report.stock.lines.date tree New
search_product_lot_filter Production Lots Filter stock.production.lot search New
stock_incoterms_form stock.incoterms.form stock.incoterms form New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_location_path_form stock.location.path.form stock.location.path form New
stock_location_path_tree stock.location.path.tree stock.location.path tree New
stock_location_route_form_view stock.location.route.form stock.location.route form New
stock_location_route_tree stock.location.route.tree stock.location.route tree New
stock_move_tree Stock Moves stock.move tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_type_kanban stock.picking.type.kanban stock.picking.type kanban New
stock_return_line_form_in stock.return.picking.line.from stock.return.picking.line form New
stock_return_line_tree_in stock.return.picking.line.tree stock.return.picking.line tree New
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_incoterms_tree stock.incoterms.tree stock.incoterms tree New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_search stock.location.search stock.location search New
view_location_tree2 stock.location.tree stock.location tree New
view_make_procurment_wizard Procurement Request make.procurement form New
view_move_form stock.move.form stock.move form New
view_move_graph stock.move.graph stock.move graph New
view_move_picking_form stock.move.form stock.move form New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_receipt_picking stock.move.tree2 stock.move tree New
view_move_tree_receipt_picking_board stock.move.tree3 stock.move tree New
view_partner_property_form res.partner.stock.property.form.inherit res.partner group Inherits product.view_partner_property_form
view_picking_form stock.picking.form stock.picking form New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_type_form Picking Types stock.picking.type form New
view_picking_type_tree Picking types stock.picking.type tree New
view_pickingtype_filter stock.picking.type.filter stock.picking.type search New
view_procurement_compute_wizard Compute Stock Minimum Rules Only procurement.orderpoint.compute form New
view_procurement_form_stock_inherit procurement.order.form.stock.inherit procurement.order xpath Inherits procurement.procurement_form_view
view_procurement_rule_form_stock_inherit procurement.rule.form.stock.inherit procurement.rule xpath Inherits procurement.view_procurement_rule_form
view_procurement_rule_tree_stock_inherit procurement.rule.tree.stock.inherit procurement.rule xpath Inherits procurement.view_procurement_rule_tree
view_procurement_tree_stock_inherit procurement.order.tree.stock.inherit procurement.order xpath Inherits procurement.procurement_tree_view
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_putaway product.putaway.form product.putaway form New
view_quant_package_form stock.quant.package.form stock.quant.package form New
view_quant_package_tree stock.quant.package.tree stock.quant.package tree New
view_removal product.removal.form product.removal form New
view_stock_config_settings stock settings stock.config.settings form New
view_stock_enter_transfer_details Enter transfer details stock.transfer_details form New
view_stock_move_scrap_wizard Scrap Move stock.move.scrap form New
view_stock_product_template_tree product.template.stock.tree.inherit product.template tree Inherits product.product_template_tree_view
view_stock_product_tree product.stock.tree.inherit product.product tree Inherits product.product_product_tree_view
view_stock_quant_form stock.quant.form stock.quant form New
view_stock_quant_graph_value stock.quant.graph stock.quant graph New
view_stock_quant_tree stock.quant.tree stock.quant tree New
view_stock_return_picking_form Return lines stock.return.picking form New
view_template_property_form product.template.stock.property.form.inherit product.template group Inherits product.product_template_form_view
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint form New
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint tree New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
Models touched (2)

New fields (5)
  • item_ids One2many → stock.transfer_details_items
    domain=[('product_id', '!=', False)] args: 'stock.transfer_details_items', 'transfer_id', 'Items'
  • packop_ids One2many → stock.transfer_details_items
    domain=[('product_id', '=', False)] args: 'stock.transfer_details_items', 'transfer_id', 'Packs'
  • picking_destination_location_id Many2one → stock.location
    readonly=True related='picking_id.location_dest_id' store=False string='Head destination location' args: 'stock.location'
  • picking_id Many2one → stock.picking
    args: 'stock.picking', 'Picking'
  • picking_source_location_id Many2one → stock.location
    readonly=True related='picking_id.location_id' store=False string='Head source location' args: 'stock.location'
Public methods (3)
  • default_get(self, cr, uid, fields, context=None)
  • do_detailed_transfer(self)
    @api.one
  • wizard_view(self)
    @api.multi

New fields (12)
  • date Datetime
    args: 'Date'
  • destinationloc_id Many2one → stock.location
    required=True args: 'stock.location', 'Destination Location'
  • lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot/Serial Number'
  • owner_id Many2one → res.partner
    help='Owner of the quants' args: 'res.partner', 'Owner'
  • package_id Many2one → stock.quant.package
    domain="['|', ('location_id', 'child_of', sourceloc_id), ('location_id','=',False)]" args: 'stock.quant.package', 'Source package'
  • packop_id Many2one → stock.pack.operation
    args: 'stock.pack.operation', 'Operation'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • product_uom_id Many2one → product.uom
    args: 'product.uom', 'Product Unit of Measure'
  • quantity Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') args: 'Quantity'
  • result_package_id Many2one → stock.quant.package
    domain="['|', ('location_id', 'child_of', destinationloc_id), ('location_id','=',False)]" args: 'stock.quant.package', 'Destination package'
  • sourceloc_id Many2one → stock.location
    required=True args: 'stock.location', 'Source Location'
  • transfer_id Many2one → stock.transfer_details
    args: 'stock.transfer_details', 'Transfer'
Public methods (4)
  • product_id_change(self, product, uom=False)
    @api.multi
  • put_in_pack(self)
    @api.multi
  • source_package_change(self, sourcepackage)
    @api.multi
  • split_quantities(self)
    @api.multi
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Pinakin Nayi (OpenERP), Benoit Guillot, DBR (OpenERP), Harry (OpenERP), Antonin Bourguignon, pankita shah (Open ERP), ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Saurang Suthar, Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Josse Colpaert, Arnaud Pineux, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Alexis de Lattre, help, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, David Monjoie, Denis Ledoux dle@openerp.com, Dharti Ratani (OpenERP), Anael Closson, Khushboo Bhatt (Open ERP), Mohammed Shekha, dle@openerp.com, Bhumi Thakkar (Open ERP), Cedric Snauwaert, Ravish Murari (OpenERP), Amit Patel, Frédéric van der Essen, Gilles Major, Chris Biersbach, Vijaykumar Baladaniya, Hardik Ansodariya, Dhruti Shastri (OpenERP), Nicolas Martinelli, Jigar Amin, Sebastien LANGE, Yannick Vaucher, Somesh Khare (OpenERP), Amit (OpenERP), Minh Tran, Anaël Closson, Ankita Patel (OpenERP), Amit Rasmiya, Romain Deheele, RGA(OpenERP), Kersten Jeremy, Guewen Baconnier, Amit Dodiya, Lorenzo Battistini, Chandni Gandhi, Dharti Ratani (Open ERP), Alexandre Fayolle, Dhruti Shastri, Mohammad Alhashash, Amit Bhavsar (Open ERP), Lionel Sausin, alexandre.fayolle@camptocamp.com, Paramjit Singh Sahota, Rifakat, Nicolas Lempereur
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - process
    - web
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - account
    - analytic
    - board
    - edi
    - email_template
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage multi-warehouses, multi- and structured stock locations
==============================================================

The warehouse and inventory management is based on a hierarchical location structure, from warehouses to storage bins. 
The double entry inventory system allows you to manage customers, suppliers as well as manufacturing inventories. 

OpenERP has the capacity to manage lots and serial numbers ensuring compliance with the traceability requirements imposed by the majority of industries.

Key Features
------------
* Moves history and planning,
* Stock valuation (standard or average price, ...)
* Robustness faced with Inventory differences
* Automatic reordering rules
* Support for barcodes
* Rapid detection of mistakes through double entry system
* Traceability (Upstream / Downstream, Serial numbers, ...)

Dashboard / Reports for Warehouse Management will include:
----------------------------------------------------------
* Incoming Products (Graph)
* Outgoing Products (Graph)
* Procurement in Exception
* Inventory Analysis
* Last Product Inventories
* Moves Analysis
    

Code Analysis

Views touched (87)
XML IDNameModelTypeStatus
board_warehouse_form board.warehouse.form board.board form New
lot_line_tree stock.tracking.tree stock.tracking tree New
name_form stock.inventory.merge.form stock.inventory.merge form New
product_kanban_stock_view Product Kanban Stock product.product field Inherits product.product_kanban_view
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
report_stock_lines_date_form report.stock.lines.date.form report.stock.lines.date form New
report_stock_lines_date_search report.stock.lines.date.search report.stock.lines.date search New
report_stock_lines_date_tree report.stock.lines.date.tree report.stock.lines.date tree New
search_product_lot_filter Production Lots Filter stock.production.lot search New
search_stock_packs Pack Search stock.tracking search New
stock_incoterms_form stock.incoterms.form stock.incoterms form New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_move_tree Stock Moves stock.move tree New
stock_move_tree2 Stock Moves stock.move tree New
stock_partial_move_form stock.partial.move.form stock.partial.move form New
stock_partial_move_line_form stock.partial.move.line.form stock.partial.move.line form New
stock_partial_move_line_list stock.partial.move.line.list stock.partial.move.line tree New
stock_partial_picking_form stock.partial.picking.form stock.partial.picking form New
stock_partial_picking_line_form stock.partial.picking.line.form stock.partial.picking.line form New
stock_partial_picking_line_list stock.partial.picking.line.list stock.partial.picking.line tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_in_calendar stock.picking.in.calendar stock.picking.in calendar New
stock_picking_out_calendar stock.picking.out.calendar stock.picking.out calendar New
stock_return_memory_form_in stock.return.picking.memory.from stock.return.picking.memory form New
stock_return_memory_tree_in stock.return.picking.memory.tree stock.return.picking.memory tree New
view_category_property_form product.category.stock.property.form.inherit product.category data Inherits account.view_category_property_form
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_change_standard_price Change Standard Price stock.change.standard.price form New
view_incoterms_tree stock.incoterms.tree stock.incoterms tree New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_line_form stock.inventory.line.form stock.inventory.line form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_graph stock.location.graph stock.location graph New
view_location_search stock.location.search stock.location search New
view_location_tree stock.location.tree stock.location tree New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_picking_form stock.move.form stock.move form New
view_move_picking_tree stock.move.tree stock.move tree New
view_move_search stock.move.search stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_reception_picking stock.move.tree2 stock.move tree New
view_move_tree_reception_picking_board stock.move.tree3 stock.move tree New
view_normal_procurement_locations_form product.normal.procurement.locations.inherit product.product group Inherits product.product_normal_form_view
view_normal_property_acc_form product.normal.stock.acc.property.form.inherit product.product xpath Inherits product.product_normal_form_view
view_partner_property_form res.partner.stock.property.form.inherit res.partner group Inherits product.view_partner_property_form
view_picking_form stock.picking.form stock.picking form New
view_picking_in_form stock.picking.in.form stock.picking.in field Inherits view_picking_form
view_picking_in_search stock.picking.in.search stock.picking.in search New
view_picking_in_tree stock.picking.in.tree stock.picking.in tree New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_out_form stock.picking.out.form stock.picking.out field Inherits view_picking_form
view_picking_out_search stock.picking.out.search stock.picking search New
view_picking_out_tree stock.picking.out.tree stock.picking.out tree New
view_product_standard_price_form product.product.standard.price.form.inherit product.product field Inherits product.product_normal_form_view
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_revision_form stock.production.lot.revision.form stock.production.lot.revision form New
view_production_lot_revision_tree stock.production.lot.revision.tree stock.production.lot.revision tree New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_split_in_lots Split in Serial Numbers stock.move.split form New
view_split_in_lots_inherit Split Inventory Line stock.inventory.line.split form New
view_stock_config_settings stock settings stock.config.settings form New
view_stock_fill_inventory Import Inventory stock.fill.inventory form New
view_stock_graph report.stock.move.graph report.stock.move graph New
view_stock_graph_board report.stock.move.graph report.stock.move graph New
view_stock_inventory_graph report.stock.inventory.graph report.stock.inventory graph New
view_stock_inventory_search report.stock.inventory.search report.stock.inventory search New
view_stock_inventory_tree report.stock.inventory.tree report.stock.inventory tree New
view_stock_invoice_onshipping Stock Invoice Onshipping stock.invoice.onshipping form New
view_stock_journal_filter stock.journal.filter stock.journal search New
view_stock_journal_form Stock Journals stock.journal form New
view_stock_journal_tree Stock Journals stock.journal tree New
view_stock_location_product Products by Location stock.location.product form New
view_stock_move_consume_wizard Consume Move stock.move.consume form New
view_stock_move_scrap_wizard Scrap Move stock.move.scrap form New
view_stock_move_split_wizard Split move stock.split.into form New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_search report.stock.move.search report.stock.move search New
view_stock_tree report.stock.move.tree report.stock.move tree New
view_template_property_form product.template.stock.property.form.inherit product.template group Inherits product.product_template_form_view
view_tracking_form stock.tracking.form stock.tracking form New
view_tracking_tree stock.tracking.tree stock.tracking tree New
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/stock
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Rucha (Open ERP), Stephane Wirtel, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Pinakin Nayi (OpenERP), DBR (OpenERP), Harry (OpenERP), Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Divyesh Makwana (Open ERP), Thibault Delavallée, Vo Minh Thu, pso (OpenERP), Launchpad Translations on behalf of openerp, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Mayur Maheshwari (OpenERP), Alexis de Lattre, vro, olt@tinyerp.com, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Xavier Morel, Chris Biersbach, Serpent Consulting Services, Amit (OpenERP), Minh Tran, Rifakat, Najlaâ, Thibault Francois, Raphaël Valyi, sebastien beau, Niels Huylebroeck, Quentin THEURET, Carlos Vásquez, Bogdan Stanciu, ksa (Open ERP), Cristian Salamea, Els Van Vossel, Israel Fermin Montilla, Rifakat Haradwala (Open ERP), mayur maheshwari (Open ERP), Hardik Ansodariy (OpenERP), ssu, rch-openerp, aag (OpenERP), Yogesh (OpenERP), Sbh (OpenERP), ron@tinyerp.com, fp, qdp-launchpad@tinyerp.com, AMP (OpenERP), psi (Open ERP), Tejas (OpenERP), Amit Parmar (OpenERP), RavishchanraMurari (Open ERP), Kirti Savalia (OpenERP), Hemendra Paregi (Open ERP), Dhara (OpenERP), Atik Agewan (OpenERP), renatonlima@gmail.com, Viktor Nagy, Ravi Gohil (Open ERP), avp, philubert@gmail.com, rpa (Open ERP), Ariel Figueroa, msh-openerp, Somesh Khare, rha@tinyerp.com, nel@tinyerp.com
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - process
    - decimal_precision
    - account
    - base_setup
    - analytic
    - board
    - edi
    - email_template
    - mail
    - base_tools
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
OpenERP Inventory Management module can manage multi-warehouses, multi and structured stock locations.
======================================================================================================

Thanks to the double entry management, the inventory controlling is powerful and flexible:
    * Moves history and planning,
    * Different inventory methods (FIFO, LIFO, ...)
    * Stock valuation (standard or average price, ...)
    * Robustness faced with Inventory differences
    * Automatic reordering rules (stock level, JIT, ...)
    * Bar code supported
    * Rapid detection of mistakes through double entry system
    * Traceability (upstream/downstream, production lots, serial number, ...)
    * Dashboard for warehouse that includes:
        * Procurement in exception
        * List of Incoming Products
        * List of Outgoing Products
        * Graph : Products to receive in delay (date < = today)
        * Graph : Products to send in delay (date < = today)
    

Code Analysis

Views touched (87)
XML IDNameModelTypeStatus
board_warehouse_form board.warehouse.form board.board form New
lot_line_tree stock.tracking.tree stock.tracking tree New
name_form stock.inventory.merge.form stock.inventory.merge form New
product.product_kanban_view Product Kanban product.product kanban New
product_search_form_view_stock product.search.stock.form product.product field Inherits product.product_search_form_view
report_stock_lines_date_form report.stock.lines.date.form report.stock.lines.date form New
report_stock_lines_date_search report.stock.lines.date.search report.stock.lines.date search New
report_stock_lines_date_tree report.stock.lines.date.tree report.stock.lines.date tree New
search_product_lot_filter Production Lots Filter stock.production.lot search New
search_stock_packs Pack Search stock.tracking search New
stock_incoterms_form stock.incoterms.form stock.incoterms form New
stock_inventory_line_tree stock.inventory.line.tree stock.inventory.line tree New
stock_move_tree Stock Moves stock.move tree New
stock_move_tree2 Stock Moves stock.move tree New
stock_partial_move_form stock.partial.move.form stock.partial.move form New
stock_partial_move_line_form stock.partial.move.line.form stock.partial.move.line form New
stock_partial_move_line_list stock.partial.move.line.list stock.partial.move.line tree New
stock_partial_picking_form stock.partial.picking.form stock.partial.picking form New
stock_partial_picking_line_form stock.partial.picking.line.form stock.partial.picking.line form New
stock_partial_picking_line_list stock.partial.picking.line.list stock.partial.picking.line tree New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_return_memory_form_in stock.return.picking.memory.from stock.return.picking.memory form New
stock_return_memory_tree_in stock.return.picking.memory.tree stock.return.picking.memory tree New
view_category_property_form product.category.stock.property.form.inherit product.category form Inherits product.product_category_form_view
view_change_product_quantity Change Product Quantity stock.change.product.qty form New
view_change_standard_price Change Standard Price stock.change.standard.price form New
view_incoterms_tree stock.incoterms.tree stock.incoterms tree New
view_inventory_filter stock.inventory.filter stock.inventory search New
view_inventory_form stock.inventory.form stock.inventory form New
view_inventory_line_form stock.inventory.line.form stock.inventory.line form New
view_inventory_tree stock.inventory.tree stock.inventory tree New
view_location_form stock.location.form stock.location form New
view_location_graph stock.location.graph stock.location graph New
view_location_search stock.location.search stock.location search New
view_location_tree stock.location.tree stock.location tree New
view_location_tree2 stock.location.tree stock.location tree New
view_move_form stock.move.form stock.move form New
view_move_form_reception_picking stock.move.form2 stock.move form New
view_move_search stock.move.search stock.move search New
view_move_search_reception_incoming_picking stock.move.incoming.search2 stock.move search New
view_move_search_reception_outcoming_picking stock.move.outgoing.search2 stock.move search New
view_move_tree stock.move.tree stock.move tree New
view_move_tree_reception_picking stock.move.tree2 stock.move tree New
view_move_tree_reception_picking_board stock.move.tree3 stock.move tree New
view_normal_property_acc_form product.normal.stock.acc.property.form.inherit product.product xpath Inherits product.product_normal_form_view
view_normal_property_form product.normal.stock.property.form.inherit product.product group Inherits product.product_normal_form_view
view_normal_stock_property_form product.normal.stock.form.inherit product.product group Inherits product.product_normal_form_view
view_partner_property_form res.partner.stock.property.form.inherit res.partner page Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking form New
view_picking_in_form stock.picking.in.form stock.picking form New
view_picking_in_search stock.picking.in.search stock.picking search New
view_picking_in_tree stock.picking.in.tree stock.picking tree New
view_picking_internal_search stock.picking.internal.search stock.picking search New
view_picking_out_form stock.picking.out.form stock.picking form New
view_picking_out_search stock.picking.out.search stock.picking search New
view_picking_out_tree stock.picking.out.tree stock.picking tree New
view_product_standard_price_form product.product.standard.price.form.inherit product.product field Inherits product.product_normal_form_view
view_production_lot_form stock.production.lot.form stock.production.lot form New
view_production_lot_revision_form stock.production.lot.revision.form stock.production.lot.revision form New
view_production_lot_revision_tree stock.production.lot.revision.tree stock.production.lot.revision tree New
view_production_lot_tree stock.production.lot.tree stock.production.lot tree New
view_split_in_lots Split in lots stock.move.split form New
view_split_in_lots_inherit Split Inventory Line stock.inventory.line.split form New
view_stock_fill_inventory Import Inventory stock.fill.inventory form New
view_stock_graph report.stock.move.graph report.stock.move graph New
view_stock_graph_board report.stock.move.graph report.stock.move graph New
view_stock_inventory_graph report.stock.inventory.graph report.stock.inventory graph New
view_stock_inventory_search report.stock.inventory.search report.stock.inventory search New
view_stock_inventory_tree report.stock.inventory.tree report.stock.inventory tree New
view_stock_invoice_onshipping Stock Invoice Onshipping stock.invoice.onshipping form New
view_stock_journal_filter stock.journal.filter stock.journal search New
view_stock_journal_form Stock Journals stock.journal form New
view_stock_journal_tree Stock Journals stock.journal tree New
view_stock_location_product Products by Location stock.location.product form New
view_stock_move_consume_wizard Consume Move stock.move.consume form New
view_stock_move_scrap_wizard Scrap Move stock.move.scrap form New
view_stock_move_split_wizard Split move stock.split.into form New
view_stock_picking_filter stock.picking.list.select stock.picking search New
view_stock_return_picking_form Return lines stock.return.picking form New
view_stock_search report.stock.move.search report.stock.move search New
view_stock_tree report.stock.move.tree report.stock.move tree New
view_template_property_form product.template.stock.property.form.inherit product.template page Inherits product.product_template_form_view
view_tracking_form stock.tracking.form stock.tracking form New
view_tracking_tree stock.tracking.tree stock.tracking tree New
view_warehouse stock.warehouse stock.warehouse form New
view_warehouse_tree stock.warehouse.tree stock.warehouse tree New
vpicktree stock.picking.tree stock.picking tree New
Models touched (0)

No models found for this module.