TIP: You can type at any time to perform a new search.

Security findings

Repository
odoo/odoo · module folder
Module version
1.1
Category
Supply Chain/Inventory
Folder size
28.79 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
https://www.odoo.com/app/inventory
Last tracking update
2026-10-05 00:19:43
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Thibault Delavallée, odoo, Odoo Translation Bot, Christophe Matthieu, Aaron Bohy, Géry Debongnie, Lucas Perais (lpe), Jorge Pinna Puissant, Arnold Moyaux, Julien Castiaux, Xavier-Do, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, William Henrotin, Sébastien Theys, Julien Mougenot, svs-odoo, Alvaro Fuentes, Achraf (abz), David Beguin, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, Romain Estievenart, Miquel Raïch, william-andre, JF Aubert, David (dafr), luvi, Hubert Van De Walle, Renaud Thiry, Adrien Widart (awt), Victor Piryns (pivi), amdi-odoo, Pierre-Yves Dufays, Levi Siuzdak (sile), Dylan Kiss (dyki), ノウラ, Chong Wang (cwg), Xavier Bol (xbo), Paweł Fertyk, Louis Travaux, omra-odoo, Andrzej(pian), lase@odoo.com, Quentin Wolfs, Aurelien MARIE (auma), reka-odoo, yosa-odoo, vava-odoo, kcv-odoo, Louis Gobert, mano-odoo, Harsh Shah, Stéphane Diez, kawkb, dhha-odoo, Claire (clbr), Hammad Arif, Victor Miguel Armenta Carrillo, David Van Droogenbroeck (DROD), pkgu-odoo, Mohammad Abdulmoneim (abdu), djameltouati, Pierre Pulinckx, wt, Bastien PIERRE, Michaël Mattiello, Lakhichand Borse, Mahdi Alijani (malj), MaximeNoirhomme, chha-odoo, plha-odoo, Krzysztof Magusiak (krma), Ajit Singh, krip-odoo, joseph, Robin Engels (roen), sagu-odoo, utma-odoo, Ester Andreetto, nsirjacobs, bhna-odoo, Dirk Douglas, MAGREMENT, romc-odoo, Ze Chen (zeche), mohannedah, Junqi, kinhosz, agbr-odoo, depr-odoo, Lulu Grimalkin (lugr), felin-odoo, sawer, Lancelot Semal, Julien Launois (jula), Laetitia (ldau), adip-odoo, Quentin Colla (qucol), path-odoo, Saurabh, Amr Elkhatieb, Yash Tiwari (Yatiw), Nisarg (nipl), assh-odoo, Robert Smith (rosm), Leila Kerroum Balaguer, hossamelgendy1, YoussefM890, Ravij Parikh, Joe Wesnofske, Mazen, =, srap-odoo, Leonardo Medina, Nguyen Nguyen (ngtpn), jodh-odoo, Eve Lin (evlin), Zachary (zavan), sako-odoo, tpma-odoo, Jonathan Swales, Youssef (abyo), Kadam Darji, Julien Carion, ELCO, lase, Atri Patel(atpa), Moamen(msho), Khaj-odoo, chpa-odoo, Oussema Heni, hapt-odoo, Nuno, Joseph Nechleba (jonec), Sanket Tank(stan), qucol-odoo, kush-odoo, Antonio Pimentel, Mathias Mathy, ddba-odoo, Brian Nguyen, Karim Gamaleldin, jeanschoenlaub, Julien Coppin (jucop), Stef Ossé, alwhi-odoo, Kevin, Lucas Gvasalia, Jean Schoenlaub, pusu-odoo, Elisabeth Dickinson (edi), Lou !, Mahiv Ram, mamg-odoo, japat-odoo, Roman Hardy (rohar), pkhu-odoo, victor Badin (vibad)
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
l10n_din5008_stock, l10n_gr_edi_delivery_note, l10n_in_stock, l10n_vn_edi_viettel_stock, mrp, product_expiry, project_stock, stock_account, stock_fleet, stock_maintenance, stock_sms
Description

Code Analysis info_outline

Views touched (182)
XML IDNameModelTypeStatus
digest_digest_view_form digest.digest.view.form.inherit.stock digest.digest form Inherits digest.digest_digest_view_form
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
location_barcode_4x7_label location_barcode_4x7_label ir.ui.view qweb New
location_barcode_zpl_label location_barcode_zpl_label ir.ui.view qweb New
lot_barcode_4x12_label lot_barcode_4x12_label ir.ui.view qweb New
lot_barcode_alternative_label lot_barcode_alternative_label ir.ui.view qweb New
lot_label_layout_form_picking lot.label.layout.form lot.label.layout form New
lot_qr_4x12_label lot_qr_4x12_label ir.ui.view qweb New
lot_qr_alternative_label lot_qr_alternative_label ir.ui.view qweb New
message_body message_body ir.ui.view qweb New
message_head message_head ir.ui.view qweb New
package_history_search_view stock.package.history.search stock.package.history search New
package_pdf_label package_pdf_label ir.ui.view qweb New
package_zpl_label package_zpl_label ir.ui.view qweb New
picking_label_type_form picking.label.type.form picking.label.type form New
picking_type_barcode_4x7_label picking_type_barcode_4x7_label ir.ui.view qweb New
picking_type_barcode_zpl_label picking_type_barcode_zpl_label ir.ui.view qweb New
product.product_view_list_qty list New
product_category_form_view_inherit product.category.form product.category form Inherits product.product_category_form_view
product_form_view_procurement_button product.product.procurement product.product form Inherits product.product_normal_form_view
product_label_layout_form_picking product.label.layout.form product.label.layout form 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 form Inherits product.product_search_form_view
product_search_form_view_stock_report product.product.search.stock.form.stock.report product.product form Inherits stock_product_search_form_view
product_template_form_view_procurement_button product.template_procurement product.template form Inherits product.product_template_only_form_view
product_template_form_view_stock product.template.stock.property.form.inherit product.template form Inherits product.product_template_form_view
product_template_kanban_stock_view Product Template Kanban Stock product.template kanban Inherits product.product_template_kanban_view
product_template_search_form_view_stock product.template.search.stock.form product.template form Inherits product.product_template_search_view
product_template_search_view_inherit_stock product.template.search.inherit.stock product.template search Inherits product.product_template_search_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.stock product.product kanban 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_inventory report_inventory 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_history_barcode report_package_history_barcode ir.ui.view qweb New
report_picking report_picking ir.ui.view qweb New
report_picking_batch report_picking_batch ir.ui.view qweb New
report_picking_packages report_picking_packages 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 form Inherits base.res_config_settings_view_form
return_label_header return_label_header ir.ui.view qweb 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_add_to_wave_form stock.add.to.wave.form stock.add.to.wave form 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 form Inherits stock.view_location_form
stock_location_view_tree2_editable stock.location.list2.editable stock.location list Inherits stock.view_location_tree2
stock_move_line_view_list stock.move.line.view.list stock.move.line list Inherits stock.view_move_line_tree
stock_move_line_view_list_from_batch stock.move.line.view.list.batch stock.move.line list New
stock_move_line_view_search stock.move.line.search stock.move.line search New
stock_move_view_list_from_batch stock.move.view.list.from.batch stock.move list Inherits stock.view_picking_move_tree
stock_orderpoint_suggest_form Suggest Min-Max stock.orderpoint.suggest form 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_batch_calendar stock.picking.batch.calendar stock.picking.batch calendar New
stock_picking_batch_card stock.picking.batch.card stock.picking.batch New
stock_picking_batch_filter stock.picking.batch.filter stock.picking.batch search New
stock_picking_batch_form stock.picking.batch.form stock.picking.batch form New
stock_picking_batch_kanban stock.picking.batch.kanban stock.picking.batch kanban New
stock_picking_batch_tree stock.picking.batch.list stock.picking.batch list New
stock_picking_calendar stock.picking.calendar stock.picking calendar New
stock_picking_kanban stock.picking.kanban stock.picking kanban New
stock_picking_to_batch_form stock.picking.to.batch.form stock.picking.to.batch form 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_picking_view_batch_tree_ref stock.picking.list.inherit.stock.picking.batch stock.picking list Inherits stock.vpicktree
stock_picking_view_form_from_batch stock.picking.view.form.from.batch stock.picking form Inherits stock.view_picking_form
stock_picking_view_list_create_from_batch stock.picking.view.list.create.from.batch stock.picking list Inherits stock.stock_picking_view_batch_tree_ref
stock_product_search_form_view product.product.search.stock.form product.product form 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_reason_tag_view_form stock.scrap.reason.tag.form stock.scrap.reason.tag form 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 form Inherits stock.stock_warn_insufficient_qty_form_view
track_move_template track_move_template ir.ui.view qweb New
uom_uom_view_form uom.uom.view.form.inherit.stock uom.uom form Inherits uom.uom_uom_view_form
uom_uom_view_list uom.uom.view.list.inherit.stock uom.uom list Inherits uom.uom_uom_view_list
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 form 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 form Inherits mail.res_partner_view_form_inherit_mail
view_partner_stock_warnings_form res.partner.stock.warning res.partner form 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 form Inherits stock.view_stock_rule_form
view_scrap_move_form stock.scrap.move.form stock.move form New
view_scrap_move_list stock.scrap.move.list stock.move list New
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 list Inherits product.product_template_tree_view
view_stock_product_tree product.stock.list.inherit product.product list 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 list 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_replenishment_info Stock Replenishment Information stock.replenishment.info 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_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 list Inherits stock.view_warehouse_orderpoint_tree_editable
view_warehouse_tree stock.warehouse.list stock.warehouse list New
view_zero_demand_confirmation stock.zero.demand.confirmation stock.zero.demand.confirmation form New
vpicktree stock.picking.list stock.picking list New
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint search New
HTTP endpoints (1)
Route(s)HandlerAuthTypeMethodsFlags
/stock/<string:output_format>/<string:report_name> StockReportController.report user http ALL
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 (4)
  • kpi_stock_delivery_count Boolean
    args: 'Deliveries'
  • kpi_stock_delivery_count_value Integer
    compute='_compute_kpi_stock_delivery_count_value'
  • kpi_stock_receipt_count Boolean
    args: 'Receipts'
  • kpi_stock_receipt_count_value Integer
    compute='_compute_kpi_stock_receipt_count_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • custom_quantity Integer
    default=1
  • 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')]
  • lot_ids Many2many → stock.lot
    args: 'stock.lot'
  • 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 (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_packaging Boolean
    help="Print labels with each delivery order line's packaging." args: 'Print Packaging'
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
    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."
  • 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
    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."
  • 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' store=False 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
    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."
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_routes_actions(self)
    Return the route action types expected for this product. Installed modules can extend this list based on the product's relevant field values, such as vendors or bills of materials.
  • 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'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • uom_id Many2one → uom.uom
    domain="[('id', 'in', allowed_uom_ids)]" required=True string='Unity of measure' args: 'uom.uom'
  • 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 (24)
  • 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'
  • 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' index='btree_not_null' 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'
  • 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 location will be used as the source location for stock moves generated by an inventory adjustment.' args: 'stock.location', 'Inventory Adjustment'
  • 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 location will be used\xa0as the source location for stock moves generated by a manufacturing order.' args: 'stock.location', 'Production'
  • 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
    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'
  • 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'
  • store_by Selection
    compute='_compute_store_by' help='Ensure the traceability of a storable product in your warehouse.' inverse='_set_store_by' required=True search='_search_store_by' string='Tracking' args: [('untracked', 'None'), ('quantity', 'By Quantity'), ('lot', 'By Lots'), ('serial', 'By Unique Serial Number')]
  • tracking Selection
    compute='_compute_tracking' help="Technical field holding the tracking method. False on a storable product means it's tracked by quantity only." inverse='_set_tracking' precompute=True readonly=False store=True string='Tracking Method' args: [('lot', 'By Lots'), ('serial', 'By Unique Serial Number')]
  • 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_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)
  • create(self, vals_list)
    @api.model_create_multi
  • 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
    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 (0)

No public methods.

New fields (11)
  • 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')]
  • default_stock_location_id Many2one → stock.location
    check_company=True compute='_compute_default_stock_location_id' args: 'stock.location', 'Default Stock Location'
  • horizon_days Integer
    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'
  • picking_policy Selection
    default='direct' required=True args: [('direct', 'As soon as possible, with back orders'), ('one', 'When all products are ready')]
  • scrap_location_id Many2one → stock.location
    check_company=True compute='_compute_scrap_location_id' args: 'stock.location', 'Scrap 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 (28)
  • 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_picking_batch Boolean
    implied_group='stock.group_stock_picking_batch' args: 'Batch, Wave & Cluster 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_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 Integer
    readonly=False related='company_id.horizon_days'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • 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: 'Transport Management'
  • module_stock_sms Boolean
    args: 'SMS Confirmation'
  • picking_policy Selection
    readonly=False related='company_id.picking_policy' required=True
  • 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 (5)
  • action_view_delivery_methods(self)
  • onchange_adv_location(self)
    @api.onchange('group_stock_adv_location')
  • onchange_module_product_barcodelookup(self)
    @api.onchange('module_product_barcodelookup')
  • onchange_module_stock_barcode_barcodelookup(self)
    @api.onchange('module_stock_barcode_barcodelookup')
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (2)
  • action_view_stock_serial(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • line_ids Many2many → stock.move.line
    args: 'stock.move.line'
  • mode Selection
    default='existing' args: [('existing', 'an existing batch transfer'), ('new', 'a new batch transfer')]
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
  • user_id Many2one → res.users
    string='Responsible' args: 'res.users'
  • wave_id Many2one → stock.picking.batch
    domain="[('state', 'in', ('draft', 'in_progress'))]" string='Batch Transfer' args: 'stock.picking.batch'
Public methods (2)
  • attach_pickings(self)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (4)
  • action_assign(self, src_move_ids, out_move_ids, quantity)
    @api.model
    Assign the given quantity from source moves to out moves. Can split source moves if partially assigned, and can split out moves if partially reserved. :param list[int] src_move_ids: :param list[int] out_move_ids: :param int quantity: The quantity to assign (should match the source moves free quantity.) :return: A dictionary with two keys: `in_moves` (ids list) and `out_moves` (object list). :rtype: dict
  • action_assign_all(self, allocation_list)
    @api.model
  • action_unassign(self, src_move_ids, out_move_ids, quantity)
    @api.model
    Unassign the given quantity from out moves and free the allocated quantity to source moves. Try to merge both source and out moves in case some of them were split during a previous allocation. :param list[int] src_move_ids: :param list[int] out_move_ids: :param int quantity: The quantity to free. :return: A dictionary with three keys: `freed_quantity`, `in_moves` (ids list) and `out_moves` (object list). :rtype: dict
  • get_report_data(self, data)
    @api.model

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

No new fields.

Public methods (0)

No public methods.

New fields (15)
  • 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'
  • is_scrap Boolean
    compute='_compute_is_scrap' args: 'Is Scrapped'
  • 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
    domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" args: 'res.partner'
  • product_id Many2one → product.product
    check_company=True domain="[('tracking', '!=', False), ('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'
  • 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'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit'
Public methods (9)
  • action_lot_open_quants(self)
  • action_lot_open_transfers(self)
  • action_open_scrap_moves(self)
  • action_scrap(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, product_sequence=False)
    @api.model
    Generate `lot_names` from a string.
  • write(self, vals)

New fields (76)
  • 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'
  • forecasted_location_id Many2one → stock.location
    bypass_search_access=True check_company=True help='Location used in the computation of the forecast.' index=True readonly=False store=True args: 'stock.location', 'Forecasted Location'
  • 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_scrap Boolean
    readonly=True
  • 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_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' domain="[('product_id', '=', product_id)]" 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_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' index='btree_not_null' 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 ondelete='cascade' 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: 'Demand in Product UoM'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • 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 write_sequence=25 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
    compute='_compute_reference' copy=False readonly=False 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_reason_tag_ids Many2many → stock.scrap.reason.tag
    string='Scrap Reason' args: 'stock.scrap.reason.tag'
  • sequence Integer
    default=10 args: 'Sequence'
  • should_replenish_scrapped Boolean
    args: 'Should Replenish'
  • 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_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')]
  • uom_id Many2one → uom.uom
    compute='_compute_uom_id' domain="[('id', 'in', allowed_uom_ids)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • 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 (14)
  • 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_label_layout(self)
  • action_open_reference(self)
    Open the form view of the move's reference document, if one exists, otherwise open form view of self
  • action_print_reception_report(self)
  • action_product_forecast_report(self)
  • action_scrap(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.
  • check_available_qty(self)
  • 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'
  • batch_id Many2one
    related='picking_id.batch_id'
  • 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
    related='move_id.date' store=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'
  • is_scrap Boolean
    readonly=True related='move_id.is_scrap'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_dest_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_id Many2one
    related='product_id.categ_id' string='Product Category'
  • product_id Many2one → product.product
    check_company=True domain="[('type', '!=', 'service')]" index=True ondelete='cascade' args: 'product.product', 'Product'
  • 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' index='btree_not_null' ondelete='restrict' required=False args: 'stock.package', 'Destination Package'
  • state Selection
    related='move_id.state' store=True
  • tracking Selection
    readonly=True related='product_id.tracking'
  • uom_id Many2one → uom.uom
    compute='_compute_uom_id' domain="[('id', 'in', allowed_uom_ids)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
Public methods (9)
  • action_open_add_to_wave(self)
  • action_open_reference(self)
  • action_put_in_pack(self, *, package_id=False, package_type_id=False, package_name=False, package_capacity=None)
  • action_revert(self)
  • action_send_recall_email(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 (3)
  • based_on Selection
    default='one_month' help='Estimate the daily average future demand volume based on past period or choose Custom Demand to enter manually average daily demand.' 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'), ('custom', 'Custom Demand')] string='Based on'
  • orderpoint_ids Many2many → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • percent_factor Integer
    default=100 required=True
Public methods (1)
  • action_apply(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.context_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 string='Products' args: 'stock.move.line'
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
    index=True 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 (0)

No new fields.

Public methods (0)

No public methods.

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 (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (60)
  • 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'
  • batch_id Many2one → stock.picking.batch
    check_company=True copy=False help='Batch associated to this transfer' index=True string='Batch Transfer' args: 'stock.picking.batch'
  • batch_sequence Integer
    string='Sequence'
  • 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.' tracking=True 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_dest_id' domain="[('usage','!=','view')]" 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 domain=[('is_scrap', '=', False)] 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, with back orders'), ('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
    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' tracking=True 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 "Reserve" should be displayed.'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • show_next_pickings Boolean
    compute='_compute_show_next_pickings'
  • show_return Boolean
    default=True args: 'Show return 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
    copy=False default=<expr> domain=<expr> tracking=True args: 'res.users', 'Responsible'
  • validate_button_style Selection
    compute='_compute_validate_button_style' args: [('primary', 'Primary'), ('secondary', 'Secondary'), ('invisible', 'Invisible')]
  • 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 (39)
  • action_add_entire_packs(self, package_ids)
  • action_add_operations(self)
  • 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_return(self)
  • action_confirm(self)
  • action_detailed_operations(self)
  • action_exchange(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_return(self)
  • action_return_all(self)
    Set all the quantities in the return picking as the original picking's done quantities
  • action_scrap(self)
  • 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_allocation_report(self)
  • action_view_batch(self)
  • assign_batch_user(self, user_id)
  • 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 (21)
  • allowed_picking_ids One2many → stock.picking
    compute='_compute_allowed_picking_ids' args: 'stock.picking'
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True string='Company' args: 'res.company'
  • description Char
    args: 'Description'
  • estimated_shipping_volume Float
    compute='_compute_estimated_shipping_capacity' digits='Product Unit' args: 'shipping_volume'
  • estimated_shipping_weight Float
    compute='_compute_estimated_shipping_capacity' digits='Product Unit' args: 'shipping_weight'
  • is_wave Boolean
    args: 'This batch is a wave'
  • move_ids One2many → stock.move
    compute='_compute_move_ids' string='Stock moves' args: 'stock.move'
  • move_line_ids One2many → stock.move.line
    compute='_compute_move_line_ids' inverse='_set_move_line_ids' search='_search_move_line_ids' string='Stock move lines' args: 'stock.move.line'
  • name Char
    copy=False default=<expr> readonly=True required=True string='Batch Transfer'
  • picking_ids One2many → stock.picking
    check_company=True domain="[('id', 'in', allowed_picking_ids)]" help='List of transfers associated to this batch' string='Transfers' args: 'stock.picking', 'batch_id'
  • picking_type_code Selection
    related='picking_type_id.code'
  • picking_type_id Many2one → stock.picking.type
    check_company=True copy=False index=True args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' string='Priority' args: PROCUREMENT_PRIORITIES
  • properties Properties
    copy=True definition='picking_type_id.batch_properties_definition' args: 'Properties'
  • scheduled_date Datetime
    compute='_compute_scheduled_date' copy=False help='Scheduled date for the transfers to be processed.\n - If manually set then scheduled date for all transfers in batch will automatically update to this date.\n - If not manually changed and transfers are added/removed/updated then this will be their earliest scheduled date\n but this scheduled date will not be set for all transfers in batch.' readonly=False store=True args: 'Scheduled Date'
  • show_allocation Boolean
    compute='_compute_show_allocation' string='Show Allocation Button'
  • show_check_availability Boolean
    compute='_compute_show_check_availability' string='Show Reserve Button'
  • show_lots_text Boolean
    compute='_compute_show_lots_text'
  • state Selection
    compute='_compute_state' copy=False default='draft' index=True readonly=True required=True store=True tracking=True args: [('draft', 'Draft'), ('in_progress', 'In progress'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • user_id Many2one → res.users
    check_company=True string='Responsible' tracking=True args: 'res.users'
  • warehouse_id Many2one → stock.warehouse
    related='picking_type_id.warehouse_id' args: 'stock.warehouse'
Public methods (15)
  • action_assign(self)
  • action_batch_detailed_operations(self)
  • action_cancel(self)
  • action_confirm(self)
    Sanity checks, confirm the pickings and mark the batch as confirmed.
  • action_done(self)
  • action_merge(self)
  • action_open_label_layout(self)
  • action_print(self)
  • action_put_in_pack(self, *, package_id=False, package_type_id=False, package_name=False)
    Action to put move lines with 'Done' quantities into a new pack This method follows same logic to stock.picking.
  • action_see_packages(self)
  • action_view_allocation_report(self)
  • create(self, vals_list)
    @api.model_create_multi
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • onchange_scheduled_date(self)
    @api.onchange('scheduled_date')
  • write(self, vals)

New fields (5)
  • batch_id Many2one → stock.picking.batch
    domain="[('state', 'in', ('draft', 'in_progress'))]" string='Batch Transfer' args: 'stock.picking.batch'
  • description Char
    args: 'Description'
  • is_create_draft Boolean
    help='When checked, create the batch in draft status' string='Draft'
  • mode Selection
    default='new' args: [('existing', 'an existing batch transfer'), ('new', 'a new batch transfer')]
  • user_id Many2one → res.users
    string='Responsible' args: 'res.users'
Public methods (1)
  • attach_pickings(self)

New fields (68)
  • active Boolean
    default=True args: 'Active'
  • allocated_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal')]" help='Allow to define the location where allocated products should be sent.' args: 'stock.location', 'Location for allocation'
  • auto_batch Boolean
    help='Automatically put pickings into batches as they are confirmed when possible.' args: 'Automatic Batches'
  • 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_allocation_report Boolean
    help='If this checkbox is ticked, Odoo will automatically show the allocation report (if there are moves to allocate to) when validating.' args: 'Show Allocation'
  • barcode Char
    copy=False args: 'Barcode'
  • batch_auto_confirm Boolean
    default=True args: 'Auto-confirm'
  • batch_creation_type Selection
    compute='_compute_batch_creation_type' help=<expr> inverse='_inverse_batch_creation_type' string='Batch Creation' args: [('manual', 'Manual Only'), ('auto', 'Automatic')]
  • batch_group_by_dest_loc Boolean
    help='Automatically group batches by their destination location.' args: 'Group by Destination Location'
  • batch_group_by_destination Boolean
    help='Automatically group batches by destination country.' args: 'Destination Country'
  • batch_group_by_partner Boolean
    help='Automatically group batches by contacts.' args: 'Contact'
  • batch_group_by_src_loc Boolean
    help='Automatically group batches by their source location.' args: 'Group by Source Location'
  • batch_max_lines Integer
    help="A transfer will not be automatically added to batches that will exceed this number of lines if the transfer is added to it.\nLeave this value as '0' if no line limit." args: 'Maximum lines'
  • batch_max_pickings Integer
    help="A transfer will not be automatically added to batches that will exceed this number of transfers.\nLeave this value as '0' if no transfer limit." args: 'Maximum transfers'
  • batch_properties_definition PropertiesDefinition
    args: 'Batch Properties'
  • 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_batch 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_sql='_compute_sql_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' selection='_get_lot_label_format_selection' string='Lot Label Format to auto-print'
  • move_type Selection
    default=<expr> help='It specifies goods to be transferred partially or all at once' required=True args: [('direct', 'As soon as possible, with back orders'), ('one', 'When all products are ready')], 'Shipping Policy'
  • name Char
    copy=mark_as_copy('name') required=True translate=True args: 'Operation Type'
  • open_button_style Selection
    compute='_compute_open_button_style' selection=[('primary', 'Primary'), ('secondary', 'Secondary')]
  • 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='barcode_2x7_price' selection='_get_product_label_format_selection' string='Product Label Format to auto-print'
  • 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
    readonly=False related='sequence_id.prefix' 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_picking_type Boolean
    compute='_compute_show_picking_type'
  • show_return_picking_type Boolean
    compute='_compute_show_return_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'
  • wave_category_ids Many2many → product.category
    help='Categories to consider when grouping waves.' string='Wave Product Categories' args: 'product.category'
  • wave_date_granularity Selection
    default='day' help='Precision to consider when grouping waves.' string='Date Precision' args: [('day', 'Day'), ('week', 'Week')]
  • wave_group_by_category Boolean
    help='Split transfers by product category, then group transfers that have the same product category.' args: 'Product Category'
  • wave_group_by_date Boolean
    help='Split transfers by their date.' args: 'Group by Date'
  • wave_group_by_location Boolean
    help='Split transfers by defined locations, then group transfers with the same location.' args: 'Location'
  • wave_group_by_product Boolean
    help='Split transfers by product then group transfers that have the same product.' args: 'Product'
  • wave_location_ids Many2many → stock.location
    domain="[('usage', '=', 'internal')]" help='Locations to consider when grouping waves.' string='Wave Locations' args: 'stock.location'
Public methods (12)
  • action_batch(self)
  • action_detailed_moves(self)
  • 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_stock_picking_action_picking_type(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • 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_capacity Float
    compute='_compute_package_capacity' readonly=False store=True args: 'Package Size'
  • package_ids Many2many → stock.package
    string='Packages' args: 'stock.package'
  • package_type_id Many2one → stock.package.type
    compute='_compute_package_type_id' readonly=False store=True args: 'stock.package.type', 'Package Type'
  • package_uom Char
    compute='_compute_package_uom' args: 'Unit'
  • result_package_id Many2one → stock.package
    compute='_compute_result_package_id' readonly=False store=True args: 'stock.package', 'Package'
  • show_package_capacity Boolean
    compute='_compute_show_package_capacity'
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
    index='btree_not_null' 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_user' 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' compute_sql='_compute_sql_last_count_date' compute_sudo=False 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'
  • 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'
  • uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit'
  • 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 (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 (16)
  • based_on Selection
    default='one_month' help='Estimate the daily average future demand volume based on past period or choose Custom Demand to enter manually average daily demand.' inverse='_inverse_based_on' 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'), ('custom', 'Custom Demand')] string='Based on'
  • daily_demand Float
    readonly=False related='orderpoint_id.daily_demand' related_sudo=False required=True args: 'Demand is'
  • danger_level Char
    compute='_compute_danger_level'
  • json_lead_days Char
    compute='_compute_json_lead_days'
  • json_replenishment_graph Char
    compute='_compute_json_replenishment_graph'
  • min_coverage Integer
    compute='_compute_min_coverage' help='Days of demand covered by Minimum level:\nShould be ≥ Replenishment Time - Sales Availability Time to avoid stock-outs during replenishment time.\nInclude extra days of safety to buffer unusual situations.\n\nGreen if > Replenishment Time - Sales Availability Time\nOrange if = Replenishment Time - Sales Availability Time\nRed if < Replenishment Time - Sales Availability Time' readonly=False
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint'
  • percent_factor Integer
    default=100 inverse='_inverse_percent_factor' 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'
  • replenish_frequency Integer
    compute='_compute_replenish_frequency' help='Replenishment Frequency: choose how many days there are between replenishment requests to optimize the balance between your storage costs and order costs and calculate your Maximum level.' readonly=False
  • 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 (1)
  • get_daily_demand(self, period=None, ratio=None)

New fields (10)
  • free_qty Float
    compute='_compute_free_qty' compute_sudo=True
  • lead_time Char
    compute='_compute_lead_time' compute_sudo=True
  • 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 (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
    index='btree_not_null' 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)
  • 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 (3)
  • 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 (3)
  • color Integer
    default=3947580 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 (0)

No public methods.

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'
  • quantity Float
    required=True args: 'Quantity'
  • storage_category_id Many2one → stock.storage.category
    index=True ondelete='cascade' required=True args: 'stock.storage.category'
  • uom_id Many2one
    related='product_id.uom_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (5)
  • get_expanded_lines(self, given_context=None)
    @api.model
  • get_lines(self, line_type=None, **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
    copy=<expr> help='Short name used to identify your warehouse' required=True 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_open_internal_locations(self)
  • 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 (37)
  • 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'
  • daily_demand Float
    default=0.0 digits='Product Unit' readonly=False required=True store=True args: 'Daily Demand'
  • 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'
  • min_max_based_on Selection
    default='one_month' help='Estimate the daily average future demand volume based on past period or choose Custom Demand to enter manually average daily demand.' 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'), ('custom', 'Custom Demand')] string='Based on'
  • min_max_based_on_factor Integer
    default=100 required=True
  • 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="Forecasted stock level when replenishing.\nAutomatically calculated as = Min + Max (Order frequency x Daily Demand x Growth factor, MoQ) with MoQ = Minimum quantity from vendor pricelist / BOM.\nWon't be reached by on Hand stock if unforecasted demand is delivered while waiting for arrival." readonly=False required=True store=True args: 'Max Quantity'
  • product_min_qty Float
    default=0.0 digits='Product Unit' help='Minimum Forecasted stock level that will trigger a replenishment.\nA safety stock is included in the min to cover unusual situations if days of demand covered by the Minimum Level is > Replenishment Lead Times - Availability Time.' required=True args: 'Min Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template'
  • product_uom_name Char
    readonly=True related='uom_id.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'
  • qty_to_order_to_max Float
    compute='_compute_qty_to_order_to_max' digits='Product Unit' args: 'To Order to Reach Max'
  • 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'
  • uom_id Many2one → uom.uom
    related='product_id.uom_id' args: 'uom.uom', 'Unit'
  • 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)
  • 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_move_id Many2one → stock.move
    args: 'stock.move', 'Scrap'
Public methods (2)
  • action_cancel(self)
  • action_done(self)

New fields (1)
  • picking_ids Many2many → stock.picking
    args: 'stock.picking'
Public methods (2)
  • process(self)
  • process_without_zero_moves(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)

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…