Manufacturing

mrp
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYSupply Chain/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Aaron Bohy, Jorge Pinna Puissant, Arnold Moyaux, Julien Castiaux, Victor Feyens, William Henrotin, Julien Mougenot, svs-odoo, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, odoo, David (dafr), JF Aubert, Aurelien van Delft (avd), Mathieu Walravens, luvi, Valentin Chevalier, Renaud Thiry, niyasraphy, alsh-odoo, Louis Wicket (wil), nda, Victor Piryns (pivi), clesgow, Djamel Touati, Pieter Claeys (clpi), Levi Siuzdak (sile), Dylan Kiss (dyki), Mayurrajsinh Rathod, Chong Wang (cwg), Martin Maes, Paweł Fertyk, omra-odoo, kdeb@odoo.com, Ethan Vincent, lase@odoo.com, Quentin Wolfs, Aurelien MARIE (auma), reka-odoo, Richard Prosser, AMZIL Ayoub, Nathaniel (naja), kcv-odoo, mega, Louis Gobert, nihp-odoo, Junqi Wu, aamo-odoo, Hussein Ebrahim(hyhe), Sanchit Gupta, Stéphane Diez, Mohammad Abdulmoneim, dhha-odoo, Mathias Mathy (MAMA), kawkb, gteboul, Pierre Pulinckx (PIPU), Julien Schwanen, EmilioPascual, Arthur Nanson, David Van Droogenbroeck (DROD), pkgu-odoo, Mohammad Abdulmoneim (abdu), djameltouati, Pierre Lamotte (pila), Pierre Pulinckx, Bastien PIERRE, Corentin Lombard, Carmine, Shrey Mehta, chha-odoo, MaximeNoirhomme, bona-odoo, plha-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), Armin-FalDiS, joseph, Duy (Đỗ Anh), krip-odoo, Hadi El Yakhni, sagu-odoo, Ester Andreetto, Tyler Landivar (tylan), defl, bhna-odoo, MAGREMENT, rare-odoo, sawer, kinhosz, agbr-odoo, mohannedah, Elijah Tay (elct), Lulu Grimalkin (lugr), temo-odoo, Lancelot Semal, Tudor-Calin Panzaru (tupan), adip-odoo, Quentin Colla (qucol), ABE-Mark45, Laszlo Almasy (azl), josv-odoo, Ayush Modi, Amr Elkhatieb, assh-odoo, daiduongnguyen-odoo, Waleed Elgamal, Oskar Kosobucki, srap-odoo, saurabh, tpma-odoo, sako-odoo, Youssef (abyo), Zachary (zavan), msho-odoo, Moamen(msho), chpa-odoo, Mathias Mathy, Youssef, lase
WEBSITE
WEBSITEhttps://www.odoo.com/app/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 14:10:21
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (106)
XML IDNameModelTypeStatus
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mo_overview_byproducts mo_overview_byproducts ir.ui.view qweb New
mo_overview_components mo_overview_components ir.ui.view qweb New
mo_overview_content mo_overview_content ir.ui.view qweb New
mo_overview_line mo_overview_line ir.ui.view qweb New
mo_overview_operations mo_overview_operations ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_replenishment_tree_view mrp.bom.replenishment.list.view mrp.bom field Inherits mrp.mrp_bom_tree_view
mrp_bom_tree_view mrp.bom.list mrp.bom list New
mrp_product_product_search_view mrp.product.product.search product.product filter Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template filter Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.list mrp.production list New
mrp_production_view_activity mrp.production.view.activity mrp.production activity New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_editable_view mrp.production.work.order.list.editable mrp.workorder list New
mrp_production_workorder_tree_editable_view_mo_form mrp.production.work.order.list.editable mrp.workorder xpath Inherits mrp_production_workorder_tree_editable_view
mrp_production_workorder_tree_view mrp.production.work.order.list mrp.workorder xpath Inherits mrp.mrp_production_workorder_tree_editable_view
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_workcenter_bom_tree_view mrp.routing.workcenter.bom.list mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_copy_to_bom_tree_view mrp.routing.workcenter.copy_to_bom.list mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_filter mrp.routing.workcenter.filter mrp.routing.workcenter search New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_kanban_view mrp.routing.workcenter.kanban mrp.routing.workcenter kanban New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.list mrp.routing.workcenter list New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_form_view_simplified mrp.unbuild.form.simplified mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.list mrp.unbuild list New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.list mrp.workcenter list New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.list mrp.workcenter.productivity.loss list New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.list mrp.workcenter.productivity list New
product_document_form product.document.form.mrp product.document sheet Inherits product.product_document_form
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template button Inherits stock.product_template_form_view_procurement_button
product_view_search_catalog product.view.search.catalog.inherit.mrp product.product filter Inherits product.product_view_search_catalog
production_message production_message ir.ui.view qweb New
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mo_overview report_mo_overview ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_production_components report_mrp_production_components ir.ui.view qweb New
report_mrp_workorder report_mrp_workorder ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type xpath Inherits stock.stock_picking_type_kanban
stock_report_delivery_document_inherit_mrp stock_report_delivery_document_inherit_mrp ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_kit_sections stock_report_delivery_kit_sections ir.ui.view qweb New
stock_report_delivery_no_kit_section stock_report_delivery_no_kit_section ir.ui.view qweb New
stock_scrap_search_view_inherit_mrp stock.scrap.search.inherit.mrp stock.scrap xpath Inherits stock.stock_scrap_search_view
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_move_line_tree stock.move.line.list stock.move.line field Inherits stock.view_move_line_tree
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_consumption_warning_form Consumption Warning mrp.consumption.warning form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_backorder_form Create Backorder mrp.production.backorder form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_serials_form mrp_production_serials mrp.production.serials form New
view_mrp_production_split_form Split Production mrp.production.split form New
view_mrp_production_split_multi_form mrp.production.split.multi.form mrp.production.split.multi form New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_stock_move_operations stock.move.mrp.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_form_inherit_mrp view.picking.form.inherit.mrp stock.picking xpath Inherits stock.view_picking_form
view_picking_type_form_inherit_mrp Operation Types stock.picking.type xpath Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_line_operation_tree_finished stock.move.line.operation.list.finished stock.move.line xpath Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_finished stock.move.operations.finished.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_move_operations_raw stock.move.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_replenishment_info_stock_mrp_inherit stock.replenishment.information.mrp.stock.inherit stock.replenishment.info xpath Inherits stock.view_stock_replenishment_info
view_stock_rule_form stock.rule.form.inherit.mrp stock.rule field Inherits stock.view_stock_rule_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_warehouse_orderpoint_tree_editable_inherited_purchase stock.warehouse.orderpoint.list.editable.inherit.purchase stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree_editable
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (53)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (24)
  • active Boolean
    default=True args: 'Active'
  • allow_operation_dependencies Boolean
    help='Create operation level dependencies that will influence both planning and the status of work orders upon MO confirmation. If this feature is ticked, and nothing is specified, Odoo will assume that all operations can be started simultaneously.' args: 'Operation Dependencies'
  • batch_size Float
    default=1.0 digits='Product Unit' help='All automatically generated manufacturing orders for this product will be of this size.' args: 'Batch Size'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='warning' help='Defines if you can consume more or less components than the quantity defined on the BoM:\n * Allowed: allowed for all manufacturing users.\n * Allowed with warning: allowed for all manufacturing users with summary of consumption differences when closing the manufacturing order.\n Note that in the case of component Highlight Consumption, where consumption is registered manually exclusively, consumption warnings will still be issued when appropriate also.\n * Blocked: only a manager can close a manufacturing order when the BoM consumption is not respected.' required=True string='Flexible Consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • days_to_prepare_mo Integer
    default=0 help='Create and confirm Manufacturing Orders this many days in advance, to have enough time to replenish components or manufacture semi-finished products.' string='Days to prepare Manufacturing Order'
  • enable_batch_size Boolean
    default=False
  • operation_count Integer
    compute='_compute_operation_count' args: 'Operations Count'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'bom_id', 'Operations'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation')]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type.If not,the operation type is not taken into account in the BoM search. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • possible_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • produce_delay Integer
    default=0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added. In case the product is subcontracted, this can be used to determine the date at which components should be sent to the subcontractor.' args: 'Manufacturing Lead Time'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', '=', 'consu')]" help='If a product variant is defined the BOM is available only for this product.' index=True args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Product Unit' help='This should be the smallest quantity that this product can be produced in. If the BOM contains operations, make sure the work center capacity is accurate.' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', '=', 'consu')]" index=True required=True args: 'product.template', 'Product'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit'
  • ready_to_produce Selection
    default='all_available' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • sequence Integer
    args: 'Sequence'
  • show_copy_operations_button Boolean
    compute='_compute_show_copy_operations_button' help="Technical field used to control the visibility of the 'Copy Existing Operations' button."
  • show_set_bom_button Boolean
    compute='_compute_show_set_bom_button'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (15)
  • action_archive(self)
  • action_compute_bom_days(self)
  • action_copy_existing_operations(self)
  • action_open_operation_form(self)
  • action_set_bom_on_orderpoint(self)
  • action_unarchive(self)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • explode(self, product, quantity, picking_type=False, never_attribute_values=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty', 'product_id', 'product_tmpl_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • write(self, vals)

New fields (11)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' args: 'mrp.bom', 'BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product line (divided between the quantity produced).The total of all by-products' cost share must be less than or equal to 100." args: 'Cost Share (%)'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit' required=True args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • sequence Integer
    args: 'Sequence'
Public methods (1)
  • action_add_from_catalog(self)

New fields (16)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True index=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    index=True related='product_id.product_tmpl_id' store=True args: 'product.template', 'Product Template'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id required=True args: 'uom.uom', 'Unit'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
  • tracking Selection
    related='product_id.tracking'
Public methods (4)
  • action_add_from_catalog(self)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (4)
  • consumption Selection
    compute='_compute_consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • mrp_consumption_warning_line_ids One2many → mrp.consumption.warning.line
    args: 'mrp.consumption.warning.line', 'mrp_consumption_warning_id'
  • mrp_production_count Integer
    compute='_compute_mrp_production_count'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (3)
  • action_cancel(self)
  • action_confirm(self)
  • action_set_qty(self)

New fields (7)
  • consumption Selection
    related='mrp_production_id.consumption'
  • mrp_consumption_warning_id Many2one → mrp.consumption.warning
    ondelete='cascade' readonly=True required=True args: 'mrp.consumption.warning', 'Parent Wizard'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • product_consumed_qty_uom Float
    readonly=True args: 'Consumed'
  • product_expected_qty_uom Float
    readonly=True args: 'To Consume'
  • product_id Many2one → product.product
    readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit'
Public methods (0)

No public methods.

New fields (80)
  • all_move_ids One2many → stock.move
    args: 'stock.move', 'production_id'
  • all_move_raw_ids One2many → stock.move
    args: 'stock.move', 'raw_material_production_id'
  • allow_workorder_dependencies Boolean
    args: 'Allow Work Order Dependencies'
  • allowed_uom_ids Many2many → uom.uom
    compute='_compute_allowed_uom_ids' args: 'uom.uom'
  • backorder_sequence Integer
    copy=False default=0 help='Backorder sequence, if equals to 0 means there is not related backorder' args: 'Backorder Sequence'
  • bom_id Many2one → mrp.bom
    check_company=True compute='_compute_bom_id' domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bills of Materials, also called recipes, are used to autocomplete components and work order instructions.' precompute=True readonly=False store=True args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • components_availability Char
    compute='_compute_components_availability' help="Latest component availability status for this MO. If green, then the MO's readiness status is ready, as per BOM configuration." string='Component Status'
  • components_availability_state Selection
    compute='_compute_components_availability' search='_search_components_availability_state' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late'), ('unavailable', 'Not Available')]
  • consumption Selection
    default='flexible' readonly=True required=True args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • date_deadline Datetime
    compute='_compute_date_deadline' copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' readonly=False store=True args: 'Deadline'
  • date_finished Datetime
    compute='_compute_date_finished' copy=False default=_get_default_date_finished help='Date you expect to finish production or actual date you finished production.' store=True args: 'End'
  • date_start Datetime
    copy=False default=_get_default_date_start help='Date you plan to start production or date you actually started production.' index=True required=True args: 'Start'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • duration Float
    compute='_compute_duration' help='Total real duration (in minutes)' args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' help='Total expected duration (in minutes)' args: 'Expected Duration'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • forecasted_issue Boolean
    compute='_compute_forecasted_issue'
  • is_delayed Boolean
    compute='_compute_is_delayed' search='_search_is_delayed'
  • is_locked Boolean
    copy=False default=_get_default_is_locked args: 'Is Locked'
  • is_outdated_bom Boolean
    help='The BoM has been updated since creation of the MO' args: 'Outdated BoM'
  • is_planned Boolean
    compute='_compute_is_planned' store=True args: 'Its Operations are Planned'
  • 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_locations' domain="[('usage','=','internal')]" help='Location where the system will stock the finished products.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Finished Products Location'
  • location_final_id Many2one → stock.location
    args: 'stock.location', 'Final Location from procurement'
  • location_src_id Many2one → stock.location
    check_company=True compute='_compute_locations' domain="[('usage','=','internal')]" help='Location where the system will look for components.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Components Location'
  • lot_producing_ids Many2many → stock.lot
    check_company=True copy=False domain="[('product_id', '=', product_id)]" string='Lot/Serial Number' args: 'stock.lot'
  • move_byproduct_ids One2many → stock.move
    compute='_compute_move_byproduct_ids' inverse='_set_move_byproduct_ids' args: 'stock.move'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    compute='_compute_move_finished_ids' copy=False domain=[('location_dest_usage', '!=', 'inventory')] readonly=False store=True args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    compute='_compute_move_raw_ids' copy=False domain=[('location_dest_usage', '!=', 'inventory')] readonly=False store=True args: 'stock.move', 'raw_material_production_id', 'Components'
  • mrp_production_backorder_count Integer
    compute='_compute_mrp_production_backorder' args: 'Count of linked backorder'
  • mrp_production_child_count Integer
    compute='_compute_mrp_production_child_count' args: 'Number of generated MO'
  • mrp_production_source_count Integer
    compute='_compute_mrp_production_source_count' args: 'Number of source MO'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • never_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[\n '&',\n ('attribute_line_id', 'in', valid_product_template_attribute_line_ids),\n ('attribute_id.create_variant', '=', 'no_variant')]" string='Never attribute values' args: 'product.template.attribute.value', 'template_attribute_value_mrp_production_rel', 'production_id', 'template_attribute_value_id'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    copy=False index='btree_not_null' args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' copy=True domain="[('code', '=', 'mrp_operation')]" index=True precompute=True readonly=False required=True store=True args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' help='Components will be reserved first for the MO with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • product_description_variants Char
    args: 'Custom Description'
  • product_id Many2one → product.product
    check_company=True compute='_compute_product_id' copy=True domain="[('type', '=', 'consu')]" precompute=True readonly=False required=True store=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=True digits='Product Unit' precompute=True readonly=False required=True store=True tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    compute='_compute_uom_id' copy=True domain="[('id', 'in', allowed_uom_ids)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • product_variant_attributes Many2many → product.template.attribute.value
    related='product_id.product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • production_capacity Float
    compute='_compute_production_capacity' help='Quantity that can be produced with the current stock of components'
  • production_group_id Many2one → mrp.production.group
    copy=False index=True args: 'mrp.production.group', 'Production Group'
  • production_location_id Many2one → stock.location
    compute='_compute_production_location' store=True args: 'stock.location', 'Production Location'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • qty_producing Float
    copy=False digits='Product Unit' string='Quantity Producing'
  • reference_ids Many2many → stock.reference
    copy=False args: 'stock.reference', 'stock_reference_production_rel', 'production_id', 'reference_id', 'References'
  • reservation_state Selection
    compute='_compute_reservation_state' copy=False help='Manufacturing readiness for this MO, as per bill of material configuration:\n * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n' index=True readonly=True store=True string='MO Readiness' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • reserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can reserve quantities' args: 'Allowed to Reserve Production'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • 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')]
  • serial_numbers_count Integer
    compute='_compute_serial_numbers_count' args: 'Count of serial numbers'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • show_generate_bom Boolean
    compute='_compute_show_generate_bom' args: 'Show Generate BOM'
  • show_lock Boolean
    compute='_compute_show_lock' args: 'Show Lock/unlock buttons'
  • show_lot_ids Boolean
    compute='_compute_show_lot_ids' args: 'Display the serial number shortcut on the moves'
  • show_produce Boolean
    compute='_compute_show_produce' help='Technical field to check if produce button can be shown'
  • show_produce_all Boolean
    compute='_compute_show_produce' help='Technical field to check if produce all button can be shown'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unbuild_count Integer
    compute='_compute_unbuild_count' string='Number of Unbuilds'
  • unbuild_ids One2many → mrp.unbuild
    args: 'mrp.unbuild', 'mo_id', 'Unbuilds'
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Production'
  • use_create_components_lots Boolean
    related='picking_type_id.use_create_components_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> args: 'res.users', 'Responsible'
  • valid_product_template_attribute_line_ids Many2many
    related='product_tmpl_id.valid_product_template_attribute_line_ids'
  • warehouse_id Many2one
    related='location_src_id.warehouse_id'
  • workcenter_id Many2one → mrp.workcenter
    store=False args: 'mrp.workcenter'
  • workorder_ids One2many → mrp.workorder
    compute='_compute_workorder_ids' copy=True readonly=False store=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (37)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_clear_lot_producing_ids(self)
  • action_confirm(self)
  • action_generate_bom(self)
    Generates a new Bill of Material based on the Manufacturing Order's product, components, workorders and by-products, and assigns it to the MO. Returns a new BoM's form view action.
  • action_generate_serial(self, workorder=False)
  • action_merge(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_plan_with_components_availability(self)
  • action_product_forecast_report(self)
  • action_see_move_scrap(self)
  • action_split(self)
  • action_start(self)
  • action_toggle_is_locked(self)
  • action_update_bom(self)
  • action_view_mo_delivery(self)
    Returns an action that display picking related to manufacturing order. It can either be a list view or in a form view (if there is only one picking to show).
  • action_view_mrp_production_backorders(self)
  • action_view_mrp_production_childs(self)
  • action_view_mrp_production_sources(self)
  • action_view_mrp_production_unbuilds(self)
  • action_view_reception_report(self)
  • action_view_serial_numbers(self)
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unbuild(self)
  • button_unplan(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • do_unreserve(self)
  • get_empty_list_help(self, help_message)
    @api.model
  • pre_button_mark_done(self)
  • set_qty_producing(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • mrp_production_backorder_line_ids One2many → mrp.production.backorder.line
    string='Backorder Confirmation Lines' args: 'mrp.production.backorder.line', 'mrp_production_backorder_id'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
  • show_backorder_lines Boolean
    compute='_compute_show_backorder_lines' args: 'Show backorder lines'
Public methods (2)
  • action_backorder(self)
  • action_close_mo(self)

New fields (3)
  • mrp_production_backorder_id Many2one → mrp.production.backorder
    ondelete='cascade' required=True args: 'mrp.production.backorder', 'MO Backorder'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (4)
  • child_ids Many2many → mrp.production.group
    string='Child Manufacturing Orders' args: 'mrp.production.group', 'mrp_production_group_rel', 'parent_group_id', 'child_group_id'
  • name Char
    index='btree' required=True args: 'Name'
  • parent_ids Many2many → mrp.production.group
    string='Parent Manufacturing Orders' args: 'mrp.production.group', 'mrp_production_group_rel', 'child_group_id', 'parent_group_id'
  • production_ids One2many → mrp.production
    string='Productions' args: 'mrp.production', 'production_group_id'
Public methods (0)

No public methods.

New fields (5)
  • lot_name Char
    compute='_compute_lot_name' readonly=False store=True args: 'First SN'
  • lot_quantity Integer
    compute='_compute_lot_quantity' readonly=False store=True args: 'Number of SN'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial_numbers Text
    compute='_compute_lot_name' readonly=False store=True args: 'Produced Serial Numbers'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Workorder'
Public methods (3)
  • action_apply(self)
  • action_generate_serial_numbers(self)
  • action_split_and_assign_serials(self)

New fields (10)
  • max_batch_size Float
    compute='_compute_max_batch_size' digits='Product Unit' readonly=False args: 'Max Batch Size'
  • num_splits Integer
    compute='_compute_num_splits' readonly=True args: '# Splits'
  • product_id Many2one
    related='production_id.product_id'
  • product_qty Float
    related='production_id.product_qty'
  • product_uom_id Many2one
    related='production_id.product_uom_id'
  • production_capacity Float
    related='production_id.production_capacity'
  • production_detailed_vals_ids One2many → mrp.production.split.line
    compute='_compute_details' readonly=False store=True args: 'mrp.production.split.line', 'mrp_production_split_id', 'Split Details'
  • production_id Many2one → mrp.production
    readonly=True args: 'mrp.production', 'Manufacturing Order'
  • production_split_multi_id Many2one → mrp.production.split.multi
    args: 'mrp.production.split.multi', 'Split Productions'
  • valid_details Boolean
    compute='_compute_valid_details' args: 'Valid'
Public methods (3)
  • action_prepare_split(self)
  • action_return_to_list(self)
  • action_split(self)

New fields (4)
  • date Datetime
    args: 'Schedule Date'
  • mrp_production_split_id Many2one → mrp.production.split
    ondelete='cascade' required=True args: 'mrp.production.split', 'Split Production'
  • quantity Float
    digits='Product Unit' required=True args: 'Quantity To Produce'
  • user_id Many2one → res.users
    domain=<expr> args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (1)
  • production_ids One2many → mrp.production.split
    args: 'mrp.production.split', 'production_split_multi_id', 'Productions To Split'
Public methods (0)

No public methods.

New fields (23)
  • active Boolean
    default=True
  • allow_operation_dependencies Boolean
    related='bom_id.allow_operation_dependencies'
  • blocked_by_operation_ids Many2many → mrp.routing.workcenter
    column1='operation_id' column2='blocked_by_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that need to be completed before this operation can start.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocked By' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    check_company=True index=True ondelete='cascade' required=True args: 'mrp.bom', 'Bill of Material'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one → res.company
    related='bom_id.company_id' args: 'res.company', 'Company'
  • cost Float
    compute='_compute_cost' args: 'Cost'
  • cost_mode Selection
    default='actual' help='Determines the way Odoo calculates the cost of the operation:\n- Based on Actual time: the cost will be calculated based on tracked time and real employee costs.\n- Based on Estimated time: the cost will be calculated based on estimated time and costs.' string='Cost based on' tracking=True args: [('actual', 'Actual time'), ('estimated', 'Theorical time')]
  • cycle_number Integer
    compute='_compute_time_cycle' args: 'Repetitions'
  • name Char
    required=True args: 'Operation'
  • needed_by_operation_ids Many2many → mrp.routing.workcenter
    column1='blocked_by_id' column2='operation_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that cannot start before this operation is completed.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocks' args: 'mrp.routing.workcenter'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • show_time_total Boolean
    compute='_compute_time_cycle' args: 'Show Total Duration?'
  • time_computed_on Char
    compute='_compute_time_computed_on' args: 'Computed on last'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Cycles'
  • time_cycle_manual Float
    default=60 help="Time in minutes:- In fixed mode, time used- In computed mode, supposed first time when there aren't any work orders yet" tracking=True args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' tracking=True args: [('manual', 'Fixed'), ('auto', 'Computed')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • time_total Float
    compute='_compute_time_cycle' args: 'Total Duration'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True index=True required=True tracking=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
Public methods (7)
  • action_archive(self)
  • action_open_operation_form(self)
  • action_unarchive(self)
  • copy_existing_operations(self)
  • copy_to_bom(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (16)
  • bom_id Many2one → mrp.bom
    check_company=True compute='_compute_bom_id' domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]" store=True args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage','=','internal')]" help='Location where you want to send the components resulting from the unbuild order.' 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' domain="[('usage','=','internal')]" help='Location where the product you want to unbuild is.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id),('id', 'in', lot_producing_ids)]" args: 'stock.lot', 'Lot/Serial Number'
  • lot_producing_ids Many2many → stock.lot
    related='mo_id.lot_producing_ids' string='Lot/Serial Numbers' args: 'stock.lot'
  • mo_bom_id Many2one → mrp.bom
    related='mo_id.bom_id' args: 'mrp.bom', 'Bill of Material used on the Production Order'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', '=', 'done'), ('product_id', '=?', product_id), ('bom_id', '=?', bom_id)]" index='btree_not_null' args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True compute='_compute_product_id' domain="[('type', '=', 'consu')]" precompute=True readonly=False required=True store=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' default=1.0 digits='Product Unit' precompute=True readonly=False required=True store=True args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (3)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (32)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity_ids One2many → mrp.workcenter.capacity
    copy=True help='Specific number of pieces that can be produced in parallel per product.' string='Product Capacities' args: 'mrp.workcenter.capacity', 'workcenter_id'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Hourly processing cost.' string='Cost per hour' tracking=True
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' required=True args: 'res.currency', 'Currency'
  • has_routing_lines Boolean
    compute='_compute_has_routing_lines' help='Technical field for workcenter views'
  • kanban_dashboard_graph Text
    compute='_compute_kanban_dashboard_graph'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Html
    args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • resource_calendar_id Many2one
    check_company=True
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • tag_ids Many2many → mrp.workcenter.tag
    args: 'mrp.workcenter.tag'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    args: 'Setup Time'
  • time_stop Float
    args: 'Cleanup Time'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_blocked_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# To Do Work Orders'
Public methods (7)
  • action_archive(self)
  • action_show_operations(self)
  • action_work_order(self)
  • action_work_order_alternatives(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (6)
  • capacity Float
    help='Number of pieces that can be produced in parallel for this product or for all, depending on the unit.' args: 'Capacity'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' precompute=True readonly=False required=True store=True string='Unit' args: 'uom.uom'
  • time_start Float
    default=_default_time_start help='Time in minutes for the setup.' args: 'Setup Time (minutes)'
  • time_stop Float
    default=_default_time_stop help='Time in minutes for the cleaning.' args: 'Cleanup Time (minutes)'
  • workcenter_id Many2one → mrp.workcenter
    index=True required=True string='Work Center' args: 'mrp.workcenter'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' string='Effectiveness'
  • production_id Many2one → mrp.production
    readonly=True related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True index=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True index=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True translate=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (0)

No public methods.

New fields (2)
  • color Integer
    default=_get_default_color args: 'Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (51)
  • allow_workorder_dependencies Boolean
    related='production_id.allow_workorder_dependencies'
  • barcode Char
    compute='_compute_barcode' store=True
  • blocked_by_workorder_ids Many2many → mrp.workorder
    column1='workorder_id' column2='blocked_by_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocked By' args: 'mrp.workorder'
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    related='production_id.consumption'
  • cost_mode Selection
    default='actual' args: [('actual', 'Actual'), ('estimated', 'Estimated')]
  • costs_hour Float
    aggregator='avg' default=0.0 string='Cost per hour'
  • date_finished Datetime
    compute='_compute_dates' copy=False inverse='_set_dates' store=True args: 'End'
  • date_start Datetime
    compute='_compute_dates' copy=False inverse='_set_dates' store=True args: 'Start'
  • duration Float
    compute='_compute_duration' copy=False inverse='_set_duration' readonly=False store=True args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' digits=(16, 2) readonly=False store=True args: 'Expected Duration'
  • duration_percent Integer
    aggregator='avg' compute='_compute_duration' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    aggregator='avg' compute='_compute_duration' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_ids Many2many → stock.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" readonly=False related='production_id.lot_producing_ids' string='Lot/Serial Numbers' args: 'stock.lot'
  • is_planned Boolean
    related='production_id.is_planned'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' args: 'Is the Current User Working'
  • json_popover Char
    compute='_compute_json_popover' args: 'Popover Data JSON'
  • last_working_user_id Many2one → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True copy=False help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True args: 'Work Order'
  • needed_by_workorder_ids Many2many → mrp.workorder
    column1='blocked_by_id' column2='workorder_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocks' args: 'mrp.workorder'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True index='btree_not_null' args: 'mrp.routing.workcenter', 'Operation'
  • product_id Many2one
    related='production_id.product_id'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one
    related='production_id.product_uom_id'
  • product_variant_attributes Many2many → product.template.attribute.value
    related='product_id.product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • production_availability Selection
    readonly=True related='production_id.reservation_state' store=True string='Stock Availability'
  • production_bom_id Many2one → mrp.bom
    related='production_id.bom_id' args: 'mrp.bom'
  • production_date Datetime
    compute='_compute_production_date' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    check_company=True index='btree' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    readonly=True related='production_id.state' string='Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    copy=False default=0.0 digits='Product Unit' help='The number of products already handled by this work order' args: 'Quantity Done'
  • qty_producing Float
    compute='_compute_qty_producing' digits='Product Unit' inverse='_set_qty_producing' string='Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_ready Float
    compute='_compute_qty_ready' digits='Product Unit' args: 'Quantity Ready'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit' args: 'Quantity To Be Produced'
  • qty_reported_from_previous_wo Float
    copy=False digits='Product Unit' help='The quantity already produced awaiting allocation in the backorders chain.' args: 'Carried Quantity'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • sequence Integer
    default=_default_sequence args: 'Sequence'
  • show_json_popover Boolean
    compute='_compute_json_popover' args: 'Show Popover?'
  • state Selection
    compute='_compute_state' copy=False default='ready' index=True store=True string='Status' args: [('blocked', 'Blocked'), ('ready', 'To Do'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    copy=False args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' index=True required=True args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    related='workcenter_id.working_state' string='Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
Public methods (18)
  • action_cancel(self)
  • action_mark_as_done(self)
  • action_open_wizard(self)
  • action_replan(self)
    Replan a work order. It actually replans every "ready" or "blocked" work orders of the linked manufacturing orders.
  • action_see_move_scrap(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self, raise_on_invalid_state=False)
  • button_unblock(self)
  • create(self, vals_list)
    @api.model_create_multi
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • get_duration(self)
  • get_working_duration(self)
    Get the additional duration for 'open times' i.e. productivity lines with no date_end.
  • set_state(self, state)
  • unlink(self)
  • write(self, vals)

New fields (1)
  • production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (1)
  • process(self)

New fields (1)
  • attached_on_mrp Selection
    default=<expr> help='Leave hidden if document only accessible on product form.\nSelect Bill of Materials to visualise this document as a product attachment when this product is in a bill of material.' required=True selection=[('hidden', 'Hidden'), ('bom', 'Bill of Materials')] string='MRP : Visible at'
Public methods (0)

No public methods.

New fields (8)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit' args: 'Manufactured'
  • product_catalog_product_is_in_bom Boolean
    compute='_compute_product_is_in_bom_and_mo' search='_search_product_is_in_bom'
  • product_catalog_product_is_in_mo Boolean
    compute='_compute_product_is_in_bom_and_mo' search='_search_product_is_in_mo'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (8)
  • action_archive(self)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise
  • get_total_routes(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit' args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (4)
  • action_archive(self)
  • action_used_in_bom(self)
  • action_view_mos(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (2)
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_warehouses(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, production_id)
    @api.model
    Endpoint for HTML display.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

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

New fields (10)
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_reception_report Boolean
    implied_group='mrp.group_mrp_reception_report' args: 'Allocation Report for Manufacturing Orders'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • group_mrp_workorder_dependencies Boolean
    implied_group='mrp.group_mrp_workorder_dependencies' args: 'Work Order Dependencies'
  • group_unlocked_by_default Boolean
    implied_group='mrp.group_unlocked_by_default' args: 'Unlock Manufacturing Orders'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
Public methods (1)
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='raw_material_production_id.bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True index='btree_not_null' args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • cost_share Float
    digits=0 help="The percentage of the final production cost for this by-product. The total of all by-products' cost share must be smaller or equal to 100." args: 'Cost Share (%)'
  • created_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Created Production Order'
  • manual_consumption Boolean
    compute='_compute_manual_consumption' help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' readonly=False store=True args: 'Manual Consumption'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_ids Many2many → stock.lot
    related='raw_material_production_id.lot_producing_ids' string='Finished Lot/Serial Number' args: 'stock.lot'
  • product_qty_available Float
    depends=['product_id'] related='product_id.qty_available' args: 'Product On Hand Quantity'
  • product_virtual_available Float
    depends=['product_id'] related='product_id.virtual_available' args: 'Product Forecasted Quantity'
  • production_group_id Many2one → mrp.production.group
    args: 'mrp.production.group', 'Used for Productions'
  • production_id Many2one → mrp.production
    check_company=True index='btree_not_null' ondelete='cascade' args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True index='btree_not_null' ondelete='cascade' args: 'mrp.production', 'Production Order for components'
  • should_consume_qty Float
    compute='_compute_should_consume_qty' digits='Product Unit' args: 'Quantity To Consume'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True index='btree_not_null' args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    compute='_compute_unit_factor' store=True args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True copy=False index='btree_not_null' args: 'mrp.workorder', 'Work Order To Consume'
Public methods (8)
  • action_add_from_catalog_byproduct(self)
  • action_add_from_catalog_raw(self)
  • action_explode(self)
    Explodes pickings
  • action_open_reference(self)
  • action_show_details(self)
  • create(self, vals_list)
    @api.model_create_multi
    Enforce consistent values (i.e. match _get_move_raw_values/_get_move_finished_values) for: - Manually added components/byproducts specifically values we can't set via view with "default_" - Moves from a copied MO - Backorders
  • default_get(self, fields)
    @api.model
  • write(self, vals)

New fields (2)
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True index='btree_not_null' args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (4)
  • has_kits Boolean
    compute='_compute_has_kits'
  • production_count Integer
    compute='_compute_mrp_production_ids' groups='mrp.group_mrp_user' args: 'Count of MO generated'
  • production_group_id Many2one → mrp.production.group
    related='move_ids.production_group_id' string='Production Group' args: 'mrp.production.group'
  • production_ids One2many → mrp.production
    compute='_compute_production_ids' groups='mrp.group_mrp_user' string='Manufacturing Orders' args: 'mrp.production'
Public methods (3)
  • action_detailed_operations(self)
  • action_view_mrp_production(self)
  • get_action_click_graph(self)
    @api.model

New fields (16)
  • auto_print_done_mrp_lot Boolean
    help='If this checkbox is ticked, Odoo will automatically print the lot/SN label of a MO when it is done.' args: 'Auto Print Produced Lot Label'
  • auto_print_done_mrp_product_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the product labels of a MO when it is done.' args: 'Auto Print Produced Product Labels'
  • auto_print_done_production_order Boolean
    help='If this checkbox is ticked, Odoo will automatically print the production order of a MO when it is done.' args: 'Auto Print Done Production Order'
  • auto_print_generated_mrp_lot Boolean
    help='Automatically print the lot/SN label when the "Create a new serial/lot number" button is used.' args: 'Auto Print Generated Lot/SN Label'
  • auto_print_mrp_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically print the allocation report of a MO when it is done and has assigned moves.' args: 'Auto Print Allocation Report'
  • auto_print_mrp_reception_report_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the allocation report labels of a MO when it is done.' args: 'Auto Print Allocation Report Labels'
  • code Selection
    ondelete={'mrp_operation': <expr>} selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_in_progress Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders In Progress'
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_to_close Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders To Close'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • done_mrp_lot_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Lot/SN Label to Print'
  • generated_mrp_lot_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Generated Lot/SN Label to Print'
  • mrp_product_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Product Label to Print'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • production_ids Many2many → mrp.production
    string='Productions' args: 'mrp.production', 'stock_reference_production_rel', 'reference_id', 'production_id'
Public methods (0)

No public methods.

New fields (2)
  • bom_id Many2one → mrp.bom
    string='Bill of Material' args: 'mrp.bom'
  • show_bom Boolean
    compute='_compute_show_bom'
Public methods (0)

No public methods.

New fields (3)
  • bom_id Many2one
    related='orderpoint_id.bom_id'
  • bom_ids Many2many → mrp.bom
    compute='_compute_bom_ids' store=True args: 'mrp.bom'
  • show_bom_tab Boolean
    compute='_compute_show_bom_tab'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • action Selection
    ondelete={'manufacture': 'cascade'} selection_add=[('manufacture', 'Manufacture')]
Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (5)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'phantom'), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_template)]" args: 'mrp.bom', 'Kit'
  • product_is_kit Boolean
    related='product_id.is_kits'
  • product_template Many2one
    related='product_id.product_tmpl_id'
  • production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True index='btree_not_null' args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • do_replenish(self, values=False)
  • do_scrap(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True copy=False domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='1 Step: Consume components from stock and produce.\n 2 Steps: Pick components from stock and then produce.\n 3 Steps: Pick components from stock, produce, and then move final product(s) from production area to stock.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture, then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    compute='_compute_manufacture_to_resupply' default=True help='When products are manufactured, they can be manufactured in this warehouse.' inverse='_inverse_manufacture_to_resupply' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (4)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]" inverse='_inverse_bom_id' string='Bill of Materials' args: 'mrp.bom'
  • bom_id_placeholder Char
    compute='_compute_bom_id_placeholder'
  • effective_bom_id Many2one → mrp.bom
    compute='_compute_effective_bom_id' help='Either the Bill of Materials set directly or the one computed to be used by this replenishment' search='_search_effective_bom_id' store=False string='Effective Bill of Materials' args: 'mrp.bom'
  • show_bom Boolean
    compute='_compute_show_bom' args: 'Show BoM column'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Alexis de Lattre, Christophe Simonis, Xavier Morel, Aaron Bohy, GitHub, Damien Bouvy, Yannick Tivisse, Odoo Online, Christophe Monniez, Jorge Pinna Puissant, Arnold Moyaux, Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, Sébastien Theys, Julien Mougenot, svs-odoo, Brice bib Bartoletti, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, snd, William Braeckman, odoo, roen-odoo, Miquel Raïch, David (dafr), JF Aubert, PNO, yhu-odoo, Didier (did), Yolann Sabaux, Aurelien van Delft (avd), Mathieu Walravens, Vincent Larcin, niyasraphy, alsh-odoo, Louis Wicket (wil), Walid, Adrien Widart (awt), nda, Victor Piryns (pivi), Mahamadasif Ansari, Pierre-Yves Dufays, clesgow, Michele, Djamel Touati, Pieter Claeys (clpi), Levi Siuzdak (sile), Dylan Kiss (dyki), Antoine (ande), Chong Wang (cwg), Martin Maes, Ahmed Khalaf, tanghulu0608, micheledic, Paweł Fertyk, Sarah Bellefroid, Mahdi Cheikh Rouhou (macr), ilru-odoo, omra-odoo, Andrzej(pian), Walid (wasa), kdeb@odoo.com, maad-odoo, Mattis Megevand, Youssef Bashandy, Ethan Vincent, lase@odoo.com, Quentin Wolfs, Aurelien MARIE (auma), bary, Maryam Kia, Louis (loti), reka-odoo, Richard Prosser, AMZIL Ayoub, Nathaniel (naja), vava-odoo, Bastien Fafchamps (bafa), Julien Carion (juca), kcv-odoo, mega, Louis Gobert, sami odoo, Louis (wil), Aungkokolin1997, ThiagoMForgeFlow, Junqi Wu, mano-odoo, aamo-odoo, Hussein Ebrahim(hyhe), kago-odoo, Elisabeth Dickinson, Sanchit Gupta, Stéphane Diez, Mohammad Abdulmoneim, dhha-odoo, Mathias Mathy (MAMA), gteboul, sabr, Pierre Pulinckx (PIPU), Julien Schwanen, Jitendra Prajapat, EmilioPascual, Arthur Nanson, David Van Droogenbroeck (DROD), pkgu-odoo, djameltouati, khsr-odoo, Pierre Lamotte (pila), macadelic, Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, Corentin Lombard, Carmine, Bastien (bvdn), chha-odoo, MaximeNoirhomme, bona-odoo, Juan Ignacio Carreras, plha-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), Armin-FalDiS, joseph, Duy (Đỗ Anh), krip-odoo, Hadi El Yakhni, Maeva De Keyser (MDEK), Tyler Landivar (tylan), defl, raju kumar thakur, MAGREMENT, rare-odoo, sawer, kinhosz, agbr-odoo, mohannedah, Elijah Tay (elct), temo-odoo, Lancelot Semal, Tudor-Calin Panzaru (tupan), adip-odoo, ABE-Mark45, Laszlo Almasy (azl), josv-odoo, Ayush Modi, Amr Elkhatieb, Cooper Spinelli, daiduongnguyen-odoo, Oskar Kosobucki, saurabh, sako-odoo, Youssef (abyo), msho-odoo, ShreyaPatel(shpa), Moamen(msho)
WEBSITE
WEBSITEhttps://www.odoo.com/app/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (103)
XML IDNameModelTypeStatus
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mo_overview_byproducts mo_overview_byproducts ir.ui.view qweb New
mo_overview_components mo_overview_components ir.ui.view qweb New
mo_overview_content mo_overview_content ir.ui.view qweb New
mo_overview_line mo_overview_line ir.ui.view qweb New
mo_overview_operations mo_overview_operations ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.list mrp.bom list New
mrp_product_product_search_view mrp.product.product.search product.product filter Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template filter Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.list mrp.production list New
mrp_production_view_activity mrp.production.view.activity mrp.production activity New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_editable_view mrp.production.work.order.list.editable mrp.workorder list New
mrp_production_workorder_tree_editable_view_mo_form mrp.production.work.order.list.editable mrp.workorder xpath Inherits mrp_production_workorder_tree_editable_view
mrp_production_workorder_tree_view mrp.production.work.order.list mrp.workorder xpath Inherits mrp.mrp_production_workorder_tree_editable_view
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_workcenter_bom_tree_view mrp.routing.workcenter.bom.list mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_copy_to_bom_tree_view mrp.routing.workcenter.copy_to_bom.list mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_filter mrp.routing.workcenter.filter mrp.routing.workcenter search New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.list mrp.routing.workcenter list New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_form_view_simplified mrp.unbuild.form.simplified mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.list mrp.unbuild list New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.list mrp.workcenter list New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.list mrp.workcenter.productivity.loss list New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.list mrp.workcenter.productivity list New
product_document_form product.document.form.mrp product.document sheet Inherits product.product_document_form
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template button Inherits stock.product_template_form_view_procurement_button
product_view_search_catalog product.view.search.catalog.inherit.mrp product.product filter Inherits product.product_view_search_catalog
production_message production_message ir.ui.view qweb New
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mo_overview report_mo_overview ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_production_components report_mrp_production_components ir.ui.view qweb New
report_mrp_workorder report_mrp_workorder ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type xpath Inherits stock.stock_picking_type_kanban
stock_report_delivery_document_inherit_mrp stock_report_delivery_document_inherit_mrp ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_kit_sections stock_report_delivery_kit_sections ir.ui.view qweb New
stock_report_delivery_no_kit_section stock_report_delivery_no_kit_section ir.ui.view qweb New
stock_scrap_search_view_inherit_mrp stock.scrap.search.inherit.mrp stock.scrap xpath Inherits stock.stock_scrap_search_view
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_mrp_batch_produce_form view_mrp_batch_produce_form mrp.batch.produce form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_consumption_warning_form Consumption Warning mrp.consumption.warning form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_backorder_form Create Backorder mrp.production.backorder form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_split_form Split Production mrp.production.split form New
view_mrp_production_split_multi_form mrp.production.split.multi.form mrp.production.split.multi form New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_stock_move_operations stock.move.mrp.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_form_inherit_mrp view.picking.form.inherit.mrp stock.picking xpath Inherits stock.view_picking_form
view_picking_type_form_inherit_mrp Operation Types stock.picking.type xpath Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_line_detailed_operation_tree_mrp stock.move.line.operations.list.mrp stock.move.line xpath Inherits stock.view_stock_move_line_detailed_operation_tree
view_stock_move_line_operation_tree_finished stock.move.line.operation.list.finished stock.move.line xpath Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_finished stock.move.operations.finished.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_move_operations_raw stock.move.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_rule_form stock.rule.form.inherit.mrp stock.rule field Inherits stock.view_stock_rule_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_warehouse_orderpoint_tree_editable_inherited_purchase stock.warehouse.orderpoint.list.editable.inherit.purchase stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree_editable
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (49)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (8)
  • component_separator Char
    default=',' required=True args: 'Component separator'
  • lot_name Char
    compute='_compute_lot_name' readonly=False store=True args: 'First Lot/SN'
  • lot_qty Integer
    compute='_compute_lot_qty' readonly=False store=True args: 'Number of SN'
  • lots_quantity_separator Char
    default=';' required=True args: 'Lot quantity separator'
  • lots_separator Char
    default='|' required=True args: 'Lot separator'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • production_text Text
    args: 'Batch Production'
  • production_text_help Text
    compute='_compute_production_text_help' args: 'Explanation for batch production'
Public methods (3)
  • action_done(self)
  • action_generate_production_text(self)
  • action_prepare(self)

New fields (20)
  • active Boolean
    default=True args: 'Active'
  • allow_operation_dependencies Boolean
    help='Create operation level dependencies that will influence both planning and the status of work orders upon MO confirmation. If this feature is ticked, and nothing is specified, Odoo will assume that all operations can be started simultaneously.' args: 'Operation Dependencies'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='warning' help='Defines if you can consume more or less components than the quantity defined on the BoM:\n * Allowed: allowed for all manufacturing users.\n * Allowed with warning: allowed for all manufacturing users with summary of consumption differences when closing the manufacturing order.\n Note that in the case of component Highlight Consumption, where consumption is registered manually exclusively, consumption warnings will still be issued when appropriate also.\n * Blocked: only a manager can close a manufacturing order when the BoM consumption is not respected.' required=True string='Flexible Consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • days_to_prepare_mo Integer
    default=0 help='Create and confirm Manufacturing Orders this many days in advance, to have enough time to replenish components or manufacture semi-finished products.\nNote that security lead times will also be considered when appropriate.' string='Days to prepare Manufacturing Order'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'bom_id', 'Operations'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation')]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • possible_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • produce_delay Integer
    default=0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added. In case the product is subcontracted, this can be used to determine the date at which components should be sent to the subcontractor.' args: 'Manufacturing Lead Time'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', '=', 'consu')]" help='If a product variant is defined the BOM is available only for this product.' index=True args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' help='This should be the smallest quantity that this product can be produced in. If the BOM contains operations, make sure the work center capacity is accurate.' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', '=', 'consu')]" index=True required=True args: 'product.template', 'Product'
  • product_uom_category_id Many2one
    related='product_tmpl_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit of Measure'
  • ready_to_produce Selection
    default='all_available' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • sequence Integer
    args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (12)
  • action_compute_bom_days(self)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • explode(self, product, quantity, picking_type=False, never_attribute_values=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty', 'product_id', 'product_tmpl_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • toggle_active(self)
  • write(self, vals)

New fields (12)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' args: 'mrp.bom', 'BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product line (divided between the quantity produced).The total of all by-products' cost share must be less than or equal to 100." args: 'Cost Share (%)'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • sequence Integer
    args: 'Sequence'
Public methods (1)
  • action_add_from_catalog(self)

New fields (18)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • manual_consumption Boolean
    copy=True default=False help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' readonly=False store=True args: 'Highlight Consumption'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    index=True related='product_id.product_tmpl_id' store=True args: 'product.template', 'Product Template'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Product Unit of Measure'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
  • tracking Selection
    related='product_id.tracking'
Public methods (5)
  • action_add_from_catalog(self)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (4)
  • consumption Selection
    compute='_compute_consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • mrp_consumption_warning_line_ids One2many → mrp.consumption.warning.line
    args: 'mrp.consumption.warning.line', 'mrp_consumption_warning_id'
  • mrp_production_count Integer
    compute='_compute_mrp_production_count'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (3)
  • action_cancel(self)
  • action_confirm(self)
  • action_set_qty(self)

New fields (7)
  • consumption Selection
    related='mrp_production_id.consumption'
  • mrp_consumption_warning_id Many2one → mrp.consumption.warning
    ondelete='cascade' readonly=True required=True args: 'mrp.consumption.warning', 'Parent Wizard'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • product_consumed_qty_uom Float
    readonly=True args: 'Consumed'
  • product_expected_qty_uom Float
    readonly=True args: 'To Consume'
  • product_id Many2one → product.product
    readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
Public methods (0)

No public methods.

New fields (77)
  • all_move_ids One2many → stock.move
    args: 'stock.move', 'production_id'
  • all_move_raw_ids One2many → stock.move
    args: 'stock.move', 'raw_material_production_id'
  • allow_workorder_dependencies Boolean
    args: 'Allow Work Order Dependencies'
  • backorder_sequence Integer
    copy=False default=0 help='Backorder sequence, if equals to 0 means there is not related backorder' args: 'Backorder Sequence'
  • bom_id Many2one → mrp.bom
    check_company=True compute='_compute_bom_id' domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bills of Materials, also called recipes, are used to autocomplete components and work order instructions.' precompute=True readonly=False store=True args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • components_availability Char
    compute='_compute_components_availability' help="Latest component availability status for this MO. If green, then the MO's readiness status is ready, as per BOM configuration." string='Component Status'
  • components_availability_state Selection
    compute='_compute_components_availability' search='_search_components_availability_state' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late'), ('unavailable', 'Not Available')]
  • consumption Selection
    default='flexible' readonly=True required=True args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • date_deadline Datetime
    compute='_compute_date_deadline' copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' readonly=True store=True args: 'Deadline'
  • date_finished Datetime
    compute='_compute_date_finished' copy=False default=_get_default_date_finished help='Date you expect to finish production or actual date you finished production.' store=True args: 'End'
  • date_start Datetime
    copy=False default=_get_default_date_start help='Date you plan to start production or date you actually started production.' index=True required=True args: 'Start'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • duration Float
    compute='_compute_duration' help='Total real duration (in minutes)' args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' help='Total expected duration (in minutes)' args: 'Expected Duration'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • forecasted_issue Boolean
    compute='_compute_forecasted_issue'
  • is_delayed Boolean
    compute='_compute_is_delayed' search='_search_is_delayed'
  • is_locked Boolean
    copy=False default=_get_default_is_locked args: 'Is Locked'
  • is_outdated_bom Boolean
    help='The BoM has been updated since creation of the MO' args: 'Outdated BoM'
  • is_planned Boolean
    compute='_compute_is_planned' store=True args: 'Its Operations are Planned'
  • 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_locations' domain="[('usage','=','internal')]" help='Location where the system will stock the finished products.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Finished Products Location'
  • location_final_id Many2one → stock.location
    args: 'stock.location', 'Final Location from procurement'
  • location_src_id Many2one → stock.location
    check_company=True compute='_compute_locations' domain="[('usage','=','internal')]" help='Location where the system will look for components.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Components Location'
  • lot_producing_id Many2one → stock.lot
    check_company=True copy=False domain="[('product_id', '=', product_id)]" string='Lot/Serial Number' args: 'stock.lot'
  • move_byproduct_ids One2many → stock.move
    compute='_compute_move_byproduct_ids' inverse='_set_move_byproduct_ids' args: 'stock.move'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    compute='_compute_move_finished_ids' copy=False domain=[('scrapped', '=', False)] readonly=False store=True args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    compute='_compute_move_raw_ids' copy=False domain=[('scrapped', '=', False)] readonly=False store=True args: 'stock.move', 'raw_material_production_id', 'Components'
  • mrp_production_backorder_count Integer
    compute='_compute_mrp_production_backorder' args: 'Count of linked backorder'
  • mrp_production_child_count Integer
    compute='_compute_mrp_production_child_count' args: 'Number of generated MO'
  • mrp_production_source_count Integer
    compute='_compute_mrp_production_source_count' args: 'Number of source MO'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • never_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[\n '&',\n ('attribute_line_id', 'in', valid_product_template_attribute_line_ids),\n ('attribute_id.create_variant', '=', 'no_variant')]" string='Never attribute values' args: 'product.template.attribute.value', 'template_attribute_value_mrp_production_rel', 'production_id', 'template_attribute_value_id'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    copy=False index='btree_not_null' args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' copy=True domain="[('code', '=', 'mrp_operation')]" index=True precompute=True readonly=False required=True store=True args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' help='Components will be reserved first for the MO with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_description_variants Char
    args: 'Custom Description'
  • product_id Many2one → product.product
    check_company=True compute='_compute_product_id' copy=True domain="[('type', '=', 'consu')]" precompute=True readonly=False required=True store=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=True digits='Product Unit of Measure' precompute=True readonly=False required=True store=True tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_uom_id' copy=True domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • product_variant_attributes Many2many → product.template.attribute.value
    related='product_id.product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • production_capacity Float
    compute='_compute_production_capacity' help='Quantity that can be produced with the current stock of components'
  • production_location_id Many2one → stock.location
    compute='_compute_production_location' store=True args: 'stock.location', 'Production Location'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • qty_producing Float
    copy=False digits='Product Unit of Measure' string='Quantity Producing'
  • reservation_state Selection
    compute='_compute_reservation_state' copy=False help='Manufacturing readiness for this MO, as per bill of material configuration:\n * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n' index=True readonly=True store=True string='MO Readiness' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • reserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can reserve quantities' args: 'Allowed to Reserve Production'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • 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')]
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • show_lock Boolean
    compute='_compute_show_lock' args: 'Show Lock/unlock buttons'
  • show_lot_ids Boolean
    compute='_compute_show_lot_ids' args: 'Display the serial number shortcut on the moves'
  • show_produce Boolean
    compute='_compute_show_produce' help='Technical field to check if produce button can be shown'
  • show_produce_all Boolean
    compute='_compute_show_produce' help='Technical field to check if produce all button can be shown'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unbuild_count Integer
    compute='_compute_unbuild_count' string='Number of Unbuilds'
  • unbuild_ids One2many → mrp.unbuild
    args: 'mrp.unbuild', 'mo_id', 'Unbuilds'
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Production'
  • use_create_components_lots Boolean
    related='picking_type_id.use_create_components_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> args: 'res.users', 'Responsible'
  • valid_product_template_attribute_line_ids Many2many
    related='product_tmpl_id.valid_product_template_attribute_line_ids'
  • warehouse_id Many2one
    related='location_src_id.warehouse_id'
  • workcenter_id Many2one → mrp.workcenter
    store=False args: 'mrp.workcenter'
  • workorder_ids One2many → mrp.workorder
    compute='_compute_workorder_ids' copy=True readonly=False store=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (35)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_confirm(self)
  • action_generate_bom(self)
    Generates a new Bill of Material based on the Manufacturing Order's product, components, workorders and by-products, and assigns it to the MO. Returns a new BoM's form view action.
  • action_generate_serial(self)
  • action_mass_produce(self)
  • action_merge(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_plan_with_components_availability(self)
  • action_product_forecast_report(self)
  • action_see_move_scrap(self)
  • action_split(self)
  • action_start(self)
  • action_toggle_is_locked(self)
  • action_update_bom(self)
  • action_view_mo_delivery(self)
    Returns an action that display picking related to manufacturing order. It can either be a list view or in a form view (if there is only one picking to show).
  • action_view_mrp_production_backorders(self)
  • action_view_mrp_production_childs(self)
  • action_view_mrp_production_sources(self)
  • action_view_mrp_production_unbuilds(self)
  • action_view_reception_report(self)
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unbuild(self)
  • button_unplan(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • do_unreserve(self)
  • get_empty_list_help(self, help_message)
    @api.model
  • pre_button_mark_done(self)
  • set_qty_producing(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • mrp_production_backorder_line_ids One2many → mrp.production.backorder.line
    string='Backorder Confirmation Lines' args: 'mrp.production.backorder.line', 'mrp_production_backorder_id'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
  • show_backorder_lines Boolean
    compute='_compute_show_backorder_lines' args: 'Show backorder lines'
Public methods (2)
  • action_backorder(self)
  • action_close_mo(self)

New fields (3)
  • mrp_production_backorder_id Many2one → mrp.production.backorder
    ondelete='cascade' required=True args: 'mrp.production.backorder', 'MO Backorder'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (9)
  • counter Integer
    compute='_compute_counter' default=2 readonly=False store=True args: 'Split #'
  • product_id Many2one
    related='production_id.product_id'
  • product_qty Float
    related='production_id.product_qty'
  • product_uom_id Many2one
    related='production_id.product_uom_id'
  • production_capacity Float
    related='production_id.production_capacity'
  • production_detailed_vals_ids One2many → mrp.production.split.line
    compute='_compute_details' readonly=False store=True args: 'mrp.production.split.line', 'mrp_production_split_id', 'Split Details'
  • production_id Many2one → mrp.production
    readonly=True args: 'mrp.production', 'Manufacturing Order'
  • production_split_multi_id Many2one → mrp.production.split.multi
    args: 'mrp.production.split.multi', 'Split Productions'
  • valid_details Boolean
    compute='_compute_valid_details' args: 'Valid'
Public methods (3)
  • action_prepare_split(self)
  • action_return_to_list(self)
  • action_split(self)

New fields (4)
  • date Datetime
    args: 'Schedule Date'
  • mrp_production_split_id Many2one → mrp.production.split
    ondelete='cascade' required=True args: 'mrp.production.split', 'Split Production'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
  • user_id Many2one → res.users
    domain=<expr> args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (1)
  • production_ids One2many → mrp.production.split
    args: 'mrp.production.split', 'production_split_multi_id', 'Productions To Split'
Public methods (0)

No public methods.

New fields (22)
  • active Boolean
    default=True
  • allow_operation_dependencies Boolean
    related='bom_id.allow_operation_dependencies'
  • blocked_by_operation_ids Many2many → mrp.routing.workcenter
    column1='operation_id' column2='blocked_by_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that need to be completed before this operation can start.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocked By' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    check_company=True index=True ondelete='cascade' required=True args: 'mrp.bom', 'Bill of Material'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one → res.company
    related='bom_id.company_id' args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • needed_by_operation_ids Many2many → mrp.routing.workcenter
    column1='blocked_by_id' column2='operation_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that cannot start before this operation is completed.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocks' args: 'mrp.routing.workcenter'
  • note Html
    args: 'Description'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_computed_on Char
    compute='_compute_time_computed_on' args: 'Computed on last'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help="Time in minutes:- In manual mode, time used- In automatic mode, supposed first time when there aren't any work orders yet" tracking=True args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' tracking=True args: [('auto', 'Compute based on tracked time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True tracking=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'PDF'
  • worksheet_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' tracking=True args: 'Google Slide'
  • worksheet_type Selection
    default='text' string='Worksheet' tracking=True args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
Public methods (6)
  • action_archive(self)
  • action_unarchive(self)
  • copy_existing_operations(self)
  • copy_to_bom(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (15)
  • bom_id Many2one → mrp.bom
    check_company=True compute='_compute_bom_id' domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]" store=True args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage','=','internal')]" help='Location where you want to send the components resulting from the unbuild order.' 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' domain="[('usage','=','internal')]" help='Location where the product you want to unbuild is.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True compute='_compute_lot_id' domain="[('product_id', '=', product_id)]" store=True args: 'stock.lot', 'Lot/Serial Number'
  • mo_bom_id Many2one → mrp.bom
    related='mo_id.bom_id' args: 'mrp.bom', 'Bill of Material used on the Production Order'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', '=', 'done'), ('product_id', '=?', product_id), ('bom_id', '=?', bom_id)]" args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True compute='_compute_product_id' domain="[('type', '=', 'consu')]" precompute=True readonly=False required=True store=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' default=1.0 digits='Product Unit of Measure' precompute=True readonly=False required=True store=True args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (3)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (33)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity_ids One2many → mrp.workcenter.capacity
    copy=True help='Specific number of pieces that can be produced in parallel per product.' string='Product Capacities' args: 'mrp.workcenter.capacity', 'workcenter_id'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Hourly processing cost.' string='Cost per hour' tracking=True
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' required=True args: 'res.currency', 'Currency'
  • default_capacity Float
    default=1.0 help='Default number of pieces (in product UoM) that can be produced in parallel (at the same time) at this work center. For example: the capacity is 5 and you need to produce 10 units, then the operation time listed on the BOM will be multiplied by two. However, note that both time before and after production will only be counted once.' args: 'Capacity'
  • has_routing_lines Boolean
    compute='_compute_has_routing_lines' help='Technical field for workcenter views'
  • kanban_dashboard_graph Text
    compute='_compute_kanban_dashboard_graph'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Html
    args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • resource_calendar_id Many2one
    check_company=True
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • tag_ids Many2many → mrp.workcenter.tag
    args: 'mrp.workcenter.tag'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    args: 'Setup Time'
  • time_stop Float
    args: 'Cleanup Time'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Ready Work Orders'
Public methods (7)
  • action_archive(self)
  • action_show_operations(self)
  • action_work_order(self)
  • action_work_order_alternatives(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (6)
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel for this product.' args: 'Capacity'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • time_start Float
    default=_default_time_start help='Time in minutes for the setup.' args: 'Setup Time (minutes)'
  • time_stop Float
    default=_default_time_stop help='Time in minutes for the cleaning.' args: 'Cleanup Time (minutes)'
  • workcenter_id Many2one → mrp.workcenter
    required=True string='Work Center' args: 'mrp.workcenter'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness'
  • production_id Many2one → mrp.production
    readonly=True related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True index=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True index=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True translate=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (0)

No public methods.

New fields (2)
  • color Integer
    default=_get_default_color args: 'Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (53)
  • allow_workorder_dependencies Boolean
    related='production_id.allow_workorder_dependencies'
  • barcode Char
    compute='_compute_barcode' store=True
  • blocked_by_workorder_ids Many2many → mrp.workorder
    column1='workorder_id' column2='blocked_by_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocked By' args: 'mrp.workorder'
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    related='production_id.consumption'
  • costs_hour Float
    aggregator='avg' default=0.0 string='Cost per hour'
  • date_finished Datetime
    compute='_compute_dates' copy=False inverse='_set_dates' store=True args: 'End'
  • date_start Datetime
    compute='_compute_dates' copy=False inverse='_set_dates' store=True args: 'Start'
  • duration Float
    compute='_compute_duration' copy=False inverse='_set_duration' readonly=False store=True args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' digits=(16, 2) readonly=False store=True args: 'Expected Duration'
  • duration_percent Integer
    aggregator='avg' compute='_compute_duration' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    aggregator='avg' compute='_compute_duration' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" readonly=False related='production_id.lot_producing_id' string='Lot/Serial Number' args: 'stock.lot'
  • has_worksheet Boolean
    compute='_compute_has_worksheet'
  • is_planned Boolean
    related='production_id.is_planned'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' args: 'Is the Current User Working'
  • json_popover Char
    compute='_compute_json_popover' args: 'Popover Data JSON'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True copy=False help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True args: 'Work Order'
  • needed_by_workorder_ids Many2many → mrp.workorder
    column1='blocked_by_id' column2='workorder_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocks' args: 'mrp.workorder'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation'
  • operation_note Html
    readonly=True related='operation_id.note' args: 'Description'
  • product_id Many2one
    check_company=True readonly=True related='production_id.product_id' store=True
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Unit of Measure'
  • production_availability Selection
    readonly=True related='production_id.reservation_state' store=True string='Stock Availability'
  • production_bom_id Many2one → mrp.bom
    related='production_id.bom_id' args: 'mrp.bom'
  • production_date Datetime
    compute='_compute_production_date' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    check_company=True index='btree' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    readonly=True related='production_id.state' string='Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    copy=False default=0.0 digits='Product Unit of Measure' help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    compute='_compute_qty_producing' digits='Product Unit of Measure' inverse='_set_qty_producing' string='Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit of Measure' args: 'Quantity To Be Produced'
  • qty_reported_from_previous_wo Float
    copy=False digits='Product Unit of Measure' help='The quantity already produced awaiting allocation in the backorders chain.' args: 'Carried Quantity'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • sequence Integer
    default=_default_sequence args: 'Sequence'
  • show_json_popover Boolean
    compute='_compute_json_popover' args: 'Show Popover?'
  • state Selection
    compute='_compute_state' copy=False default='pending' index=True readonly=True recursive=True store=True string='Status' args: [('pending', 'Waiting for another WO'), ('waiting', 'Waiting for components'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    copy=False args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' required=True args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    related='workcenter_id.working_state' string='Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
  • worksheet_google_slide Char
    readonly=True related='operation_id.worksheet_google_slide' args: 'Worksheet URL'
  • worksheet_type Selection
    readonly=True related='operation_id.worksheet_type' string='Worksheet Type'
Public methods (18)
  • action_cancel(self)
  • action_mark_as_done(self)
  • action_open_wizard(self)
  • action_replan(self)
    Replan a work order. It actually replans every "ready" or "pending" work orders of the linked manufacturing orders.
  • action_see_move_scrap(self)
  • button_done(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self, raise_on_invalid_state=False)
  • button_unblock(self)
  • create(self, values)
    @api.model_create_multi
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • get_duration(self)
  • get_working_duration(self)
    Get the additional duration for 'open times' i.e. productivity lines with no date_end.
  • unlink(self)
  • write(self, values)

New fields (1)
  • production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (1)
  • process(self)

New fields (1)
  • mrp_production_ids One2many → mrp.production
    args: 'mrp.production', 'procurement_group_id'
Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (1)
  • attached_on_mrp Selection
    default=<expr> help='Leave hidden if document only accessible on product form.\nSelect Bill of Materials to visualise this document as a product attachment when this product is in a bill of material.' required=True selection=[('hidden', 'Hidden'), ('bom', 'Bill of Materials')] string='MRP : Visible at'
Public methods (0)

No public methods.

New fields (8)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit of Measure' args: 'Manufactured'
  • product_catalog_product_is_in_bom Boolean
    compute='_compute_product_is_in_bom_and_mo' search='_search_product_is_in_bom'
  • product_catalog_product_is_in_mo Boolean
    compute='_compute_product_is_in_bom_and_mo' search='_search_product_is_in_mo'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (7)
  • action_archive(self)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit of Measure' args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (4)
  • action_archive(self)
  • action_used_in_bom(self)
  • action_view_mos(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (2)
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_warehouses(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, production_id)
    @api.model
    Endpoint for HTML display.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (1)
  • create_missing_unbuild_sequences(self)
    @api.model

New fields (12)
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_reception_report Boolean
    implied_group='mrp.group_mrp_reception_report' args: 'Allocation Report for Manufacturing Orders'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • group_mrp_workorder_dependencies Boolean
    implied_group='mrp.group_mrp_workorder_dependencies' args: 'Work Order Dependencies'
  • group_unlocked_by_default Boolean
    implied_group='mrp.group_unlocked_by_default' args: 'Unlock Manufacturing Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (1)
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='raw_material_production_id.bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • cost_share Float
    digits=0 help="The percentage of the final production cost for this by-product. The total of all by-products' cost share must be smaller or equal to 100." args: 'Cost Share (%)'
  • created_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Created Production Order'
  • description_bom_line Char
    compute='_compute_description_bom_line' args: 'Kit'
  • is_done Boolean
    compute='_compute_is_done' store=True args: 'Done'
  • manual_consumption Boolean
    compute='_compute_manual_consumption' help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' readonly=False store=True args: 'Manual Consumption'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_id Many2one → stock.lot
    index='btree_not_null' related='raw_material_production_id.lot_producing_id' store=True string='Finished Lot/Serial Number' args: 'stock.lot'
  • product_qty_available Float
    depends=['product_id'] related='product_id.qty_available' args: 'Product On Hand Quantity'
  • product_virtual_available Float
    depends=['product_id'] related='product_id.virtual_available' args: 'Product Forecasted Quantity'
  • production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Production Order for components'
  • should_consume_qty Float
    compute='_compute_should_consume_qty' digits='Product Unit of Measure' args: 'Quantity To Consume'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    compute='_compute_unit_factor' store=True args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True copy=False index='btree_not_null' args: 'mrp.workorder', 'Work Order To Consume'
Public methods (8)
  • action_add_from_catalog_byproduct(self)
  • action_add_from_catalog_raw(self)
  • action_explode(self)
    Explodes pickings
  • action_open_reference(self)
  • action_show_details(self)
  • create(self, vals_list)
    @api.model_create_multi
    Enforce consistent values (i.e. match _get_move_raw_values/_get_move_finished_values) for: - Manually added components/byproducts specifically values we can't set via view with "default_" - Moves from a copied MO - Backorders
  • default_get(self, fields_list)
    @api.model
  • write(self, vals)

New fields (3)
  • description_bom_line Char
    related='move_id.description_bom_line'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • create(self, values)
    @api.model_create_multi
  • write(self, vals)

New fields (3)
  • has_kits Boolean
    compute='_compute_has_kits'
  • production_count Integer
    compute='_compute_mrp_production_ids' groups='mrp.group_mrp_user' args: 'Count of MO generated'
  • production_ids Many2many → mrp.production
    compute='_compute_mrp_production_ids' groups='mrp.group_mrp_user' args: 'mrp.production'
Public methods (3)
  • action_detailed_operations(self)
  • action_view_mrp_production(self)
  • get_action_click_graph(self)
    @api.model

New fields (16)
  • auto_print_done_mrp_lot Boolean
    help='If this checkbox is ticked, Odoo will automatically print the lot/SN label of a MO when it is done.' args: 'Auto Print Produced Lot Label'
  • auto_print_done_mrp_product_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the product labels of a MO when it is done.' args: 'Auto Print Produced Product Labels'
  • auto_print_done_production_order Boolean
    help='If this checkbox is ticked, Odoo will automatically print the production order of a MO when it is done.' args: 'Auto Print Done Production Order'
  • auto_print_generated_mrp_lot Boolean
    help='Automatically print the lot/SN label when the "Create a new serial/lot number" button is used.' args: 'Auto Print Generated Lot/SN Label'
  • auto_print_mrp_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically print the allocation report of a MO when it is done and has assigned moves.' args: 'Auto Print Allocation Report'
  • auto_print_mrp_reception_report_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the allocation report labels of a MO when it is done.' args: 'Auto Print Allocation Report Labels'
  • code Selection
    ondelete={'mrp_operation': <expr>} selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_in_progress Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders In Progress'
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_to_close Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders To Close'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • done_mrp_lot_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Lot/SN Label to Print'
  • generated_mrp_lot_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Generated Lot/SN Label to Print'
  • mrp_product_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Product Label to Print'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • bom_id Many2one → mrp.bom
    string='Bill of Material' args: 'mrp.bom'
  • show_bom Boolean
    compute='_compute_show_bom'
Public methods (0)

No public methods.

New fields (1)
  • action Selection
    ondelete={'manufacture': 'cascade'} selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (5)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'phantom'), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_template)]" args: 'mrp.bom', 'Kit'
  • product_is_kit Boolean
    related='product_id.is_kits'
  • product_template Many2one
    related='product_id.product_tmpl_id'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • do_replenish(self, values=False)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True copy=False domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='1 Step: Consume components from stock and produce.\n 2 Steps: Pick components from stock and then produce.\n 3 Steps: Pick components from stock, produce, and then move final product(s) from production area to stock.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture, then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (3)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]" string='Bill of Materials' args: 'mrp.bom'
  • manufacturing_visibility_days Float
    default=0.0 help='Visibility Days applied on the manufacturing routes.'
  • show_bom Boolean
    compute='_compute_show_bom' args: 'Show BoM column'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Martinelli, qdp-odoo, Atul Patel, Aaron Bohy, GitHub, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Adrien Dieudonne, Jorge Pinna Puissant, Lucas Perais, Alexandre Kühn, Arnold Moyaux, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, William Henrotin, Sébastien Theys, Joseph Caburnay, svs-odoo, Samuel Degueldre, Alvaro Fuentes, Lucas Lefèvre, Adrien Widart, Touati Djamel (otd), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Ivàn Todorovich, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, snd, William Braeckman, odoo, Stefan-Calin Crainiciuc (stcc), roen-odoo, Benoit Socias, Hubert Van de Walle (huvw), Miquel Raïch, MerlinGuillaume, David (dafr), JF Aubert, PNO, yhu-odoo, bat-odoo, Antoine Guenet, Walid HANNICHE (waha), Yolann Sabaux, Antoine Vandevenne (anv), Jinjiu Liu, Aurelien van Delft (avd), Mathieu Walravens, Valentin Chevalier, niyasraphy, alsh-odoo, Matheus Leal Viana (malv), Louis Wicket (wil), Walid, Adrien Widart (awt), nda, Victor Piryns (pivi), Mahamadasif Ansari, Pierre-Yves Dufays, Malay Khamar, clesgow, Michele, Djamel Touati, Pieter Claeys (clpi), Andrew Gavgavian, Om Rabara, Levi Siuzdak (sile), Dylan Kiss (dyki), Hansun (hale), Jinane Maksoud, Bruno Boi, Antoine (ande), ノウラ, Maitri Patel, kir-odoo, FrancoisGe, Michael (mcm), Preksha Chouhan, Karnav Sojitra, paso-odoo, Martin Maes, Ahmed Khalaf, stcc-odoo, Xavier Bol (xbo), Brieuc-brd, micheledic, Paweł Fertyk, Ahmed Khalaf (ahkh), Khushi Vakil, Sarah Bellefroid, Mahdi Cheikh Rouhou (macr), ilru-odoo, Andrzej(pian), kdeb@odoo.com, Mattis Megevand, Youssef Bashandy, Eteil Djoumatchoua(etdj), Ethan Vincent, lase@odoo.com, Aurelien MARIE (auma), reka-odoo, Richard Prosser, AMZIL Ayoub, Nathaniel (naja), Julien Carion (juca), mega, Leanhdung2881999, Louis Gobert, Chrysanthe (chgo), Louis (wil), Junqi Wu, mano-odoo, Hussein Ebrahim(hyhe), kago-odoo, Elisabeth Dickinson, Xavier Luyckx (xlu), Sanchit Gupta, Stéphane Diez, dhha-odoo, Mathias Mathy (MAMA), Simon Wydooghe, gteboul, sabr, Julien Schwanen, Jitendra Prajapat, EmilioPascual, David Van Droogenbroeck (DROD), Morgane (morm), djameltouati, Pierre Lamotte (pila), macadelic, Pierre Pulinckx (pipu), Bastien PIERRE, Corentin Lombard, Carmine, Rahul Reddiar, chha-odoo, AlienAtSystem, MaximeNoirhomme, uso-odoo, bona-odoo, ArnauCForgeFlow, Tejas Modi, Juan Ignacio Carreras, Hardik Domadiya, priyanshi patel(prpa), plha-odoo, Duy (Đỗ Anh), fd-oerp, Hadi El Yakhni, Tyler Landivar (tylan), rare-odoo, sawer, kinhosz, agbr-odoo, aksi-odoo, Lancelot Semal, ABE-Mark45, Laszlo Almasy (azl), josv-odoo, daiduongnguyen-odoo, Oskar Kosobucki, shreya patel (shpa)
WEBSITE
WEBSITEhttps://www.odoo.com/app/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (102)
XML IDNameModelTypeStatus
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mo_overview_byproducts mo_overview_byproducts ir.ui.view qweb New
mo_overview_components mo_overview_components ir.ui.view qweb New
mo_overview_content mo_overview_content ir.ui.view qweb New
mo_overview_line mo_overview_line ir.ui.view qweb New
mo_overview_operations mo_overview_operations ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_product_product_search_view mrp.product.product.search product.product xpath Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template xpath Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_view_activity mrp.production.view.activity mrp.production activity New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_editable_view mrp.production.work.order.tree.editable mrp.workorder tree New
mrp_production_workorder_tree_view mrp.production.work.order.tree mrp.workorder xpath Inherits mrp.mrp_production_workorder_tree_editable_view
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_workcenter_bom_tree_view mrp.routing.workcenter.bom.tree mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_copy_to_bom_tree_view mrp.routing.workcenter.copy_to_bom.tree mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_filter mrp.routing.workcenter.filter mrp.routing.workcenter search New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_form_view_simplified mrp.unbuild.form.simplified mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template xpath Inherits stock.product_template_form_view_procurement_button
production_message production_message ir.ui.view qweb New
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mo_overview report_mo_overview ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_production_components report_mrp_production_components ir.ui.view qweb New
report_mrp_workorder report_mrp_workorder ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_report_delivery_document_inherit_mrp stock_report_delivery_document_inherit_mrp ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_kit_sections stock_report_delivery_kit_sections ir.ui.view qweb New
stock_report_delivery_no_kit_section stock_report_delivery_no_kit_section ir.ui.view qweb New
stock_scrap_search_view_inherit_mrp stock.scrap.search.inherit.mrp stock.scrap xpath Inherits stock.stock_scrap_search_view
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_assign_serial_numbers_production mrp_assign_serial_numbers stock.assign.serial form New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_consumption_warning_form Consumption Warning mrp.consumption.warning form New
view_mrp_document_form mrp.document.form mrp.document form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_backorder_form Create Backorder mrp.production.backorder form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_split_form Split Production mrp.production.split form New
view_mrp_production_split_multi_form mrp.production.split.multi.form mrp.production.split.multi form New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_form_inherit_mrp view.picking.form.inherit.mrp stock.picking xpath Inherits stock.view_picking_form
view_picking_type_form_inherit_mrp Operation Types stock.picking.type xpath Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_line_detailed_operation_tree_mrp stock.move.line.operations.tree.mrp stock.move.line xpath Inherits stock.view_stock_move_line_detailed_operation_tree
view_stock_move_line_operation_tree_finished stock.move.line.operation.tree.finished stock.move.line xpath Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_finished stock.move.operations.finished.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_move_operations_raw stock.move.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_warehouse_orderpoint_tree_editable_inherited_purchase stock.warehouse.orderpoint.tree.editable.inherit.purchase stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree_editable
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (57)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (20)
  • active Boolean
    default=True args: 'Active'
  • allow_operation_dependencies Boolean
    help='Create operation level dependencies that will influence both planning and the status of work orders upon MO confirmation. If this feature is ticked, and nothing is specified, Odoo will assume that all operations can be started simultaneously.' args: 'Operation Dependencies'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='warning' help='Defines if you can consume more or less components than the quantity defined on the BoM:\n * Allowed: allowed for all manufacturing users.\n * Allowed with warning: allowed for all manufacturing users with summary of consumption differences when closing the manufacturing order.\n Note that in the case of component Manual Consumption, where consumption is registered manually exclusively, consumption warnings will still be issued when appropriate also.\n * Blocked: only a manager can close a manufacturing order when the BoM consumption is not respected.' required=True string='Flexible Consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • days_to_prepare_mo Integer
    default=0 help='Create and confirm Manufacturing Orders this many days in advance, to have enough time to replenish components or manufacture semi-finished products.\nNote that security lead times will also be considered when appropriate.' string='Days to prepare Manufacturing Order'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'bom_id', 'Operations'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation')]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • possible_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • produce_delay Integer
    default=0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added. In case the product is subcontracted, this can be used to determine the date at which components should be sent to the subcontractor.' args: 'Manufacturing Lead Time'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu'])]" help='If a product variant is defined the BOM is available only for this product.' index=True args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' help='This should be the smallest quantity that this product can be produced in. If the BOM contains operations, make sure the work center capacity is accurate.' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', 'in', ['product', 'consu'])]" index=True required=True args: 'product.template', 'Product'
  • product_uom_category_id Many2one
    related='product_tmpl_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit of Measure'
  • ready_to_produce Selection
    default='all_available' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • sequence Integer
    args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (12)
  • action_compute_bom_days(self)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty', 'product_id', 'product_tmpl_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • toggle_active(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' args: 'mrp.bom', 'BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product line (divided between the quantity produced).The total of all by-products' cost share must be less than or equal to 100." args: 'Cost Share (%)'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • sequence Integer
    args: 'Sequence'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • manual_consumption Boolean
    compute='_compute_manual_consumption' copy=True default=False help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' readonly=False store=True args: 'Manual Consumption'
  • manual_consumption_readonly Boolean
    compute='_compute_manual_consumption_readonly' args: 'Manual Consumption Readonly'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    index=True related='product_id.product_tmpl_id' store=True args: 'product.template', 'Product Template'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Product Unit of Measure'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
  • tracking Selection
    related='product_id.tracking'
Public methods (4)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (4)
  • consumption Selection
    compute='_compute_consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • mrp_consumption_warning_line_ids One2many → mrp.consumption.warning.line
    args: 'mrp.consumption.warning.line', 'mrp_consumption_warning_id'
  • mrp_production_count Integer
    compute='_compute_mrp_production_count'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (3)
  • action_cancel(self)
  • action_confirm(self)
  • action_set_qty(self)

New fields (7)
  • consumption Selection
    related='mrp_production_id.consumption'
  • mrp_consumption_warning_id Many2one → mrp.consumption.warning
    ondelete='cascade' readonly=True required=True args: 'mrp.consumption.warning', 'Parent Wizard'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • product_consumed_qty_uom Float
    readonly=True args: 'Consumed'
  • product_expected_qty_uom Float
    readonly=True args: 'To Consume'
  • product_id Many2one → product.product
    readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (2)
  • copy(self, default=None)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (75)
  • all_move_ids One2many → stock.move
    args: 'stock.move', 'production_id'
  • all_move_raw_ids One2many → stock.move
    args: 'stock.move', 'raw_material_production_id'
  • allow_workorder_dependencies Boolean
    args: 'Allow Work Order Dependencies'
  • backorder_sequence Integer
    copy=False default=0 help='Backorder sequence, if equals to 0 means there is not related backorder' args: 'Backorder Sequence'
  • bom_id Many2one → mrp.bom
    check_company=True compute='_compute_bom_id' domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bills of Materials, also called recipes, are used to autocomplete components and work order instructions.' precompute=True readonly=False store=True args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • components_availability Char
    compute='_compute_components_availability' help="Latest component availability status for this MO. If green, then the MO's readiness status is ready, as per BOM configuration." string='Component Status'
  • components_availability_state Selection
    compute='_compute_components_availability' search='_search_components_availability_state' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late'), ('unavailable', 'Not Available')]
  • confirm_cancel Boolean
    compute='_compute_confirm_cancel'
  • consumption Selection
    default='flexible' readonly=True required=True args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • date_deadline Datetime
    compute='_compute_date_deadline' copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' readonly=True store=True args: 'Deadline'
  • date_finished Datetime
    compute='_compute_date_finished' copy=False default=_get_default_date_finished help='Date you expect to finish production or actual date you finished production.' store=True args: 'End'
  • date_start Datetime
    copy=False default=_get_default_date_start help='Date you plan to start production or date you actually started production.' index=True required=True args: 'Start'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • duration Float
    compute='_compute_duration' help='Total real duration (in minutes)' args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' help='Total expected duration (in minutes)' args: 'Expected Duration'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • forecasted_issue Boolean
    compute='_compute_forecasted_issue'
  • is_locked Boolean
    copy=False default=_get_default_is_locked args: 'Is Locked'
  • is_outdated_bom Boolean
    help='The BoM has been updated since creation of the MO' args: 'Outdated BoM'
  • is_planned Boolean
    compute='_compute_is_planned' store=True args: 'Its Operations are Planned'
  • 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_locations' domain="[('usage','=','internal')]" help='Location where the system will stock the finished products.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    check_company=True compute='_compute_locations' domain="[('usage','=','internal')]" help='Location where the system will look for components.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Components Location'
  • lot_producing_id Many2one → stock.lot
    check_company=True copy=False domain="[('product_id', '=', product_id)]" string='Lot/Serial Number' args: 'stock.lot'
  • move_byproduct_ids One2many → stock.move
    compute='_compute_move_byproduct_ids' inverse='_set_move_byproduct_ids' args: 'stock.move'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    compute='_compute_move_finished_ids' copy=False domain=[('scrapped', '=', False)] readonly=False store=True args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    compute='_compute_move_raw_ids' copy=False domain=[('scrapped', '=', False)] readonly=False store=True args: 'stock.move', 'raw_material_production_id', 'Components'
  • mrp_production_backorder_count Integer
    compute='_compute_mrp_production_backorder' args: 'Count of linked backorder'
  • mrp_production_child_count Integer
    compute='_compute_mrp_production_child_count' args: 'Number of generated MO'
  • mrp_production_source_count Integer
    compute='_compute_mrp_production_source_count' args: 'Number of source MO'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    copy=False index='btree_not_null' args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' copy=True domain="[('code', '=', 'mrp_operation')]" index=True precompute=True readonly=False required=True store=True args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' help='Components will be reserved first for the MO with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_description_variants Char
    args: 'Custom Description'
  • product_id Many2one → product.product
    check_company=True compute='_compute_product_id' copy=True domain="[('type', 'in', ['product', 'consu'])]" precompute=True readonly=False required=True store=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=True digits='Product Unit of Measure' precompute=True readonly=False required=True store=True tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_uom_id' copy=True domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • product_variant_attributes Many2many → product.template.attribute.value
    related='product_id.product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • production_capacity Float
    compute='_compute_production_capacity' help='Quantity that can be produced with the current stock of components'
  • production_location_id Many2one → stock.location
    compute='_compute_production_location' store=True args: 'stock.location', 'Production Location'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • qty_producing Float
    copy=False digits='Product Unit of Measure' string='Quantity Producing'
  • reservation_state Selection
    compute='_compute_reservation_state' copy=False help='Manufacturing readiness for this MO, as per bill of material configuration:\n * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n' index=True readonly=True store=True string='MO Readiness' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • reserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can reserve quantities' args: 'Allowed to Reserve Production'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • show_lock Boolean
    compute='_compute_show_lock' args: 'Show Lock/unlock buttons'
  • show_lot_ids Boolean
    compute='_compute_show_lot_ids' args: 'Display the serial number shortcut on the moves'
  • show_produce Boolean
    compute='_compute_show_produce' help='Technical field to check if produce button can be shown'
  • show_produce_all Boolean
    compute='_compute_show_produce' help='Technical field to check if produce all button can be shown'
  • show_serial_mass_produce Boolean
    compute='_compute_show_serial_mass_produce' args: 'Display the serial mass produce wizard action'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unbuild_count Integer
    compute='_compute_unbuild_count' string='Number of Unbuilds'
  • unbuild_ids One2many → mrp.unbuild
    args: 'mrp.unbuild', 'mo_id', 'Unbuilds'
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Production'
  • use_auto_consume_components_lots Boolean
    related='picking_type_id.use_auto_consume_components_lots'
  • use_create_components_lots Boolean
    related='picking_type_id.use_create_components_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> args: 'res.users', 'Responsible'
  • warehouse_id Many2one
    related='location_src_id.warehouse_id'
  • workcenter_id Many2one → mrp.workcenter
    store=False args: 'mrp.workcenter'
  • workorder_ids One2many → mrp.workorder
    compute='_compute_workorder_ids' copy=True readonly=False store=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (35)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_confirm(self)
  • action_generate_bom(self)
    Generates a new Bill of Material based on the Manufacturing Order's product, components, workorders and by-products, and assigns it to the MO. Returns a new BoM's form view action.
  • action_generate_serial(self)
  • action_merge(self)
  • action_open_label_layout(self)
  • action_open_label_type(self)
  • action_plan_with_components_availability(self)
  • action_product_forecast_report(self)
  • action_see_move_scrap(self)
  • action_serial_mass_produce_wizard(self, mark_as_done=False)
  • action_split(self)
  • action_toggle_is_locked(self)
  • action_update_bom(self)
  • action_view_mo_delivery(self)
    Returns an action that display picking related to manufacturing order. It can either be a list view or in a form view (if there is only one picking to show).
  • action_view_mrp_production_backorders(self)
  • action_view_mrp_production_childs(self)
  • action_view_mrp_production_sources(self)
  • action_view_mrp_production_unbuilds(self)
  • action_view_reception_report(self)
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unbuild(self)
  • button_unplan(self)
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • do_unreserve(self)
  • get_empty_list_help(self, help_message)
    @api.model
  • pre_button_mark_done(self)
  • set_qty_producing(self)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • mrp_production_backorder_line_ids One2many → mrp.production.backorder.line
    string='Backorder Confirmation Lines' args: 'mrp.production.backorder.line', 'mrp_production_backorder_id'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
  • show_backorder_lines Boolean
    compute='_compute_show_backorder_lines' args: 'Show backorder lines'
Public methods (2)
  • action_backorder(self)
  • action_close_mo(self)

New fields (3)
  • mrp_production_backorder_id Many2one → mrp.production.backorder
    ondelete='cascade' required=True args: 'mrp.production.backorder', 'MO Backorder'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (9)
  • counter Integer
    compute='_compute_counter' default=0 readonly=False store=True args: 'Split #'
  • product_id Many2one
    related='production_id.product_id'
  • product_qty Float
    related='production_id.product_qty'
  • product_uom_id Many2one
    related='production_id.product_uom_id'
  • production_capacity Float
    related='production_id.production_capacity'
  • production_detailed_vals_ids One2many → mrp.production.split.line
    compute='_compute_details' readonly=False store=True args: 'mrp.production.split.line', 'mrp_production_split_id', 'Split Details'
  • production_id Many2one → mrp.production
    readonly=True args: 'mrp.production', 'Manufacturing Order'
  • production_split_multi_id Many2one → mrp.production.split.multi
    args: 'mrp.production.split.multi', 'Split Productions'
  • valid_details Boolean
    compute='_compute_valid_details' args: 'Valid'
Public methods (3)
  • action_prepare_split(self)
  • action_return_to_list(self)
  • action_split(self)

New fields (4)
  • date Datetime
    args: 'Schedule Date'
  • mrp_production_split_id Many2one → mrp.production.split
    ondelete='cascade' required=True args: 'mrp.production.split', 'Split Production'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
  • user_id Many2one → res.users
    domain=<expr> args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (1)
  • production_ids One2many → mrp.production.split
    args: 'mrp.production.split', 'production_split_multi_id', 'Productions To Split'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (22)
  • active Boolean
    default=True
  • allow_operation_dependencies Boolean
    related='bom_id.allow_operation_dependencies'
  • blocked_by_operation_ids Many2many → mrp.routing.workcenter
    column1='operation_id' column2='blocked_by_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that need to be completed before this operation can start.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocked By' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    check_company=True index=True ondelete='cascade' required=True args: 'mrp.bom', 'Bill of Material'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one → res.company
    related='bom_id.company_id' args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • needed_by_operation_ids Many2many → mrp.routing.workcenter
    column1='blocked_by_id' column2='operation_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that cannot start before this operation is completed.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocks' args: 'mrp.routing.workcenter'
  • note Html
    args: 'Description'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_computed_on Char
    compute='_compute_time_computed_on' args: 'Computed on last'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help="Time in minutes:- In manual mode, time used- In automatic mode, supposed first time when there aren't any work orders yet" args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' args: [('auto', 'Compute based on tracked time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'PDF'
  • worksheet_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • worksheet_type Selection
    default='text' string='Worksheet' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
Public methods (6)
  • action_archive(self)
  • action_unarchive(self)
  • copy_existing_operations(self)
  • copy_to_bom(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (15)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]" args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage','=','internal')]" help='Location where you want to send the components resulting from the unbuild order.' 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' domain="[('usage','=','internal')]" help='Location where the product you want to unbuild is.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id)]" args: 'stock.lot', 'Lot/Serial Number'
  • mo_bom_id Many2one → mrp.bom
    related='mo_id.bom_id' args: 'mrp.bom', 'Bill of Material used on the Production Order'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', '=', 'done'), ('product_id', '=?', product_id), ('bom_id', '=?', bom_id)]" args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu'])]" required=True args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 required=True args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (3)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (31)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity_ids One2many → mrp.workcenter.capacity
    copy=True help='Specific number of pieces that can be produced in parallel per product.' string='Product Capacities' args: 'mrp.workcenter.capacity', 'workcenter_id'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Hourly processing cost.' string='Cost per hour'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' required=True args: 'res.currency', 'Currency'
  • default_capacity Float
    default=1.0 help='Default number of pieces (in product UoM) that can be produced in parallel (at the same time) at this work center. For example: the capacity is 5 and you need to produce 10 units, then the operation time listed on the BOM will be multiplied by two. However, note that both time before and after production will only be counted once.' args: 'Capacity'
  • has_routing_lines Boolean
    compute='_compute_has_routing_lines' help='Technical field for workcenter views'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Html
    args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • tag_ids Many2many → mrp.workcenter.tag
    args: 'mrp.workcenter.tag'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    args: 'Setup Time'
  • time_stop Float
    args: 'Cleanup Time'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (6)
  • action_archive(self)
  • action_show_operations(self)
  • action_work_order(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (6)
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel for this product.' args: 'Capacity'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • time_start Float
    default=_default_time_start help='Time in minutes for the setup.' args: 'Setup Time (minutes)'
  • time_stop Float
    default=_default_time_stop help='Time in minutes for the cleaning.' args: 'Cleanup Time (minutes)'
  • workcenter_id Many2one → mrp.workcenter
    required=True string='Work Center' args: 'mrp.workcenter'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness'
  • production_id Many2one → mrp.production
    readonly=True related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True index=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True index=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True translate=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (0)

No public methods.

New fields (2)
  • color Integer
    default=_get_default_color args: 'Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (52)
  • allow_workorder_dependencies Boolean
    related='production_id.allow_workorder_dependencies'
  • barcode Char
    compute='_compute_barcode' store=True
  • blocked_by_workorder_ids Many2many → mrp.workorder
    column1='workorder_id' column2='blocked_by_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocked By' args: 'mrp.workorder'
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    related='production_id.consumption'
  • costs_hour Float
    default=0.0 group_operator='avg' string='Cost per hour'
  • date_finished Datetime
    compute='_compute_dates' copy=False inverse='_set_dates' store=True args: 'End'
  • date_start Datetime
    compute='_compute_dates' copy=False inverse='_set_dates' store=True args: 'Start'
  • duration Float
    compute='_compute_duration' copy=False inverse='_set_duration' readonly=False store=True args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' digits=(16, 2) readonly=False store=True args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" readonly=False related='production_id.lot_producing_id' string='Lot/Serial Number' args: 'stock.lot'
  • has_worksheet Boolean
    compute='_compute_has_worksheet'
  • is_planned Boolean
    related='production_id.is_planned'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' args: 'Is the Current User Working'
  • json_popover Char
    compute='_compute_json_popover' args: 'Popover Data JSON'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True copy=False help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True args: 'Work Order'
  • needed_by_workorder_ids Many2many → mrp.workorder
    column1='blocked_by_id' column2='workorder_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocks' args: 'mrp.workorder'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation'
  • operation_note Html
    readonly=True related='operation_id.note' args: 'Description'
  • product_id Many2one
    check_company=True readonly=True related='production_id.product_id' store=True
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Unit of Measure'
  • production_availability Selection
    readonly=True related='production_id.reservation_state' store=True string='Stock Availability'
  • production_bom_id Many2one → mrp.bom
    related='production_id.bom_id' args: 'mrp.bom'
  • production_date Datetime
    related='production_id.date_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    check_company=True index='btree' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    readonly=True related='production_id.state' string='Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    copy=False default=0.0 digits='Product Unit of Measure' help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    compute='_compute_qty_producing' digits='Product Unit of Measure' inverse='_set_qty_producing' string='Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit of Measure' args: 'Quantity To Be Produced'
  • qty_reported_from_previous_wo Float
    copy=False digits='Product Unit of Measure' help='The quantity already produced awaiting allocation in the backorders chain.' args: 'Carried Quantity'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • show_json_popover Boolean
    compute='_compute_json_popover' args: 'Show Popover?'
  • state Selection
    compute='_compute_state' copy=False default='pending' index=True readonly=True recursive=True store=True string='Status' args: [('pending', 'Waiting for another WO'), ('waiting', 'Waiting for components'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    copy=False args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' required=True args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    related='workcenter_id.working_state' string='Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
  • worksheet_google_slide Char
    readonly=True related='operation_id.worksheet_google_slide' args: 'Worksheet URL'
  • worksheet_type Selection
    readonly=True related='operation_id.worksheet_type' string='Worksheet Type'
Public methods (19)
  • action_cancel(self)
  • action_mark_as_done(self)
  • action_open_wizard(self)
  • action_replan(self)
    Replan a work order. It actually replans every "ready" or "pending" work orders of the linked manufacturing orders.
  • action_see_move_scrap(self)
  • button_done(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self)
  • button_unblock(self)
  • create(self, values)
    @api.model_create_multi
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • gantt_unavailability(self, start_date, end_date, scale, group_bys=None, rows=None)
    @api.model
    Get unavailabilities data to display in the Gantt view.
  • get_duration(self)
  • get_working_duration(self)
    Get the additional duration for 'open times' i.e. productivity lines with no date_end.
  • unlink(self)
  • write(self, values)

New fields (1)
  • production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (1)
  • process(self)

New fields (1)
  • mrp_production_ids One2many → mrp.production
    args: 'mrp.production', 'procurement_group_id'
Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit of Measure' args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (7)
  • action_archive(self)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit of Measure' args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (4)
  • action_archive(self)
  • action_used_in_bom(self)
  • action_view_mos(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (2)
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_warehouses(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, production_id)
    @api.model
    Endpoint for HTML display.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (1)
  • create_missing_unbuild_sequences(self)
    @api.model

New fields (12)
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_reception_report Boolean
    implied_group='mrp.group_mrp_reception_report' args: 'Allocation Report for Manufacturing Orders'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • group_mrp_workorder_dependencies Boolean
    implied_group='mrp.group_mrp_workorder_dependencies' args: 'Work Order Dependencies'
  • group_unlocked_by_default Boolean
    implied_group='mrp.group_unlocked_by_default' args: 'Unlock Manufacturing Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (1)
  • set_values(self)

New fields (8)
  • expected_qty Float
    digits='Product Unit of Measure' args: 'Expected Quantity'
  • mark_as_done Boolean
    args: 'Valide all the productions after the split'
  • multiple_lot_components_names Text
  • produced_qty Float
    digits='Product Unit of Measure' args: 'Produced Quantity'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial_numbers Text
    args: 'Produced Serial Numbers'
  • show_apply Boolean
  • show_backorders Boolean
Public methods (4)
  • apply(self)
  • create_backorder(self)
  • generate_serial_numbers_production(self)
  • no_backorder(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='raw_material_production_id.bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product. The total of all by-products' cost share must be smaller or equal to 100." args: 'Cost Share (%)'
  • created_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Created Production Order'
  • description_bom_line Char
    compute='_compute_description_bom_line' args: 'Kit'
  • is_done Boolean
    compute='_compute_is_done' store=True args: 'Done'
  • manual_consumption Boolean
    compute='_compute_manual_consumption' help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' store=True args: 'Manual Consumption'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_id Many2one → stock.lot
    index='btree_not_null' related='raw_material_production_id.lot_producing_id' store=True string='Finished Lot/Serial Number' args: 'stock.lot'
  • product_qty_available Float
    depends=['product_id'] related='product_id.qty_available' args: 'Product On Hand Quantity'
  • product_virtual_available Float
    depends=['product_id'] related='product_id.virtual_available' args: 'Product Forecasted Quantity'
  • production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Production Order for components'
  • should_consume_qty Float
    compute='_compute_should_consume_qty' digits='Product Unit of Measure' args: 'Quantity To Consume'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    compute='_compute_unit_factor' store=True args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True copy=False index='btree_not_null' args: 'mrp.workorder', 'Work Order To Consume'
Public methods (6)
  • action_explode(self)
    Explodes pickings
  • action_open_reference(self)
  • action_show_details(self)
  • create(self, vals_list)
    @api.model_create_multi
    Enforce consistent values (i.e. match _get_move_raw_values/_get_move_finished_values) for: - Manually added components/byproducts specifically values we can't set via view with "default_" - Moves from a copied MO - Backorders
  • default_get(self, fields_list)
    @api.model
  • write(self, vals)

New fields (3)
  • description_bom_line Char
    related='move_id.description_bom_line'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • create(self, values)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • has_kits Boolean
    compute='_compute_has_kits'
Public methods (1)
  • action_detailed_operations(self)

New fields (15)
  • auto_print_done_mrp_lot Boolean
    help='If this checkbox is ticked, Odoo will automatically print the lot/SN label of a MO when it is done.' args: 'Auto Print Produced Lot Label'
  • auto_print_done_mrp_product_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the product labels of a MO when it is done.' args: 'Auto Print Produced Product Labels'
  • auto_print_done_production_order Boolean
    help='If this checkbox is ticked, Odoo will automatically print the production order of a MO when it is done.' args: 'Auto Print Done Production Order'
  • auto_print_generated_mrp_lot Boolean
    help='Automatically print the lot/SN label when the "Create a new serial/lot number" button is used.' args: 'Auto Print Generated Lot/SN Label'
  • auto_print_mrp_reception_report Boolean
    help='If this checkbox is ticked, Odoo will automatically print the allocation report of a MO when it is done and has assigned moves.' args: 'Auto Print Allocation Report'
  • auto_print_mrp_reception_report_labels Boolean
    help='If this checkbox is ticked, Odoo will automatically print the allocation report labels of a MO when it is done.' args: 'Auto Print Allocation Report Labels'
  • code Selection
    ondelete={'mrp_operation': <expr>} selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • done_mrp_lot_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Lot/SN Label to Print'
  • generated_mrp_lot_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Generated Lot/SN Label to Print'
  • mrp_product_label_to_print Selection
    default='pdf' args: [('pdf', 'PDF'), ('zpl', 'ZPL')], 'Product Label to Print'
  • use_auto_consume_components_lots Boolean
    help='Allow automatic consumption of tracked components that are reserved' string='Consume Reserved Lots/Serial Numbers automatically'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (1)
  • action_apply_inventory(self)

New fields (1)
  • action Selection
    ondelete={'manufacture': 'cascade'} selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (5)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'phantom'), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_template)]" args: 'mrp.bom', 'Kit'
  • product_is_kit Boolean
    related='product_id.is_kits'
  • product_template Many2one
    related='product_id.product_tmpl_id'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • do_replenish(self, values=False)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True copy=False domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='Produce: Move the components to the production location directly and start the manufacturing process.\nPick / Produce: Unload the components from the Stock to Input location first, and then transfer it to the Production location.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components and then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture and then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    copy=False args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True copy=False args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (3)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]" string='Bill of Materials' args: 'mrp.bom'
  • manufacturing_visibility_days Float
    default=0.0 help='Visibility Days applied on the manufacturing routes.'
  • show_bom Boolean
    compute='_compute_show_bom' args: 'Show BoM column'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Aaron Bohy, GitHub, Damien Bouvy, Yannick Tivisse, Pierre Masereel, Lucas Perais, Arnold Moyaux, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, William Henrotin, Akim Juillerat, alt-odoo, Florent de Labarre, svs-odoo, Samuel Degueldre, Alvaro Fuentes, Achraf (abz), Adrien Widart, Ivan Yelizariev, Touati Djamel (otd), Tiffany Chang (tic), Nathan Marotte (nama), Rémy Voet (ryv), Ivàn Todorovich, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, snd, Aurélien (avd), William Braeckman, Yann Papouin, Guillaume (guva), odoo, Stefan-Calin Crainiciuc (stcc), roen-odoo, Hubert Van de Walle (huvw), Miquel Raïch, william-andre, Florian Damhaut, MerlinGuillaume, David (dafr), JF Aubert, PNO, yhu-odoo, thcl-odoo, Walid HANNICHE (waha), Yolann Sabaux, Abdelouahab (abla), Adrien Minet, Antoine Vandevenne (anv), Jinjiu Liu, Aurelien van Delft (avd), Mathieu Walravens, Roy Le, Himanshu Domadiya, niyasraphy, Graeme Gellatly, Thomas Lefebvre (thle), alsh-odoo, Matheus Leal Viana (malv), Louis Wicket (wil), Walid, Adrien Widart (awt), althaf shaik, clesgow, Michele, Djamel Touati, Pieter Claeys (clpi), Nicolas Pierre, Om Rabara, Levi Siuzdak (sile), Hansun (hale), Jinane Maksoud, Antoine (ande), ノウラ, kir-odoo, FrancoisGe, paso-odoo, Francesco Ballerini, CarmenMiranda, Martin Maes, Vikash Tiwari, Ahmed Khalaf, stcc-odoo, micheledic, Paweł Fertyk, Ahmed Khalaf (ahkh), Sarah Bellefroid, Mahdi Cheikh Rouhou (macr), ilru-odoo, stefanorigano (SRI), Dang Van Loc, Mattis Megevand, Youssef Bashandy, Eteil Djoumatchoua(etdj), Ethan Vincent, lase@odoo.com, Aurelien MARIE (auma), debu-odoo, reka-odoo, Richard Prosser, AMZIL Ayoub, mega, Martin Trigaux (mat), kado-odoo, Leanhdung2881999, Louis Gobert, Aungkokolin1997, Junqi Wu, csnauwaert, Mathieu (mano), kago-odoo, Xavier Luyckx (xlu), Sanchit Gupta, Stéphane Diez, dhha-odoo, Mathias Mathy (MAMA), Simon Wydooghe, EmilioPascual, Morgane (morm), djameltouati, Rahul Reddiar, chha-odoo, AlienAtSystem, MaximeNoirhomme, uso-odoo, bona-odoo, ArnauCForgeFlow, Tejas Modi, Juan Ignacio Carreras, Triet Ngo, Hardik Domadiya, priyanshi patel(prpa)
WEBSITE
WEBSITEhttps://www.odoo.com/app/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - stock
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (97)
XML IDNameModelTypeStatus
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_product_product_search_view mrp.product.product.search product.product xpath Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template xpath Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_editable_view mrp.production.work.order.tree.editable mrp.workorder tree New
mrp_production_workorder_tree_view mrp.production.work.order.tree mrp.workorder xpath Inherits mrp.mrp_production_workorder_tree_editable_view
mrp_report_product_product_replenishment mrp_report_product_product_replenishment ir.ui.view qweb Inherits stock.report_product_product_replenishment
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_workcenter_bom_tree_view mrp.routing.workcenter.bom.tree mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_copy_to_bom_tree_view mrp.routing.workcenter.copy_to_bom.tree mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_filter mrp.routing.workcenter.filter mrp.routing.workcenter search New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_form_view_simplified mrp.unbuild.form.simplified mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template xpath Inherits stock.product_template_form_view_procurement_button
production_message production_message ir.ui.view qweb New
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_production_components report_mrp_production_components ir.ui.view qweb New
report_mrp_workorder report_mrp_workorder ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_report_delivery_document_inherit_mrp stock_report_delivery_document_inherit_mrp ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_kit_sections stock_report_delivery_kit_sections ir.ui.view qweb New
stock_report_delivery_no_kit_section stock_report_delivery_no_kit_section ir.ui.view qweb New
stock_scrap_search_view_inherit_mrp stock.scrap.search.inherit.mrp stock.scrap xpath Inherits stock.stock_scrap_search_view
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_assign_serial_numbers_production mrp_assign_serial_numbers stock.assign.serial form New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_immediate_production mrp.immediate.production.view.form mrp.immediate.production form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_consumption_warning_form Consumption Warning mrp.consumption.warning form New
view_mrp_document_form mrp.document.form mrp.document form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_backorder_form Create Backorder mrp.production.backorder form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_split_form Split Production mrp.production.split form New
view_mrp_production_split_multi_form mrp.production.split.multi.form mrp.production.split.multi form New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_form_inherit_mrp view.picking.form.inherit.mrp stock.picking xpath Inherits stock.view_picking_form
view_picking_type_form_inherit_mrp Operation Types stock.picking.type field Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_line_detailed_operation_tree_mrp stock.move.line.operations.tree.mrp stock.move.line xpath Inherits stock.view_stock_move_line_detailed_operation_tree
view_stock_move_line_operation_tree_finished stock.move.line.operation.tree.finished stock.move.line xpath Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_finished stock.move.operations.finished.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_move_operations_raw stock.move.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_warehouse_orderpoint_tree_editable_inherited_purchase stock.warehouse.orderpoint.tree.editable.inherit.purchase stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree_editable
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (57)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • active Boolean
    default=True args: 'Active'
  • allow_operation_dependencies Boolean
    help='Create operation level dependencies that will influence both planning and the status of work orders upon MO confirmation. If this feature is ticked, and nothing is specified, Odoo will assume that all operations can be started simultaneously.' args: 'Operation Dependencies'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='warning' help='Defines if you can consume more or less components than the quantity defined on the BoM:\n * Allowed: allowed for all manufacturing users.\n * Allowed with warning: allowed for all manufacturing users with summary of consumption differences when closing the manufacturing order.\n Note that in the case of component Manual Consumption, where consumption is registered manually exclusively, consumption warnings will still be issued when appropriate also.\n * Blocked: only a manager can close a manufacturing order when the BoM consumption is not respected.' required=True string='Flexible Consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'bom_id', 'Operations'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • possible_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If a product variant is defined the BOM is available only for this product.' index=True args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' help='This should be the smallest quantity that this product can be produced in. If the BOM contains operations, make sure the work center capacity is accurate.' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True args: 'product.template', 'Product'
  • product_uom_category_id Many2one
    related='product_tmpl_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit of Measure'
  • ready_to_produce Selection
    default='all_available' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • sequence Integer
    args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (11)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • copy(self, default=None)
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • name_get(self)
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty', 'product_id', 'product_tmpl_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • toggle_active(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' args: 'mrp.bom', 'BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product line (divided between the quantity produced).The total of all by-products' cost share must be less than or equal to 100." args: 'Cost Share (%)'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Unit of Measure'
  • sequence Integer
    args: 'Sequence'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • manual_consumption Boolean
    compute='_compute_manual_consumption' copy=True default=False help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' readonly=False store=True args: 'Manual Consumption'
  • manual_consumption_readonly Boolean
    compute='_compute_manual_consumption_readonly' args: 'Manual Consumption Readonly'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    index=True related='product_id.product_tmpl_id' store=True args: 'product.template', 'Product Template'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Product Unit of Measure'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
  • tracking Selection
    related='product_id.tracking'
Public methods (4)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (4)
  • consumption Selection
    compute='_compute_consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • mrp_consumption_warning_line_ids One2many → mrp.consumption.warning.line
    args: 'mrp.consumption.warning.line', 'mrp_consumption_warning_id'
  • mrp_production_count Integer
    compute='_compute_mrp_production_count'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (3)
  • action_cancel(self)
  • action_confirm(self)
  • action_set_qty(self)

New fields (7)
  • consumption Selection
    related='mrp_production_id.consumption'
  • mrp_consumption_warning_id Many2one → mrp.consumption.warning
    ondelete='cascade' readonly=True required=True args: 'mrp.consumption.warning', 'Parent Wizard'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • product_consumed_qty_uom Float
    readonly=True args: 'Consumed'
  • product_expected_qty_uom Float
    readonly=True args: 'To Consume'
  • product_id Many2one → product.product
    readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (2)
  • copy(self, default=None)
  • unlink(self)

New fields (3)
  • immediate_production_line_ids One2many → mrp.immediate.production.line
    string='Immediate Production Lines' args: 'mrp.immediate.production.line', 'immediate_production_id'
  • mo_ids Many2many → mrp.production
    args: 'mrp.production', 'mrp_production_production_rel'
  • show_productions Boolean
    compute='_compute_show_production'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (3)
  • immediate_production_id Many2one → mrp.immediate.production
    required=True args: 'mrp.immediate.production', 'Immediate Production'
  • production_id Many2one → mrp.production
    required=True args: 'mrp.production', 'Production'
  • to_immediate Boolean
    args: 'To Process'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (71)
  • allow_workorder_dependencies Boolean
    args: 'Allow Work Order Dependencies'
  • backorder_sequence Integer
    copy=False default=0 help='Backorder sequence, if equals to 0 means there is not related backorder' args: 'Backorder Sequence'
  • bom_id Many2one → mrp.bom
    check_company=True compute='_compute_bom_id' domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bill of Materials allow you to define the list of required components to make a finished product.' precompute=True readonly=False store=True args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • components_availability Char
    compute='_compute_components_availability' help="Latest component availability status for this MO. If green, then the MO's readiness status is ready, as per BOM configuration." string='Component Status'
  • components_availability_state Selection
    compute='_compute_components_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • confirm_cancel Boolean
    compute='_compute_confirm_cancel'
  • consumption Selection
    default='flexible' readonly=True required=True args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • date_deadline Datetime
    compute='_compute_date_deadline' copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' readonly=True store=True args: 'Deadline'
  • date_finished Datetime
    copy=False readonly=True args: 'End Date'
  • date_planned_finished Datetime
    compute='_compute_date_planned_finished' copy=False help='Date at which you plan to finish the production.' store=True args: 'Scheduled End Date'
  • date_planned_start Datetime
    copy=False default=_get_default_date_planned_start help='Date at which you plan to start the production.' index=True required=True args: 'Scheduled Date'
  • date_start Datetime
    copy=False readonly=True args: 'Start Date'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • forecasted_issue Boolean
    compute='_compute_forecasted_issue'
  • is_locked Boolean
    copy=False default=_get_default_is_locked args: 'Is Locked'
  • is_planned Boolean
    compute='_compute_is_planned' store=True args: 'Its Operations are Planned'
  • 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_locations' domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will stock the finished products.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    check_company=True compute='_compute_locations' domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will look for components.' precompute=True readonly=False required=True store=True args: 'stock.location', 'Components Location'
  • lot_producing_id Many2one → stock.lot
    check_company=True copy=False domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" string='Lot/Serial Number' args: 'stock.lot'
  • move_byproduct_ids One2many → stock.move
    compute='_compute_move_byproduct_ids' inverse='_set_move_byproduct_ids' args: 'stock.move'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    compute='_compute_move_finished_ids' copy=False domain=[('scrapped', '=', False)] readonly=False store=True args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    compute='_compute_move_raw_ids' copy=False domain=[('scrapped', '=', False)] readonly=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'stock.move', 'raw_material_production_id', 'Components'
  • mrp_production_backorder_count Integer
    compute='_compute_mrp_production_backorder' args: 'Count of linked backorder'
  • mrp_production_child_count Integer
    compute='_compute_mrp_production_child_count' args: 'Number of generated MO'
  • mrp_production_source_count Integer
    compute='_compute_mrp_production_source_count' args: 'Number of source MO'
  • name Char
    copy=False readonly=True args: 'Reference'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    copy=False index='btree_not_null' args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True compute='_compute_picking_type_id' copy=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" index=True precompute=True readonly=False required=True store=True args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' help='Components will be reserved first for the MO with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_description_variants Char
    args: 'Custom Description'
  • product_id Many2one → product.product
    check_company=True compute='_compute_product_id' copy=True domain="[\n ('type', 'in', ['product', 'consu']),\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id)\n ]\n " precompute=True readonly=True required=True states={'draft': [('readonly', False)]} store=True args: 'product.product', 'Product'
  • product_qty Float
    compute='_compute_product_qty' copy=True default=1.0 digits='Product Unit of Measure' readonly=False required=True store=True tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    compute='_compute_uom_id' copy=True domain="[('category_id', '=', product_uom_category_id)]" precompute=True readonly=False required=True store=True args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • product_variant_attributes Many2many → product.template.attribute.value
    related='product_id.product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • production_capacity Float
    compute='_compute_production_capacity' help='Quantity that can be produced with the current stock of components'
  • production_duration_expected Float
    compute='_compute_production_duration_expected' help='Total expected duration (in minutes)' args: 'Expected Duration'
  • production_location_id Many2one → stock.location
    compute='_compute_production_location' store=True args: 'stock.location', 'Production Location'
  • production_real_duration Float
    compute='_compute_production_real_duration' help='Total real duration (in minutes)' args: 'Real Duration'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • qty_producing Float
    copy=False digits='Product Unit of Measure' string='Quantity Producing'
  • reservation_state Selection
    compute='_compute_reservation_state' copy=False help='Manufacturing readiness for this MO, as per bill of material configuration:\n * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n' index=True readonly=True store=True string='MO Readiness' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • reserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can reserve quantities' args: 'Allowed to Reserve Production'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_allocation Boolean
    compute='_compute_show_allocation' help='Technical Field used to decide whether the button "Allocation" should be displayed.'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • show_lock Boolean
    compute='_compute_show_lock' args: 'Show Lock/unlock buttons'
  • show_lot_ids Boolean
    compute='_compute_show_lot_ids' args: 'Display the serial number shortcut on the moves'
  • show_serial_mass_produce Boolean
    compute='_compute_show_serial_mass_produce' args: 'Display the serial mass produce wizard action'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unbuild_count Integer
    compute='_compute_unbuild_count' string='Number of Unbuilds'
  • unbuild_ids One2many → mrp.unbuild
    args: 'mrp.unbuild', 'mo_id', 'Unbuilds'
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Production'
  • use_auto_consume_components_lots Boolean
    related='picking_type_id.use_auto_consume_components_lots'
  • use_create_components_lots Boolean
    related='picking_type_id.use_create_components_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.users', 'Responsible'
  • warehouse_id Many2one
    related='location_src_id.warehouse_id'
  • workorder_ids One2many → mrp.workorder
    compute='_compute_workorder_ids' copy=True readonly=False store=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (28)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_confirm(self)
  • action_generate_serial(self)
  • action_merge(self)
  • action_product_forecast_report(self)
  • action_see_move_scrap(self)
  • action_serial_mass_produce_wizard(self)
  • action_split(self)
  • action_toggle_is_locked(self)
  • action_view_mo_delivery(self)
    Returns an action that display picking related to manufacturing order. It can either be a list view or in a form view (if there is only one picking to show).
  • action_view_mrp_production_backorders(self)
  • action_view_mrp_production_childs(self)
  • action_view_mrp_production_sources(self)
  • action_view_mrp_production_unbuilds(self)
  • action_view_reception_report(self)
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unbuild(self)
  • button_unplan(self)
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • do_unreserve(self)
  • get_empty_list_help(self, help)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (3)
  • mrp_production_backorder_line_ids One2many → mrp.production.backorder.line
    string='Backorder Confirmation Lines' args: 'mrp.production.backorder.line', 'mrp_production_backorder_id'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
  • show_backorder_lines Boolean
    compute='_compute_show_backorder_lines' args: 'Show backorder lines'
Public methods (2)
  • action_backorder(self)
  • action_close_mo(self)

New fields (3)
  • mrp_production_backorder_id Many2one → mrp.production.backorder
    ondelete='cascade' required=True args: 'mrp.production.backorder', 'MO Backorder'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (9)
  • counter Integer
    compute='_compute_counter' default=0 readonly=False store=True args: 'Split #'
  • product_id Many2one
    related='production_id.product_id'
  • product_qty Float
    related='production_id.product_qty'
  • product_uom_id Many2one
    related='production_id.product_uom_id'
  • production_capacity Float
    related='production_id.production_capacity'
  • production_detailed_vals_ids One2many → mrp.production.split.line
    compute='_compute_details' readonly=False store=True args: 'mrp.production.split.line', 'mrp_production_split_id', 'Split Details'
  • production_id Many2one → mrp.production
    readonly=True args: 'mrp.production', 'Manufacturing Order'
  • production_split_multi_id Many2one → mrp.production.split.multi
    args: 'mrp.production.split.multi', 'Split Productions'
  • valid_details Boolean
    compute='_compute_valid_details' args: 'Valid'
Public methods (3)
  • action_prepare_split(self)
  • action_return_to_list(self)
  • action_split(self)

New fields (4)
  • date Datetime
    args: 'Schedule Date'
  • mrp_production_split_id Many2one → mrp.production.split
    ondelete='cascade' required=True args: 'mrp.production.split', 'Split Production'
  • quantity Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
  • user_id Many2one → res.users
    domain=<expr> args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (1)
  • production_ids One2many → mrp.production.split
    args: 'mrp.production.split', 'production_split_multi_id', 'Productions To Split'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (22)
  • active Boolean
    default=True
  • allow_operation_dependencies Boolean
    related='bom_id.allow_operation_dependencies'
  • blocked_by_operation_ids Many2many → mrp.routing.workcenter
    column1='operation_id' column2='blocked_by_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that need to be completed before this operation can start.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocked By' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    check_company=True index=True ondelete='cascade' required=True args: 'mrp.bom', 'Bill of Material'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one → res.company
    related='bom_id.company_id' args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • needed_by_operation_ids Many2many → mrp.routing.workcenter
    column1='blocked_by_id' column2='operation_id' copy=False domain="[('allow_operation_dependencies', '=', True), ('id', '!=', id), ('bom_id', '=', bom_id)]" help='Operations that cannot start before this operation is completed.' relation='mrp_routing_workcenter_dependencies_rel' string='Blocks' args: 'mrp.routing.workcenter'
  • note Html
    args: 'Description'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_computed_on Char
    compute='_compute_time_computed_on' args: 'Computed on last'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help="Time in minutes:- In manual mode, time used- In automatic mode, supposed first time when there aren't any work orders yet" args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' args: [('auto', 'Compute based on tracked time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'PDF'
  • worksheet_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • worksheet_type Selection
    default='text' string='Worksheet' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
Public methods (4)
  • action_archive(self)
  • copy_existing_operations(self)
  • copy_to_bom(self)
  • write(self, values)

New fields (15)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]\n" states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)]} args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where you want to send the components resulting from the unbuild order.' precompute=True readonly=False required=True states={'done': [('readonly', True)]} store=True args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True compute='_compute_location_id' domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the product you want to unbuild is.' precompute=True readonly=False required=True states={'done': [('readonly', True)]} store=True args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" args: 'stock.lot', 'Lot/Serial Number'
  • mo_bom_id Many2one → mrp.bom
    related='mo_id.bom_id' args: 'mrp.bom', 'Bill of Material used on the Production Order'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', '=', 'done'), ('company_id', '=', company_id), ('product_id', '=?', product_id), ('bom_id', '=?', bom_id)]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    compute='_compute_product_uom_id' precompute=True readonly=False required=True states={'done': [('readonly', True)]} store=True args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (3)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (30)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity_ids One2many → mrp.workcenter.capacity
    copy=True help='Specific number of pieces that can be produced in parallel per product.' string='Product Capacities' args: 'mrp.workcenter.capacity', 'workcenter_id'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Hourly processing cost.' string='Cost per hour'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' required=True args: 'res.currency', 'Currency'
  • default_capacity Float
    default=1.0 help='Default number of pieces (in product UoM) that can be produced in parallel (at the same time) at this work center. For example: the capacity is 5 and you need to produce 10 units, then the operation time listed on the BOM will be multiplied by two. However, note that both time before and after production will only be counted once.' args: 'Capacity'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Html
    args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • tag_ids Many2many → mrp.workcenter.tag
    args: 'mrp.workcenter.tag'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    args: 'Setup Time'
  • time_stop Float
    args: 'Cleanup Time'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (6)
  • action_archive(self)
  • action_show_operations(self)
  • action_work_order(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (6)
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel for this product.' args: 'Capacity'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • time_start Float
    help='Additional time in minutes for the setup.' args: 'Setup Time (minutes)'
  • time_stop Float
    help='Additional time in minutes for the cleaning.' args: 'Cleanup Time (minutes)'
  • workcenter_id Many2one → mrp.workcenter
    required=True string='Work Center' args: 'mrp.workcenter'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness'
  • production_id Many2one → mrp.production
    readonly=True related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True index=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True index=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (1)
  • name_get(self)
    @api.depends('loss_type')
    As 'category' field in form view is a Many2one, its value will be in lower case. In order to display its value capitalized 'name_get' is overrided.

New fields (2)
  • color Integer
    default=_get_default_color args: 'Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (52)
  • allow_workorder_dependencies Boolean
    related='production_id.allow_workorder_dependencies'
  • blocked_by_workorder_ids Many2many → mrp.workorder
    column1='workorder_id' column2='blocked_by_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocked By' args: 'mrp.workorder'
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    related='production_id.consumption'
  • costs_hour Float
    default=0.0 group_operator='avg' string='Cost per hour'
  • date_finished Datetime
    copy=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'End Date'
  • date_planned_finished Datetime
    compute='_compute_dates_planned' copy=False inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Scheduled End Date'
  • date_planned_start Datetime
    compute='_compute_dates_planned' copy=False inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Scheduled Start Date'
  • date_start Datetime
    copy=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Start Date'
  • duration Float
    compute='_compute_duration' copy=False inverse='_set_duration' readonly=False store=True args: 'Real Duration'
  • duration_expected Float
    compute='_compute_duration_expected' digits=(16, 2) readonly=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_id Many2one → stock.lot
    check_company=True compute='_compute_finished_lot_id' domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" inverse='_set_finished_lot_id' search='_search_finished_lot_id' string='Lot/Serial Number' args: 'stock.lot'
  • is_planned Boolean
    related='production_id.is_planned'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' args: 'Is the Current User Working'
  • json_popover Char
    compute='_compute_json_popover' args: 'Popover Data JSON'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True copy=False help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • needed_by_workorder_ids Many2many → mrp.workorder
    column1='blocked_by_id' column2='workorder_id' copy=False domain="[('allow_workorder_dependencies', '=', True), ('id', '!=', id), ('production_id', '=', production_id)]" relation='mrp_workorder_dependencies_rel' string='Blocks' args: 'mrp.workorder'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation'
  • operation_note Html
    readonly=True related='operation_id.note' args: 'Description'
  • product_id Many2one
    check_company=True readonly=True related='production_id.product_id' store=True
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Unit of Measure'
  • production_availability Selection
    readonly=True related='production_id.reservation_state' store=True string='Stock Availability'
  • production_bom_id Many2one → mrp.bom
    related='production_id.bom_id' args: 'mrp.bom'
  • production_date Datetime
    related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    check_company=True readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    readonly=True related='production_id.state' string='Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    copy=False default=0.0 digits='Product Unit of Measure' help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    compute='_compute_qty_producing' digits='Product Unit of Measure' inverse='_set_qty_producing' string='Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit of Measure' args: 'Quantity To Be Produced'
  • qty_reported_from_previous_wo Float
    copy=False digits='Product Unit of Measure' help='The quantity already produced awaiting allocation in the backorders chain.' args: 'Carried Quantity'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • show_json_popover Boolean
    compute='_compute_json_popover' args: 'Show Popover?'
  • state Selection
    compute='_compute_state' copy=False default='pending' index=True readonly=True recursive=True store=True string='Status' args: [('pending', 'Waiting for another WO'), ('waiting', 'Waiting for components'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    copy=False args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)], 'progress': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    related='workcenter_id.working_state' string='Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
  • worksheet_google_slide Char
    readonly=True related='operation_id.worksheet_google_slide' args: 'Worksheet URL'
  • worksheet_type Selection
    readonly=True related='operation_id.worksheet_type' string='Worksheet Type'
Public methods (18)
  • action_cancel(self)
  • action_open_wizard(self)
  • action_replan(self)
    Replan a work order. It actually replans every "ready" or "pending" work orders of the linked manufacturing orders.
  • action_see_move_scrap(self)
  • button_done(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self)
  • button_unblock(self)
  • create(self, values)
    @api.model_create_multi
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • gantt_unavailability(self, start_date, end_date, scale, group_bys=None, rows=None)
    @api.model
    Get unavailabilities data to display in the Gantt view.
  • get_working_duration(self)
    Get the additional duration for 'open times' i.e. productivity lines with no date_end.
  • name_get(self)
  • unlink(self)
  • write(self, values)

New fields (1)
  • mrp_production_ids One2many → mrp.production
    args: 'mrp.production', 'procurement_group_id'
Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit of Measure' args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (8)
  • action_archive(self)
  • action_compute_bom_days(self)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise
  • write(self, values)

New fields (8)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • days_to_prepare_mo Float
    default=0.0 help='Create and confirm Manufacturing Orders this many days in advance, to have enough time to replenish components or manufacture semi-finished products.\nNote that security lead times will also be considered when appropriate.' string='Days to prepare Manufacturing Order'
  • is_kits Boolean
    compute='_compute_is_kits' search='_search_is_kits'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False digits='Product Unit of Measure' args: 'Manufactured'
  • produce_delay Float
    default=0.0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added. In case the product is subcontracted, this can be used to determine the date at which components should be sent to the subcontractor.' args: 'Manufacturing Lead Time'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (5)
  • action_archive(self)
  • action_compute_bom_days(self)
  • action_used_in_bom(self)
  • action_view_mos(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (2)
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_warehouses(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (1)
  • create_missing_unbuild_sequences(self)
    @api.model

New fields (13)
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_reception_report Boolean
    implied_group='mrp.group_mrp_reception_report' args: 'Allocation Report for Manufacturing Orders'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • group_mrp_workorder_dependencies Boolean
    implied_group='mrp.group_mrp_workorder_dependencies' args: 'Work Order Dependencies'
  • group_unlocked_by_default Boolean
    implied_group='mrp.group_unlocked_by_default' args: 'Unlock Manufacturing Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_mrp_workorder Boolean
    args: 'Work Orders'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (1)
  • set_values(self)

New fields (7)
  • expected_qty Float
    digits='Product Unit of Measure' args: 'Expected Quantity'
  • multiple_lot_components_names Text
  • produced_qty Float
    digits='Product Unit of Measure' args: 'Produced Quantity'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial_numbers Text
    args: 'Produced Serial Numbers'
  • show_apply Boolean
  • show_backorders Boolean
Public methods (4)
  • apply(self)
  • create_backorder(self)
  • generate_serial_numbers_production(self)
  • no_backorder(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='raw_material_production_id.bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product. The total of all by-products' cost share must be smaller or equal to 100." args: 'Cost Share (%)'
  • created_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Created Production Order'
  • description_bom_line Char
    compute='_compute_description_bom_line' args: 'Kit'
  • is_done Boolean
    compute='_compute_is_done' store=True args: 'Done'
  • manual_consumption Boolean
    compute='_compute_manual_consumption' help='When activated, then the registration of consumption for that component is recorded manually exclusively.\nIf not activated, and any of the components consumption is edited manually on the manufacturing order, Odoo assumes manual consumption also.' store=True args: 'Manual Consumption'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_id Many2one → stock.lot
    index='btree_not_null' related='raw_material_production_id.lot_producing_id' store=True string='Finished Lot/Serial Number' args: 'stock.lot'
  • product_qty_available Float
    depends=['product_id'] related='product_id.qty_available' args: 'Product On Hand Quantity'
  • product_virtual_available Float
    depends=['product_id'] related='product_id.virtual_available' args: 'Product Forecasted Quantity'
  • production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True index='btree_not_null' args: 'mrp.production', 'Production Order for components'
  • should_consume_qty Float
    compute='_compute_should_consume_qty' digits='Product Unit of Measure' args: 'Quantity To Consume'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    compute='_compute_unit_factor' store=True args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True copy=False args: 'mrp.workorder', 'Work Order To Consume'
Public methods (6)
  • action_explode(self)
    Explodes pickings
  • action_open_reference(self)
  • action_show_details(self)
  • create(self, vals_list)
    @api.model_create_multi
    Enforce consistent values (i.e. match _get_move_raw_values/_get_move_finished_values) for: - Manually added components/byproducts specifically values we can't set via view with "default_" - Moves from a copied MO - Backorders
  • default_get(self, fields_list)
    @api.model
  • write(self, vals)

New fields (3)
  • description_bom_line Char
    related='move_id.description_bom_line'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • create(self, values)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • has_kits Boolean
    compute='_compute_has_kits'
Public methods (0)

No public methods.

New fields (6)
  • code Selection
    ondelete={'mrp_operation': 'cascade'} selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • use_auto_consume_components_lots Boolean
    help='Allow automatic consumption of tracked components that are reserved' string='Consume Reserved Lots/Serial Numbers automatically'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (1)
  • action_apply_inventory(self)

New fields (1)
  • action Selection
    ondelete={'manufacture': 'cascade'} selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    check_company=True states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='Produce : Move the components to the production location directly and start the manufacturing process.\nPick / Produce : Unload the components from the Stock to Input location first, and then transfer it to the Production location.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components and then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture and then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.route
    ondelete='restrict' args: 'stock.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (3)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]" string='Bill of Materials' args: 'mrp.bom'
  • manufacturing_visibility_days Float
    default=0.0 help='Visibility Days applied on the manufacturing routes.'
  • show_bom Boolean
    compute='_compute_show_bom' args: 'Show BoM column'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, Géry Debongnie, Aaron Bohy, GitHub, Wolfgang Taferner, Yannick Tivisse, Adrien Dieudonne, Christophe Monniez, Jairo Llopis, Arnold Moyaux, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Fanny He, William Henrotin, Sébastien Theys, Nasreddin (bon), alt-odoo, Julien Mougenot, svs-odoo, Alvaro Fuentes, Achraf (abz), Adrien Widart, Ivan Yelizariev, Nasreddin Boulif (bon), Touati Djamel (otd), Nicolas Galler, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Rémy Voet (ryv), Ivàn Todorovich, Mathieu Duckerts-Antoine, Aurélien (avd), Yann Papouin, Kevin Baptiste, Guillaume (guva), odoo, Stefan-Calin Crainiciuc (stcc), roen-odoo, Hubert Van de Walle (huvw), Miquel Raïch, Bruno-brsy, william-andre, Florian Damhaut, MerlinGuillaume, David (dafr), JF Aubert, PNO, yhu-odoo, nouraellm, thcl-odoo, diagnoza, JordiMForgeFlow, Walid HANNICHE (waha), Yolann Sabaux, Abdelouahab (abla), Swapnesh, Jinjiu Liu, Aurelien van Delft (avd), Michael Mattiello (mcm), dht-odoo, AaronHForgeFlow, Himanshu Domadiya, Graeme Gellatly, alsh-odoo, Matheus Leal Viana (malv), Louis Wicket (wil), Walid, Adrien Widart (awt), althaf shaik, clesgow, Michele, Djamel Touati, Pieter Claeys (clpi), Nicolas Pierre, Qiuyu (QHO), Jinane Maksoud, ノウラ, paso-odoo, Francesco Ballerini, CarmenMiranda, Martin Maes, Vikash Tiwari, Ahmed Khalaf, Leonardo Pavan Rocha, Sarah Bellefroid, Zelong Lin, Mattis Megevand, Aurelien MARIE (auma), debu-odoo, kado-odoo, Linh Pham, Dustin Hoang, Leanhdung2881999
WEBSITE
WEBSITEhttps://www.odoo.com/app/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - stock
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (98)
XML IDNameModelTypeStatus
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_product_product_search_view mrp.product.product.search product.product xpath Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template xpath Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_editable_view mrp.production.work.order.tree.editable mrp.workorder tree New
mrp_production_workorder_tree_view mrp.production.work.order.tree mrp.workorder xpath Inherits mrp.mrp_production_workorder_tree_editable_view
mrp_report_product_product_replenishment mrp_report_product_product_replenishment ir.ui.view qweb Inherits stock.report_product_product_replenishment
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_workcenter_bom_tree_view mrp.routing.workcenter.bom.tree mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_copy_to_bom_tree_view mrp.routing.workcenter.copy_to_bom.tree mrp.routing.workcenter xpath Inherits mrp_routing_workcenter_tree_view
mrp_routing_workcenter_filter mrp.routing.workcenter.filter mrp.routing.workcenter search New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_form_view_simplified mrp.unbuild.form.simplified mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template xpath Inherits stock.product_template_form_view_procurement_button
production_message production_message ir.ui.view qweb New
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb New
report_mrp_bom_pdf report_mrp_bom_pdf ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_byproduct_line report_mrp_byproduct_line ir.ui.view qweb New
report_mrp_operation_line report_mrp_operation_line ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
report_reception_report_label_mrp report_reception_report_label_mrp ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_report_delivery_document_inherit_mrp stock_report_delivery_document_inherit_mrp ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_kit_sections stock_report_delivery_kit_sections ir.ui.view qweb New
stock_report_delivery_no_kit_section stock_report_delivery_no_kit_section ir.ui.view qweb New
stock_scrap_search_view_inherit_mrp stock.scrap.search.inherit.mrp stock.scrap xpath Inherits stock.stock_scrap_search_view
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_assign_serial_numbers_production mrp_assign_serial_numbers stock.assign.serial form New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_immediate_production mrp.immediate.production.view.form mrp.immediate.production form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_consumption_warning_form Consumption Warning mrp.consumption.warning form New
view_mrp_document_form mrp.document.form mrp.document form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_backorder_form Create Backorder mrp.production.backorder form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_form_inherit_mrp view.picking.form.inherit.mrp stock.picking xpath Inherits stock.view_picking_form
view_picking_type_form_inherit_mrp Operation Types stock.picking.type field Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_line_detailed_operation_tree_mrp stock.move.line.operations.tree.mrp stock.move.line xpath Inherits stock.view_stock_move_line_detailed_operation_tree
view_stock_move_line_operation_tree_finished stock.move.line.operation.tree.finished stock.move.line xpath Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_finished stock.move.operations.finished.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_move_operations_raw stock.move.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_warehouse_orderpoint_tree_editable_inherited_purchase stock.warehouse.orderpoint.tree.editable.inherit.purchase stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree_editable
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (53)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (17)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the bills of material without removing it.' args: 'Active'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='warning' help='Defines if you can consume more or less components than the quantity defined on the BoM:\n * Allowed: allowed for all manufacturing users.\n * Allowed with warning: allowed for all manufacturing users with summary of consumption differences when closing the manufacturing order.\n * Blocked: only a manager can close a manufacturing order when the BoM consumption is not respected.' required=True string='Flexible Consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'bom_id', 'Operations'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • possible_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If a product variant is defined the BOM is available only for this product.' index=True args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Unit of Measure' help='This should be the smallest quantity that this product can be produced in. If the BOM contains operations, make sure the work center capacity is accurate.' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True args: 'product.template', 'Product'
  • product_uom_category_id Many2one
    related='product_tmpl_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit of Measure'
  • ready_to_produce Selection
    default='all_available' help='Defines when a Manufacturing Order is considered as ready to be started' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • sequence Integer
    help='Gives the sequence order when displaying a list of bills of material.' args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (11)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • copy(self, default=None)
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • name_get(self)
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • toggle_active(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' args: 'mrp.bom', 'BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product line (divided between the quantity produced).The total of all by-products' cost share must be less than or equal to 100." args: 'Cost Share (%)'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" required=True args: 'uom.uom', 'Unit of Measure'
  • sequence Integer
    args: 'Sequence'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (16)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    index=True related='product_id.product_tmpl_id' store=True args: 'product.template', 'Product Template'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Product Unit of Measure'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
Public methods (4)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (4)
  • consumption Selection
    compute='_compute_consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • mrp_consumption_warning_line_ids One2many → mrp.consumption.warning.line
    args: 'mrp.consumption.warning.line', 'mrp_consumption_warning_id'
  • mrp_production_count Integer
    compute='_compute_mrp_production_count'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (2)
  • action_cancel(self)
  • action_confirm(self)

New fields (7)
  • consumption Selection
    related='mrp_production_id.consumption'
  • mrp_consumption_warning_id Many2one → mrp.consumption.warning
    ondelete='cascade' readonly=True required=True args: 'mrp.consumption.warning', 'Parent Wizard'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • product_consumed_qty_uom Float
    readonly=True args: 'Consumed'
  • product_expected_qty_uom Float
    readonly=True args: 'To Consume'
  • product_id Many2one → product.product
    readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    help='Gives the sequence order when displaying a list of MRP documents.' string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (2)
  • copy(self, default=None)
  • unlink(self)

New fields (3)
  • immediate_production_line_ids One2many → mrp.immediate.production.line
    string='Immediate Production Lines' args: 'mrp.immediate.production.line', 'immediate_production_id'
  • mo_ids Many2many → mrp.production
    args: 'mrp.production', 'mrp_production_production_rel'
  • show_productions Boolean
    compute='_compute_show_production'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (3)
  • immediate_production_id Many2one → mrp.immediate.production
    required=True args: 'mrp.immediate.production', 'Immediate Production'
  • production_id Many2one → mrp.production
    required=True args: 'mrp.production', 'Production'
  • to_immediate Boolean
    args: 'To Process'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (63)
  • backorder_sequence Integer
    copy=False default=0 help='Backorder sequence, if equals to 0 means there is not related backorder' args: 'Backorder Sequence'
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bill of Materials allow you to define the list of required components to make a finished product.' readonly=True states={'draft': [('readonly', False)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • components_availability Char
    compute='_compute_components_availability' help="Latest component availability status for this MO. If green, then the MO's readiness status is ready, as per BOM configuration." string='Component Status'
  • components_availability_state Selection
    compute='_compute_components_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • confirm_cancel Boolean
    compute='_compute_confirm_cancel'
  • consumption Selection
    default='flexible' readonly=True required=True args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • date_deadline Datetime
    compute='_compute_date_deadline' copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' inverse='_set_date_deadline' readonly=True store=True args: 'Deadline'
  • date_finished Datetime
    copy=False help='Date when the MO has been close' readonly=True args: 'End Date'
  • date_planned_finished Datetime
    copy=False default=_get_default_date_planned_finished help='Date at which you plan to finish the production.' args: 'Scheduled End Date'
  • date_planned_start Datetime
    copy=False default=_get_default_date_planned_start help='Date at which you plan to start the production.' index=True required=True args: 'Scheduled Date'
  • date_start Datetime
    copy=False help='Date of the WO' readonly=True args: 'Start Date'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • forecasted_issue Boolean
    compute='_compute_forecasted_issue'
  • is_locked Boolean
    copy=False default=_get_default_is_locked args: 'Is Locked'
  • is_planned Boolean
    compute='_compute_is_planned' store=True args: 'Its Operations are Planned'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True default=_get_default_location_dest_id domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will stock the finished products.' readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    check_company=True default=_get_default_location_src_id domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will look for components.' readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Components Location'
  • lot_producing_id Many2one → stock.production.lot
    check_company=True copy=False domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" string='Lot/Serial Number' args: 'stock.production.lot'
  • move_byproduct_ids One2many → stock.move
    compute='_compute_move_byproduct_ids' inverse='_set_move_byproduct_ids' args: 'stock.move'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'raw_material_production_id', 'Components'
  • mrp_production_backorder_count Integer
    compute='_compute_mrp_production_backorder' args: 'Count of linked backorder'
  • mrp_production_child_count Integer
    compute='_compute_mrp_production_child_count' args: 'Number of generated MO'
  • mrp_production_source_count Integer
    compute='_compute_mrp_production_source_count' args: 'Number of source MO'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    copy=False index=True args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True default=_get_default_picking_type domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' help='Components will be reserved first for the MO with the highest priorities.' string='Priority' args: PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_description_variants Char
    args: 'Custom Description'
  • product_id Many2one → product.product
    check_company=True domain="[\n ('type', 'in', ['product', 'consu']),\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id)\n ]\n " readonly=True required=True states={'draft': [('readonly', False)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' readonly=True required=True states={'draft': [('readonly', False)]} tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" readonly=True required=True states={'draft': [('readonly', False)]} args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • production_duration_expected Float
    compute='_compute_production_duration_expected' help='Total expected duration (in minutes)' args: 'Expected Duration'
  • production_location_id Many2one → stock.location
    compute='_compute_production_location' store=True args: 'stock.location', 'Production Location'
  • production_real_duration Float
    compute='_compute_production_real_duration' help='Total real duration (in minutes)' args: 'Real Duration'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • qty_producing Float
    copy=False digits='Product Unit of Measure' string='Quantity Producing'
  • reservation_state Selection
    compute='_compute_reservation_state' copy=False help='Manufacturing readiness for this MO, as per bill of material configuration:\n * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n' index=True readonly=True store=True string='MO Readiness' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • reserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can reserve quantities' args: 'Allowed to Reserve Production'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • show_lock Boolean
    compute='_compute_show_lock' args: 'Show Lock/unlock buttons'
  • show_lot_ids Boolean
    compute='_compute_show_lot_ids' args: 'Display the serial number shortcut on the moves'
  • show_serial_mass_produce Boolean
    compute='_compute_show_serial_mass_produce' args: 'Display the serial mass product wizard action moves'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Production'
  • use_create_components_lots Boolean
    related='picking_type_id.use_create_components_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.users', 'Responsible'
  • workorder_ids One2many → mrp.workorder
    copy=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (23)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_confirm(self)
  • action_generate_serial(self)
  • action_product_forecast_report(self)
  • action_see_move_scrap(self)
  • action_serial_mass_produce_wizard(self)
  • action_toggle_is_locked(self)
  • action_view_mo_delivery(self)
    This function returns an action that display picking related to manufacturing order orders. It can either be a in a list or in a form view, if there is only one picking to show.
  • action_view_mrp_production_backorders(self)
  • action_view_mrp_production_childs(self)
  • action_view_mrp_production_sources(self)
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unbuild(self)
  • button_unplan(self)
  • copy_data(self, default=None)
  • create(self, values)
    @api.model
  • do_unreserve(self)
  • get_empty_list_help(self, help)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (3)
  • mrp_production_backorder_line_ids One2many → mrp.production.backorder.line
    string='Backorder Confirmation Lines' args: 'mrp.production.backorder.line', 'mrp_production_backorder_id'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
  • show_backorder_lines Boolean
    compute='_compute_show_backorder_lines' args: 'Show backorder lines'
Public methods (2)
  • action_backorder(self)
  • action_close_mo(self)

New fields (3)
  • mrp_production_backorder_id Many2one → mrp.production.backorder
    ondelete='cascade' required=True args: 'mrp.production.backorder', 'MO Backorder'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • bom_id Many2one → mrp.bom
    check_company=True help='The Bill of Material this operation is linked to' index=True ondelete='cascade' required=True args: 'mrp.bom', 'Bill of Material'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • company_id Many2one → res.company
    related='bom_id.company_id' args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • note Html
    help='Text worksheet description' args: 'Description'
  • possible_bom_product_template_attribute_value_ids Many2many
    related='bom_id.possible_product_template_attribute_value_ids'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_computed_on Char
    compute='_compute_time_computed_on' args: 'Computed on last'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help="Time in minutes:- In manual mode, time used- In automatic mode, supposed first time when there aren't any work orders yet" args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' args: [('auto', 'Compute based on tracked time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'PDF'
  • worksheet_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • worksheet_type Selection
    default='text' help='Defines if you want to use a PDF or a Google Slide as work sheet.' string='Work Sheet' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
Public methods (2)
  • copy_to_bom(self)
  • write(self, values)

New fields (15)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]\n" states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)]} args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where you want to send the components resulting from the unbuild order.' required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the product you want to unbuild is.' required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" help='Lot/Serial Number of the product to unbuild.' states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial Number'
  • mo_bom_id Many2one → mrp.bom
    related='mo_id.bom_id' args: 'mrp.bom', 'Bill of Material used on the Production Order'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', '=', 'done'), ('company_id', '=', company_id), ('product_id', '=?', product_id), ('bom_id', '=?', bom_id)]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (3)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (28)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity Float
    default=1.0 help='Number of pieces (in product UoM) that can be produced in parallel (at the same time) at this work center. For example: the capacity is 5 and you need to produce 10 units, then the operation time listed on the BOM will be multiplied by two. However, note that both time before and after production will only be counted once.' args: 'Capacity'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Specify cost of work center per hour.' string='Cost per hour'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Html
    help='Description of the Work Center.' args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • tag_ids Many2many → mrp.workcenter.tag
    args: 'mrp.workcenter.tag'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    help='Time in minutes for the setup.' args: 'Setup Time'
  • time_stop Float
    help='Time in minutes for the cleaning.' args: 'Cleanup Time'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (6)
  • action_archive(self)
  • action_show_operations(self)
  • action_work_order(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness'
  • production_id Many2one → mrp.production
    readonly=True related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True index=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True index=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (1)
  • name_get(self)
    @api.depends('loss_type')
    As 'category' field in form view is a Many2one, its value will be in lower case. In order to display its value capitalized 'name_get' is overrided.

New fields (2)
  • color Integer
    default=_get_default_color args: 'Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (48)
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    related='production_id.consumption'
  • costs_hour Float
    default=0.0 group_operator='avg' help='Technical field to store the hourly cost of workcenter at time of work order completion (i.e. to keep a consistent cost).' string='Cost per hour'
  • date_finished Datetime
    copy=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'End Date'
  • date_planned_finished Datetime
    compute='_compute_dates_planned' copy=False inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Scheduled End Date'
  • date_planned_start Datetime
    compute='_compute_dates_planned' copy=False inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Scheduled Start Date'
  • date_start Datetime
    copy=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Start Date'
  • duration Float
    compute='_compute_duration' copy=False inverse='_set_duration' readonly=False store=True args: 'Real Duration'
  • duration_expected Float
    default=60.0 digits=(16, 2) help='Expected duration (in minutes)' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_id Many2one → stock.production.lot
    check_company=True compute='_compute_finished_lot_id' domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" inverse='_set_finished_lot_id' search='_search_finished_lot_id' string='Lot/Serial Number' args: 'stock.production.lot'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' help='Technical field indicating whether the current user is working. ' args: 'Is the Current User Working'
  • json_popover Char
    compute='_compute_json_popover' args: 'Popover Data JSON'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True copy=False help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • next_work_order_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Next Work Order'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation'
  • operation_note Html
    readonly=True related='operation_id.note' args: 'Description'
  • product_id Many2one
    check_company=True readonly=True related='production_id.product_id' store=True
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Unit of Measure'
  • production_availability Selection
    help='Technical: used in views and domains only.' readonly=True related='production_id.reservation_state' store=True string='Stock Availability'
  • production_bom_id Many2one → mrp.bom
    related='production_id.bom_id' args: 'mrp.bom'
  • production_date Datetime
    related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    check_company=True readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    help='Technical: used in views only.' readonly=True related='production_id.state' string='Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    copy=False default=0.0 digits='Product Unit of Measure' help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    compute='_compute_qty_producing' digits='Product Unit of Measure' inverse='_set_qty_producing' string='Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit of Measure' args: 'Quantity To Be Produced'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • show_json_popover Boolean
    compute='_compute_json_popover' args: 'Show Popover?'
  • state Selection
    compute='_compute_state' copy=False default='pending' index=True readonly=True store=True string='Status' args: [('pending', 'Waiting for another WO'), ('waiting', 'Waiting for components'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    copy=False args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)], 'progress': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    help='Technical: used in views only' related='workcenter_id.working_state' string='Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
  • worksheet_google_slide Char
    readonly=True related='operation_id.worksheet_google_slide' args: 'Worksheet URL'
  • worksheet_type Selection
    readonly=True related='operation_id.worksheet_type' string='Worksheet Type'
Public methods (17)
  • action_cancel(self)
  • action_open_wizard(self)
  • action_replan(self)
    Replan a work order. It actually replans every "ready" or "pending" work orders of the linked manufacturing orders.
  • action_see_move_scrap(self)
  • button_done(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self)
  • button_unblock(self)
  • create(self, values)
    @api.model_create_multi
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • gantt_unavailability(self, start_date, end_date, scale, group_bys=None, rows=None)
    @api.model
    Get unavailabilities data to display in the Gantt view.
  • name_get(self)
  • unlink(self)
  • write(self, values)

New fields (1)
  • mrp_production_ids One2many → mrp.production
    args: 'mrp.production', 'procurement_group_id'
Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' compute_sudo=True
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (7)
  • action_archive(self)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise
  • write(self, values)

New fields (7)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • is_kits Boolean
    compute='_compute_is_kits' compute_sudo=True
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False args: 'Manufactured'
  • produce_delay Float
    default=0.0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added.' args: 'Manufacturing Lead Time'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (4)
  • action_archive(self)
  • action_used_in_bom(self)
  • action_view_mos(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (4)
  • get_bom(self, bom_id=False, product_id=False, line_qty=False, line_id=False, level=False)
    @api.model
  • get_byproducts(self, bom_id=False, qty=0, level=0, total=0)
    @api.model
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_operations(self, product_id=False, bom_id=False, qty=0, level=0)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (1)
  • create_missing_unbuild_sequences(self)
    @api.model

New fields (11)
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • group_unlocked_by_default Boolean
    implied_group='mrp.group_unlocked_by_default' args: 'Unlock Manufacturing Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_mrp_workorder Boolean
    args: 'Work Orders'
  • module_quality_control Boolean
    args: 'Quality'
  • module_quality_control_worksheet Boolean
    args: 'Quality Worksheet'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (6)
  • expected_qty Float
    digits='Product Unit of Measure' args: 'Expected Quantity'
  • produced_qty Float
    digits='Product Unit of Measure' args: 'Produced Quantity'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial_numbers Text
    args: 'Produced Serial Numbers'
  • show_apply Boolean
    help='Technical field to show the Apply button'
  • show_backorders Boolean
    help='Technical field to show the Create Backorder and No Backorder buttons'
Public methods (4)
  • apply(self)
  • create_backorder(self)
  • generate_serial_numbers_production(self)
  • no_backorder(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • allowed_operation_ids One2many → mrp.routing.workcenter
    related='raw_material_production_id.bom_id.operation_ids' args: 'mrp.routing.workcenter'
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • cost_share Float
    digits=(5, 2) help="The percentage of the final production cost for this by-product. The total of all by-products' cost share must be smaller or equal to 100." args: 'Cost Share (%)'
  • created_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Created Production Order'
  • description_bom_line Char
    compute='_compute_description_bom_line' args: 'Kit'
  • is_done Boolean
    compute='_compute_is_done' help='Technical Field to order moves' store=True args: 'Done'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_ids Many2many → stock.production.lot
    compute='_compute_order_finished_lot_ids' string='Finished Lot/Serial Number' args: 'stock.production.lot'
  • product_qty_available Float
    depends=['product_id'] related='product_id.qty_available' args: 'Product On Hand Quantity'
  • product_virtual_available Float
    depends=['product_id'] related='product_id.virtual_available' args: 'Product Forecasted Quantity'
  • production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Production Order for components'
  • should_consume_qty Float
    compute='_compute_should_consume_qty' digits='Product Unit of Measure' args: 'Quantity To Consume'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    compute='_compute_unit_factor' store=True args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True copy=False args: 'mrp.workorder', 'Work Order To Consume'
Public methods (4)
  • action_explode(self)
    Explodes pickings
  • action_show_details(self)
  • default_get(self, fields_list)
    @api.model
  • write(self, vals)

New fields (3)
  • description_bom_line Char
    related='move_id.description_bom_line'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • create(self, values)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • has_kits Boolean
    compute='_compute_has_kits'
Public methods (0)

No public methods.

New fields (5)
  • code Selection
    ondelete={'mrp_operation': 'cascade'} selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_apply_inventory(self)

New fields (1)
  • action Selection
    ondelete={'manufacture': 'cascade'} selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    check_company=True states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True help='Not to restrict or prefer quants, but informative.' states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='Produce : Move the components to the production location directly and start the manufacturing process.\nPick / Produce : Unload the components from the Stock to Input location first, and then transfer it to the Production location.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components and then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture and then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (2)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]" string='Bill of Materials' args: 'mrp.bom'
  • show_bom Boolean
    compute='_compute_show_bom' args: 'Show BoM column'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, Aaron Bohy, Pedro M. Baeza, GitHub, Lucas Perais (lpe), Barad Mahendra, Wolfgang Taferner, Yannick Tivisse, Alexandre Kühn, Arnold Moyaux, Julien Castiaux, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Fanny He, William Henrotin, Sébastien Theys, Nasreddin (bon), alt-odoo, Florent de Labarre, Julien Mougenot, fw-bot, Anh Thao Pham (pta), Debauche Stéphane, svs-odoo, Lois Rilo, Alvaro Fuentes, Rémy Baranx (bar), Achraf (abz), Adrien Widart, Ivan Yelizariev, Touati Djamel (otd), Nicolas Galler, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Rémy Voet (ryv), Ivàn Todorovich, fja-odoo, Mathieu Duckerts-Antoine, Aurélien (avd), Kevin Baptiste, Pratima Gupta, Guillaume (guva), Stefan-Calin Crainiciuc (stcc), roen-odoo, Hubert Van de Walle (huvw), Miquel Raïch, Florian Damhaut, Hetal Dhanak, MerlinGuillaume, David (dafr), JF Aubert, PNO, Ankita Raval, yhu-odoo, nouraellm, thcl-odoo, JordiMForgeFlow, Abdelouahab (abla), Swapnesh, Hemali Bhimani, Jinjiu Liu, mightyjol (jhk), Himanshu Domadiya, ahenriquez, niyasraphy, Graeme Gellatly, Louis Wicket (wil), Walid, Adrien Widart (awt), althaf shaik, Michele, Pieter Claeys (clpi), ノウラ, paso-odoo, Francesco Ballerini, Borni DHIFI, rso-odoo, CarmenMiranda, Martin Maes, Vikash Tiwari, Ahmed Khalaf
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - stock
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (93)
XML IDNameModelTypeStatus
assets_backend mrp assets ir.ui.view qweb Inherits web.assets_backend
assets_common mrp bom common assets ir.ui.view qweb Inherits web.assets_common
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_product_product_search_view mrp.product.product.search product.product xpath Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template xpath Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_editable_view mrp.production.work.order.tree.editable mrp.workorder tree New
mrp_production_workorder_tree_view mrp.production.work.order.tree mrp.workorder xpath Inherits mrp.mrp_production_workorder_tree_editable_view
mrp_report_product_product_replenishment mrp_report_product_product_replenishment ir.ui.view qweb Inherits stock.report_product_product_replenishment
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_form_view_simplified mrp.unbuild.form.simplified mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template xpath Inherits stock.product_template_form_view_procurement_button
production_message production_message ir.ui.view qweb New
qunit_suite qunit_suite ir.ui.view qweb Inherits web.qunit_suite_tests
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb New
report_mrp_bom_pdf report_mrp_bom_pdf ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_operation_line report_mrp_operation_line ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_report_delivery_document_inherit_mrp stock_report_delivery_document_inherit_mrp ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_kit_sections stock_report_delivery_kit_sections ir.ui.view qweb New
stock_report_delivery_no_kit_section stock_report_delivery_no_kit_section ir.ui.view qweb New
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_immediate_production mrp.immediate.production.view.form mrp.immediate.production form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_consumption_warning_form Consumption Warning mrp.consumption.warning form New
view_mrp_document_form mrp.document.form mrp.document form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_backorder_form Create Backorder mrp.production.backorder form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_type_form_inherit_mrp Operation Types stock.picking.type field Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_line_operation_tree_finished stock.move.line.operation.tree.finished stock.move.line xpath Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_finished stock.move.operations.finished.form stock.move xpath Inherits stock.view_stock_move_operations
view_stock_move_operations_raw stock.move.operations.raw.form stock.move xpath Inherits stock.view_stock_move_operations
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_warehouse_orderpoint_tree_editable_inherited_purchase stock.warehouse.orderpoint.tree.editable.inherit.purchase stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree_editable
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (39)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (16)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the bills of material without removing it.' args: 'Active'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='warning' help='Defines if you can consume more or less components than the quantity defined on the BoM:\n * Allowed: allowed for all manufacturing users.\n * Allowed with warning: allowed for all manufacturing users with summary of consumption differences when closing the manufacturing order.\n * Blocked: only a manager can close a manufacturing order when the BoM consumption is not respected.' required=True string='Flexible Consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'bom_id', 'Operations'
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If a product variant is defined the BOM is available only for this product.' index=True args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True required=True args: 'product.template', 'Product'
  • product_uom_category_id Many2one
    related='product_tmpl_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit of Measure'
  • ready_to_produce Selection
    default='asap' help='Defines when a Manufacturing Order is considered as ready to be started' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • sequence Integer
    help='Gives the sequence order when displaying a list of bills of material.' args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (11)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • copy(self, default=None)
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • name_get(self)
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • unlink(self)

New fields (7)
  • allowed_operation_ids Many2many → mrp.routing.workcenter
    compute='_compute_allowed_operation_ids' args: 'mrp.routing.workcenter'
  • bom_id Many2one → mrp.bom
    ondelete='cascade' args: 'mrp.bom', 'BoM'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    required=True args: 'uom.uom', 'Unit of Measure'
Public methods (2)
  • onchange_product_id(self)
    @api.onchange('product_id')
    Changes UoM if product_id changes.
  • onchange_uom(self)
    @api.onchange('product_uom_id')

New fields (16)
  • allowed_operation_ids Many2many → mrp.routing.workcenter
    compute='_compute_allowed_operation_ids' args: 'mrp.routing.workcenter'
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_bom_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Product Unit of Measure'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
Public methods (4)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (4)
  • consumption Selection
    compute='_compute_consumption' args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • mrp_consumption_warning_line_ids One2many → mrp.consumption.warning.line
    args: 'mrp.consumption.warning.line', 'mrp_consumption_warning_id'
  • mrp_production_count Integer
    compute='_compute_mrp_production_count'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
Public methods (2)
  • action_cancel(self)
  • action_confirm(self)

New fields (7)
  • consumption Selection
    related='mrp_production_id.consumption'
  • mrp_consumption_warning_id Many2one → mrp.consumption.warning
    ondelete='cascade' readonly=True required=True args: 'mrp.consumption.warning', 'Parent Wizard'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • product_consumed_qty_uom Float
    readonly=True args: 'Consumed'
  • product_expected_qty_uom Float
    readonly=True args: 'To Consume'
  • product_id Many2one → product.product
    readonly=True required=True args: 'product.product', 'Product'
  • product_uom_id Many2one → uom.uom
    readonly=True related='product_id.uom_id' args: 'uom.uom', 'Unit of Measure'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    help='Gives the sequence order when displaying a list of MRP documents.' string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (1)
  • copy(self, default=None)

New fields (3)
  • immediate_production_line_ids One2many → mrp.immediate.production.line
    string='Immediate Production Lines' args: 'mrp.immediate.production.line', 'immediate_production_id'
  • mo_ids Many2many → mrp.production
    args: 'mrp.production', 'mrp_production_production_rel'
  • show_productions Boolean
    compute='_compute_show_production'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (3)
  • immediate_production_id Many2one → mrp.immediate.production
    required=True args: 'mrp.immediate.production', 'Immediate Production'
  • production_id Many2one → mrp.production
    required=True args: 'mrp.production', 'Production'
  • to_immediate Boolean
    args: 'To Process'
Public methods (0)

No public methods.

New fields (61)
  • allowed_product_ids Many2many → product.product
    compute='_compute_allowed_product_ids' args: 'product.product'
  • backorder_sequence Integer
    copy=False default=0 help='Backorder sequence, if equals to 0 means there is not related backorder' args: 'Backorder Sequence'
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bill of Materials allow you to define the list of required components to make a finished product.' readonly=True states={'draft': [('readonly', False)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • components_availability Char
    compute='_compute_components_availability' string='Component Availability'
  • components_availability_state Selection
    compute='_compute_components_availability' args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
  • confirm_cancel Boolean
    compute='_compute_confirm_cancel'
  • consumption Selection
    default='flexible' readonly=True required=True args: [('flexible', 'Allowed'), ('warning', 'Allowed with warning'), ('strict', 'Blocked')]
  • date_deadline Datetime
    compute='_compute_date_deadline' copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' inverse='_set_date_deadline' readonly=True store=True args: 'Deadline'
  • date_finished Datetime
    copy=False index=True readonly=True args: 'End Date'
  • date_planned_finished Datetime
    copy=False default=_get_default_date_planned_finished help='Date at which you plan to finish the production.' args: 'Scheduled End Date'
  • date_planned_start Datetime
    copy=False default=_get_default_date_planned_start help='Date at which you plan to start the production.' index=True required=True args: 'Scheduled Date'
  • date_start Datetime
    copy=False index=True readonly=True args: 'Start Date'
  • delay_alert_date Datetime
    compute='_compute_delay_alert_date' search='_search_delay_alert_date' args: 'Delay Alert Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • is_locked Boolean
    copy=False default=_get_default_is_locked args: 'Is Locked'
  • is_planned Boolean
    compute='_compute_is_planned' search='_search_is_planned' args: 'Its Operations are Planned'
  • json_popover Char
    compute='_compute_json_popover' args: 'JSON data for the popover widget'
  • location_dest_id Many2one → stock.location
    check_company=True default=_get_default_location_dest_id domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will stock the finished products.' readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    check_company=True default=_get_default_location_src_id domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will look for components.' readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Components Location'
  • lot_producing_id Many2one → stock.production.lot
    check_company=True copy=False domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" string='Lot/Serial Number' args: 'stock.production.lot'
  • move_byproduct_ids One2many → stock.move
    compute='_compute_move_byproduct_ids' inverse='_set_move_byproduct_ids' args: 'stock.move'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'raw_material_production_id', 'Components'
  • mrp_production_backorder_count Integer
    compute='_compute_mrp_production_backorder' args: 'Count of linked backorder'
  • mrp_production_child_count Integer
    compute='_compute_mrp_production_child_count' args: 'Number of generated MO'
  • mrp_production_source_count Integer
    compute='_compute_mrp_production_source_count' args: 'Number of source MO'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    index=True args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True default=_get_default_picking_type domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • priority Selection
    default='0' help='Components will be reserved first for the MO with the highest priorities.' index=True string='Priority' args: PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_description_variants Char
    args: 'Custom Description'
  • product_id Many2one → product.product
    check_company=True domain="[\n ('type', 'in', ['product', 'consu']),\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id)\n ]\n " readonly=True required=True states={'draft': [('readonly', False)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' readonly=True required=True states={'draft': [('readonly', False)]} tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" readonly=True required=True states={'draft': [('readonly', False)]} args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • production_location_id Many2one → stock.location
    compute='_compute_production_location' store=True args: 'stock.location', 'Production Location'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • qty_producing Float
    copy=False digits='Product Unit of Measure' string='Quantity Producing'
  • reservation_state Selection
    compute='_compute_state' copy=False help=' * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n The material availability is impacted by the manufacturing readiness defined on the BoM.' index=True readonly=True store=True string='Material Availability' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • reserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can reserve quantities' args: 'Allowed to Reserve Production'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • show_lock Boolean
    compute='_compute_show_lock' args: 'Show Lock/unlock buttons'
  • show_lot_ids Boolean
    compute='_compute_show_lot_ids' args: 'Display the serial number shortcut on the moves'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Production'
  • use_create_components_lots Boolean
    related='picking_type_id.use_create_components_lots'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.users', 'Responsible'
  • workorder_done_count Integer
    compute='_compute_workorder_done_count' args: '# Done Work Orders'
  • workorder_ids One2many → mrp.workorder
    copy=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (25)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_confirm(self)
  • action_generate_serial(self)
  • action_see_move_scrap(self)
  • action_toggle_is_locked(self)
  • action_view_mo_delivery(self)
    This function returns an action that display picking related to manufacturing order orders. It can either be a in a list or in a form view, if there is only one picking to show.
  • action_view_mrp_production_backorders(self)
  • action_view_mrp_production_childs(self)
  • action_view_mrp_production_sources(self)
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unbuild(self)
  • button_unplan(self)
  • button_unreserve(self)
  • copy_data(self, default=None)
  • create(self, values)
    @api.model
  • do_unreserve(self)
  • get_empty_list_help(self, help)
    @api.model
  • onchange_company_id(self)
    @api.onchange('company_id')
  • onchange_picking_type(self)
    @api.onchange('picking_type_id')
  • onchange_product_id(self)
    @api.onchange('product_id', 'picking_type_id', 'company_id')
    Finds UoM of changed product.
  • unlink(self)
  • write(self, vals)

New fields (3)
  • mrp_production_backorder_line_ids One2many → mrp.production.backorder.line
    string='Backorder Confirmation Lines' args: 'mrp.production.backorder.line', 'mrp_production_backorder_id'
  • mrp_production_ids Many2many → mrp.production
    args: 'mrp.production'
  • show_backorder_lines Boolean
    compute='_compute_show_backorder_lines' args: 'Show backorder lines'
Public methods (2)
  • action_backorder(self)
  • action_close_mo(self)

New fields (3)
  • mrp_production_backorder_id Many2one → mrp.production.backorder
    ondelete='cascade' required=True args: 'mrp.production.backorder', 'MO Backorder'
  • mrp_production_id Many2one → mrp.production
    ondelete='cascade' readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • to_backorder Boolean
    args: 'To Backorder'
Public methods (0)

No public methods.

New fields (15)
  • bom_id Many2one → mrp.bom
    check_company=True help='The Bill of Material this operation is linked to' index=True ondelete='cascade' args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • note Text
    help='Text worksheet description' args: 'Description'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help="Time in minutes:- In manual mode, time used- In automatic mode, supposed first time when there aren't any work orders yet" args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' args: [('auto', 'Compute based on tracked time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'PDF'
  • worksheet_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • worksheet_type Selection
    default='text' help='Defines if you want to use a PDF or a Google Slide as work sheet.' string='Work Sheet' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
Public methods (1)
  • write(self, values)

New fields (16)
  • allowed_mo_ids One2many → mrp.production
    compute='_compute_allowed_mo_ids' args: 'mrp.production'
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]\n" states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)]} args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where you want to send the components resulting from the unbuild order.' required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the product you want to unbuild is.' required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" help='Lot/Serial Number of the product to unbuild.' states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial Number'
  • mo_bom_id Many2one → mrp.bom
    related='mo_id.bom_id' args: 'mrp.bom', 'Bill of Material used on the Production Order'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', '=', 'done'), ('company_id', '=', company_id), ('product_id', '=?', product_id)]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' index=True string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (4)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals)
    @api.model
  • unlink(self)

New fields (27)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel. In case the work center has a capacity of 5 and you have to produce 10 units on your work order, the usual operation time will be multiplied by 2.' args: 'Capacity'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Specify cost of work center per hour.' string='Cost per hour'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Text
    help='Description of the Work Center.' args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    help='Time in minutes for the setup.' args: 'Time before prod.'
  • time_stop Float
    help='Time in minutes for the cleaning.' args: 'Time after prod.'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (5)
  • action_archive(self)
  • action_work_order(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness'
  • production_id Many2one → mrp.production
    readonly='True' related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (1)
  • name_get(self)
    @api.depends('loss_type')
    As 'category' field in form view is a Many2one, its value will be in lower case. In order to display its value capitalized 'name_get' is overrided.

New fields (48)
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    required=True args: [('strict', 'Strict'), ('warning', 'Warning'), ('flexible', 'Flexible')]
  • date_finished Datetime
    copy=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'End Date'
  • date_planned_finished Datetime
    compute='_compute_dates_planned' copy=False inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Scheduled End Date'
  • date_planned_start Datetime
    compute='_compute_dates_planned' copy=False inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'Scheduled Start Date'
  • date_start Datetime
    copy=False states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Start Date'
  • duration Float
    compute='_compute_duration' copy=False inverse='_set_duration' readonly=False store=True args: 'Real Duration'
  • duration_expected Float
    default=60.0 digits=(16, 2) help='Expected duration (in minutes)' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_id Many2one → stock.production.lot
    check_company=True compute='_compute_finished_lot_id' domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" inverse='_set_finished_lot_id' string='Lot/Serial Number' args: 'stock.production.lot'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' help='Technical field indicating whether the current user is working. ' args: 'Is the Current User Working'
  • json_popover Char
    compute='_compute_json_popover' args: 'Popover Data JSON'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True copy=False help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • next_work_order_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Next Work Order'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation'
  • operation_note Text
    readonly=True related='operation_id.note' args: 'Description'
  • product_id Many2one
    check_company=True readonly=True related='production_id.product_id' store=True
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Unit of Measure'
  • production_availability Selection
    help='Technical: used in views and domains only.' readonly=True related='production_id.reservation_state' store=True string='Stock Availability'
  • production_bom_id Many2one → mrp.bom
    related='production_id.bom_id' args: 'mrp.bom'
  • production_date Datetime
    readonly=False related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    check_company=True readonly=True required=True args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    help='Technical: used in views only.' readonly=True related='production_id.state' string='Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    copy=False default=0.0 digits='Product Unit of Measure' help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    compute='_compute_qty_producing' digits='Product Unit of Measure' inverse='_set_qty_producing' string='Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit of Measure' args: 'Quantity To Be Produced'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • show_json_popover Boolean
    compute='_compute_json_popover' args: 'Show Popover?'
  • state Selection
    copy=False default='pending' readonly=True string='Status' args: [('pending', 'Waiting for another WO'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    copy=False args: 'mrp.workcenter.productivity', 'workorder_id'
  • use_create_components_lots Boolean
    related='production_id.picking_type_id.use_create_components_lots'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)], 'progress': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    help='Technical: used in views only' readonly=False related='workcenter_id.working_state' string='Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
  • worksheet_google_slide Char
    readonly=True related='operation_id.worksheet_google_slide' args: 'Worksheet URL'
  • worksheet_type Selection
    readonly=True related='operation_id.worksheet_type' string='Worksheet Type'
Public methods (17)
  • action_cancel(self)
  • action_open_wizard(self)
  • action_replan(self)
    Replan a work order. It actually replans every "ready" or "pending" work orders of the linked manufacturing orders.
  • action_see_move_scrap(self)
  • button_done(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self)
  • button_unblock(self)
  • create(self, values)
    @api.model_create_multi
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • gantt_unavailability(self, start_date, end_date, scale, group_bys=None, rows=None)
    @api.model
    Get unavailabilities data to display in the Gantt view.
  • name_get(self)
  • unlink(self)
  • write(self, values)

New fields (1)
  • mrp_production_ids One2many → mrp.production
    args: 'mrp.production', 'procurement_group_id'
Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (5)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (7)
  • action_archive(self)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise
  • write(self, values)

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False args: 'Manufactured'
  • produce_delay Float
    default=0.0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added.' args: 'Manufacturing Lead Time'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (4)
  • action_archive(self)
  • action_used_in_bom(self)
  • action_view_mos(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (3)
  • get_bom(self, bom_id=False, product_id=False, line_qty=False, line_id=False, level=False)
    @api.model
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_operations(self, bom_id=False, qty=0, level=0)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (1)
  • create_missing_unbuild_sequences(self)
    @api.model

New fields (10)
  • group_locked_by_default Boolean
    implied_group='mrp.group_locked_by_default' args: 'Lock Quantities To Consume'
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_mrp_workorder Boolean
    args: 'Work Orders'
  • module_quality_control Boolean
    args: 'Quality'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (14)
  • allowed_operation_ids Many2many → mrp.routing.workcenter
    compute='_compute_allowed_operation_ids' args: 'mrp.routing.workcenter'
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • created_production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Created Production Order'
  • is_done Boolean
    compute='_compute_is_done' help='Technical Field to order moves' store=True args: 'Done'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('id', 'in', allowed_operation_ids)]" args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_ids Many2many → stock.production.lot
    compute='_compute_order_finished_lot_ids' string='Finished Lot/Serial Number' args: 'stock.production.lot'
  • production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True index=True args: 'mrp.production', 'Production Order for components'
  • should_consume_qty Float
    compute='_compute_should_consume_qty' digits='Product Unit of Measure' args: 'Quantity To Consume'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    compute='_compute_unit_factor' store=True args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True copy=False args: 'mrp.workorder', 'Work Order To Consume'
Public methods (5)
  • action_explode(self)
    Explodes pickings
  • action_show_details(self)
  • default_get(self, fields_list)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (2)
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (2)
  • create(self, values)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • code Selection
    ondelete={'mrp_operation': 'cascade'} selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • action Selection
    ondelete={'manufacture': 'cascade'} selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    check_company=True states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True help='Not to restrict or prefer quants, but informative.' states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='Produce : Move the components to the production location directly and start the manufacturing process.\nPick / Produce : Unload the components from the Stock to Input location first, and then transfer it to the Production location.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components and then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture and then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (2)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]" string='Bill of Materials' args: 'mrp.bom'
  • show_bom Boolean
    compute='_compute_show_bom' args: 'Show BoM column'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, Atul Patel, Géry Debongnie, Aaron Bohy, Pedro M. Baeza, GitHub, Wolfgang Taferner, Yannick Tivisse, Martin Geubelle, Odoo Online, Pierre Masereel, Jigar Patel, Adrien Dieudonne, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, Arnold Moyaux, Adrian Torres, mreficent, XavierDo, Antoine Prieels, Priyanka Kakadiya, Xavier-Do, Andrea Grazioso (agr-odoo), William Henrotin, Sébastien Theys, Shreya Modi, Nasreddin (bon), alt-odoo, fw-bot, Anh Thao Pham (pta), svs-odoo, Lois Rilo, Alvaro Fuentes, Adrien Widart, Ivan Yelizariev, Naglis Jonaitis, Touati Djamel (otd), Prakash Prajapati, Nicolas Galler, nie, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Rémy Voet (ryv), Ivàn Todorovich, Thanh Dodeur, Varun Raval, Yenthe666, jbm-odoo, Aurélien (avd), shreya thakrar, Jinal Patel, Kevin Baptiste, Guillaume (guva), Arnaud Baes, roen-odoo, Hubert Van de Walle (huvw), Hardik Prajapati, Hetal Dhanak, Kaushalya Mandaliya, MerlinGuillaume, David (dafr), Ankita Raval, JordiMForgeFlow, Abdelouahab (abla), Hemali Bhimani, mightyjol (jhk), Himanshu Domadiya, ahenriquez
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - stock
    - barcodes
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (91)
XML IDNameModelTypeStatus
assets_backend mrp assets ir.ui.view qweb Inherits web.assets_backend
assets_common mrp bom common assets ir.ui.view qweb Inherits web.assets_common
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view label_production_view ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mrp_bom_byproduct_form_view mrp.bom.byproduct.form mrp.bom.byproduct form New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_product_produce_line_form MRP Product Produce Line mrp.product.produce.line form New
mrp_product_produce_line_kanban MRP Product Produce Line mrp.product.produce.line kanban New
mrp_product_product_search_view mrp.product.product.search product.product xpath Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template xpath Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_view_inherit mrp.production.work.order.tree mrp.workorder tree New
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_kanban_view mrp.routing.kanban mrp.routing kanban New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product xpath Inherits stock.product_form_view_procurement_button
product_template_form_view_bom_button product.template.procurement product.template xpath Inherits stock.product_template_form_view_procurement_button
production_message production_message ir.ui.view qweb New
qunit_suite qunit_suite ir.ui.view qweb Inherits web.qunit_suite
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb New
report_mrp_bom_pdf report_mrp_bom_pdf ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_operation_line report_mrp_operation_line ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_move_line_view_search stock.move.line.search stock.move.line filter Inherits stock.stock_move_line_view_search
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_document_form mrp.document.form mrp.document xpath Inherits base.view_attachment_form
view_finisehd_move_line mrp.finished.move.line.form stock.move.line form New
view_move_kanban_inherit_mrp stock.move.kanban.inherit.mrp stock.move xpath Inherits stock.view_move_kandan
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_type_form_inherit_mrp Operation Types stock.picking.type field Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_lots stock.move.lots.form stock.move form New
view_stock_move_raw_tree stock.move.raw.tree stock.move tree New
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (37)

New fields (2)
  • mo_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits='Product Unit of Measure' required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
  • default_get(self, fields)
    @api.model

New fields (9)
  • company_id Many2one
    related='production_id.company_id'
  • consumption Selection
    required=True args: [('strict', 'Strict'), ('flexible', 'Flexible')]
  • finished_lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" string='Lot/Serial Number' args: 'stock.production.lot'
  • product_id Many2one
    check_company=True readonly=True related='production_id.product_id' store=True
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True args: 'uom.uom', 'Unit of Measure'
  • production_id Many2one → mrp.production
    check_company=True required=True args: 'mrp.production', 'Manufacturing Order'
  • qty_producing Float
    digits='Product Unit of Measure' string='Currently Produced Quantity'
  • use_create_components_lots Boolean
    related='production_id.picking_type_id.use_create_components_lots'
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    compute='_compute_company_id' args: 'res.company'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), '|', ('company_id', '=', False), ('company_id', '=', parent.company_id)]" args: 'stock.production.lot', 'Lot/Serial Number'
  • move_id Many2one → stock.move
    check_company=True args: 'stock.move'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Product'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    string='Unit of Measure' args: 'uom.uom'
  • qty_done Float
    digits='Product Unit of Measure' args: 'Consumed'
  • qty_reserved Float
    digits='Product Unit of Measure' args: 'Reserved'
  • qty_to_consume Float
    digits='Product Unit of Measure' args: 'To Consume'
Public methods (0)

No public methods.

New fields (16)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the bills of material without removing it.' args: 'Active'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • byproduct_ids One2many → mrp.bom.byproduct
    copy=True args: 'mrp.bom.byproduct', 'bom_id', 'By-products'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> index=True args: 'res.company', 'Company'
  • consumption Selection
    default='strict' help='Defines if you can consume more or less components than the quantity defined on the BoM.' string='Consumption' args: [('strict', 'Strict'), ('flexible', 'Flexible')]
  • picking_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • product_id Many2one → product.product
    check_company=True domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If a product variant is defined the BOM is available only for this product.' args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits='Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    check_company=True domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True args: 'product.template', 'Product'
  • product_uom_category_id Many2one
    related='product_tmpl_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Unit of Measure'
  • ready_to_produce Selection
    default='asap' help='Defines when a Manufacturing Order is considered as ready to be started' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • routing_id Many2one → mrp.routing
    check_company=True help='The operations for producing this BoM. When a routing is specified, the production orders will be executed through work orders, otherwise everything is processed in the production order itself. ' tracking=True args: 'mrp.routing', 'Routing'
  • sequence Integer
    help='Gives the sequence order when displaying a list of bills of material.' args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (13)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • create(self, vals_list)
    @api.model_create_multi
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • name_get(self)
  • onchange_bom_structure(self)
    @api.onchange('bom_line_ids', 'product_qty')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • onchange_routing_id(self)
    @api.onchange('routing_id')
  • unlink(self)
  • write(self, values)

New fields (7)
  • bom_id Many2one → mrp.bom
    ondelete='cascade' args: 'mrp.bom', 'BoM'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('routing_id', '=', routing_id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" args: 'mrp.routing.workcenter', 'Produced in Operation'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'By-product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    required=True args: 'uom.uom', 'Unit of Measure'
  • routing_id Many2one → mrp.routing
    related='bom_id.routing_id' store=True args: 'mrp.routing', 'Routing'
Public methods (2)
  • onchange_product_id(self)
    @api.onchange('product_id')
    Changes UoM if product_id changes.
  • onchange_uom(self)
    @api.onchange('product_uom_id')

New fields (16)
  • attachments_count Integer
    compute='_compute_attachments_count' args: 'Attachments Count'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    domain="[('id', 'in', possible_bom_product_template_attribute_value_ids)]" help='BOM Product Variants needed to apply this line.' ondelete='restrict' string='Apply on Variants' args: 'product.template.attribute.value'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • company_id Many2one
    index=True readonly=True related='bom_id.company_id' store=True
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True domain="[('routing_id', '=', routing_id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • possible_bom_product_template_attribute_value_ids Many2many → product.template.attribute.value
    compute='_compute_possible_bom_product_template_attribute_value_ids' args: 'product.template.attribute.value'
  • product_id Many2one → product.product
    check_company=True required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id domain="[('category_id', '=', product_uom_category_id)]" help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' required=True args: 'uom.uom', 'Product Unit of Measure'
  • routing_id Many2one → mrp.routing
    help='The list of operations to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' readonly=False related='bom_id.routing_id' store=True args: 'mrp.routing', 'Routing'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
Public methods (4)
  • action_see_attachments(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    help='Gives the sequence order when displaying a list of MRP documents.' string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (1)
  • copy(self, default=None)

New fields (8)
  • finished_workorder_line_ids One2many → mrp.product.produce.line
    string='By-products' args: 'mrp.product.produce.line', 'finished_product_produce_id'
  • is_pending_production Boolean
    compute='_compute_pending_production'
  • move_finished_ids One2many
    related='production_id.move_finished_ids'
  • move_raw_ids One2many
    related='production_id.move_raw_ids' string='PO Components'
  • product_tracking Selection
    related='product_id.tracking'
  • production_id Many2one → mrp.production
    ondelete='cascade' required=True args: 'mrp.production', 'Manufacturing Order'
  • raw_workorder_line_ids One2many → mrp.product.produce.line
    string='Components' args: 'mrp.product.produce.line', 'raw_product_produce_id'
  • serial Boolean
    args: 'Requires Serial'
Public methods (4)
  • action_generate_serial(self)
  • continue_production(self)
    Save current wizard and directly opens a new.
  • default_get(self, fields)
    @api.model
  • do_produce(self)
    Save the current wizard and go back to the MO.

New fields (2)
  • finished_product_produce_id Many2one → mrp.product.produce
    args: 'mrp.product.produce', 'Finished Product in Produce wizard'
  • raw_product_produce_id Many2one → mrp.product.produce
    args: 'mrp.product.produce', 'Component in Produce wizard'
Public methods (0)

No public methods.

New fields (46)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '&',\n '|',\n ('company_id', '=', False),\n ('company_id', '=', company_id),\n '&',\n '|',\n ('product_id','=',product_id),\n '&',\n ('product_tmpl_id.product_variant_ids','=',product_id),\n ('product_id','=',False),\n ('type', '=', 'normal')]" help='Bill of Materials allow you to define the list of required components to make a finished product.' readonly=True states={'draft': [('readonly', False)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • confirm_cancel Boolean
    compute='_compute_confirm_cancel'
  • date_deadline Datetime
    copy=False help='Informative date allowing to define when the manufacturing order should be processed at the latest to fulfill delivery on time.' index=True args: 'Deadline'
  • date_finished Datetime
    copy=False index=True readonly=True args: 'End Date'
  • date_planned_finished Datetime
    copy=False default=_get_default_date_planned_finished help='Date at which you plan to finish the production.' store=True args: 'Planned End Date'
  • date_planned_start Datetime
    copy=False default=fields.Datetime.now help='Date at which you plan to start the production.' index=True required=True store=True args: 'Planned Date'
  • date_start Datetime
    copy=False index=True readonly=True args: 'Start Date'
  • date_start_wo Datetime
    copy=False help='Work orders will be planned based on the availability of the work centers starting from this date. If empty, the work orders will be planned as soon as possible.' readonly=True args: 'Plan From'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • is_locked Boolean
    copy=False default=True args: 'Is Locked'
  • location_dest_id Many2one → stock.location
    check_company=True default=_get_default_location_dest_id domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will stock the finished products.' readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    check_company=True default=_get_default_location_src_id domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the system will look for components.' readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.location', 'Components Location'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    copy=True domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'raw_material_production_id', 'Components'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    args: 'stock.warehouse.orderpoint', 'Orderpoint'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    check_company=True default=_get_default_picking_type domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)]} args: 'stock.picking.type', 'Operation Type'
  • post_visible Boolean
    compute='_compute_post_visible' help='Technical field to check when we can post' args: 'Allowed to Post Inventory'
  • priority Selection
    default='1' readonly=True states={'draft': [('readonly', False)]} args: [('0', 'Not urgent'), ('1', 'Normal'), ('2', 'Urgent'), ('3', 'Very Urgent')], 'Priority'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_id Many2one → product.product
    check_company=True domain="[('bom_ids', '!=', False), ('bom_ids.active', '=', True), ('bom_ids.type', '=', 'normal'), ('type', 'in', ['product', 'consu']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits='Product Unit of Measure' readonly=True required=True states={'draft': [('readonly', False)]} tracking=True args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_id Many2one → uom.uom
    readonly=True required=True states={'draft': [('readonly', False)]} args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • production_location_id Many2one → stock.location
    readonly=False related='product_id.property_stock_production' related_sudo=False args: 'stock.location', 'Production Location'
  • propagate_cancel Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • propagate_date Boolean
    help='The rescheduling is propagated to the next move.' string='Propagate Rescheduling'
  • propagate_date_minimum_delta Integer
    help='The change must be higher than this value to be propagated' string='Reschedule if Higher Than'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • reservation_state Selection
    compute='_compute_state' copy=False help=' * Ready: The material is available to start the production.\n * Waiting: The material is not available to start the production.\n The material availability is impacted by the manufacturing readiness defined on the BoM.' index=True readonly=True store=True string='Material Availability' tracking=True args: [('confirmed', 'Waiting'), ('assigned', 'Ready'), ('waiting', 'Waiting Another Operation')]
  • routing_id Many2one → mrp.routing
    compute='_compute_routing' help='The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' readonly=True store=True args: 'mrp.routing', 'Routing'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • state Selection
    compute='_compute_state' copy=False help=" * Draft: The MO is not confirmed yet.\n * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n * Planned: The WO are planned.\n * In Progress: The production has started (on the MO or on the WO).\n * To Close: The production is done, the MO has to be closed.\n * Done: The MO is closed, the stock moves are posted. \n * Cancelled: The MO has been cancelled, can't be confirmed anymore." index=True readonly=True store=True string='State' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('planned', 'Planned'), ('progress', 'In Progress'), ('to_close', 'To Close'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Inventory'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'res.users', 'Responsible'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_done_count Integer
    compute='_compute_workorder_done_count' args: '# Done Work Orders'
  • workorder_ids One2many → mrp.workorder
    copy=False readonly=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (22)
  • action_assign(self)
  • action_cancel(self)
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_confirm(self)
  • action_see_move_scrap(self)
  • action_toggle_is_locked(self)
  • action_view_mo_delivery(self)
    This function returns an action that display picking related to manufacturing order orders. It can either be a in a list or in a form view, if there is only one picking to show.
  • button_mark_done(self)
  • button_plan(self)
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
  • button_unplan(self)
  • button_unreserve(self)
  • copy(self, default=None)
    When there is a kit in the child bom of that production, we should not copy the workorder
  • create(self, values)
    @api.model
  • do_unreserve(self)
  • get_empty_list_help(self, help)
    @api.model
  • onchange_company_id(self)
    @api.onchange('company_id')
  • onchange_picking_type(self)
    @api.onchange('picking_type_id')
  • onchange_product_id(self)
    @api.onchange('product_id', 'picking_type_id', 'company_id')
    Finds UoM of changed product.
  • open_produce_product(self)
  • post_inventory(self)
  • unlink(self)
  • write(self, vals)

New fields (6)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the routing without removing it.' args: 'Active'
  • code Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • name Char
    required=True args: 'Routing'
  • note Text
    args: 'Description'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True args: 'mrp.routing.workcenter', 'routing_id', 'Operations'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (17)
  • batch Selection
    default='no' required=True string='Start Next Operation' args: [('no', 'Once all products are processed'), ('yes', 'Once some products are processed')]
  • batch_size Float
    default=1.0 args: 'Quantity to Process'
  • company_id Many2one → res.company
    readonly=True related='routing_id.company_id' store=True args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • note Text
    args: 'Description'
  • routing_id Many2one → mrp.routing
    help='The routing contains all the Work Centers used and for how long. This will create work orders afterwards which alters the execution of the manufacturing order.' index=True ondelete='cascade' required=True args: 'mrp.routing', 'Parent Routing'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help='Time in minutes. Is the time used in manual mode, or the first time supposed in real time when there are not any work orders yet.' args: 'Manual Duration'
  • time_mode Selection
    default='manual' string='Duration Computation' args: [('auto', 'Compute based on real time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    help='Upload your PDF file.' args: 'PDF'
  • worksheet_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • worksheet_type Selection
    default='pdf' help='Defines if you want to use a PDF or a Google Slide as work sheet.' string='Work Sheet' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide')]
Public methods (0)

No public methods.

New fields (14)
  • bom_id Many2one → mrp.bom
    check_company=True domain="[\n '|',\n ('product_id', '=', product_id),\n '&',\n ('product_tmpl_id.product_variant_ids', '=', product_id),\n ('product_id','=',False),\n ('type', '=', 'normal'),\n '|',\n ('company_id', '=', company_id),\n ('company_id', '=', False)\n ]\n" required=True states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • company_id Many2one → res.company
    default=<expr> index=True required=True states={'done': [('readonly', True)]} args: 'res.company', 'Company'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    check_company=True domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where you want to send the components resulting from the unbuild order.' required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    check_company=True domain="[('usage','=','internal'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Location where the product you want to unbuild is.' required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Source Location'
  • lot_id Many2one → stock.production.lot
    check_company=True domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]" help='Lot/Serial Number of the product to unbuild.' states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial Number'
  • mo_id Many2one → mrp.production
    check_company=True domain="[('state', 'in', ['done', 'cancel']), ('company_id', '=', company_id)]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    check_company=True domain="[('bom_ids', '!=', False), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' index=True string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (4)
  • action_unbuild(self)
  • action_validate(self)
  • create(self, vals)
    @api.model
  • unlink(self)

New fields (27)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • alternative_workcenter_ids Many2many → mrp.workcenter
    check_company=True domain="[('id', '!=', id), '|', ('company_id', '=', company_id), ('company_id', '=', False)]" help='Alternative workcenters that can be substituted to this one in order to dispatch production' string='Alternative Workcenters' args: 'mrp.workcenter', 'mrp_workcenter_alternative_rel', 'workcenter_id', 'alternative_workcenter_id'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hours over the last month' args: 'Blocked Time'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel. In case the work center has a capacity of 5 and you have to produce 10 units on your work order, the usual operation time will be multiplied by 2.' args: 'Capacity'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Specify cost of work center per hour.' string='Cost per hour'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Text
    help='Description of the Work Center.' args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='Overall Effective Efficiency Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hours over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    help='Time in minutes for the setup.' args: 'Time before prod.'
  • time_stop Float
    help='Time in minutes for the cleaning.' args: 'Time after prod.'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (4)
  • action_work_order(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unblock(self)
  • write(self, vals)

New fields (11)
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True args: 'Effectiveness'
  • production_id Many2one → mrp.production
    readonly='True' related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Blocking Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (1)
  • name_get(self)
    @api.depends('loss_type')
    As 'category' field in form view is a Many2one, its value will be in lower case. In order to display its value capitalized 'name_get' is overrided.

New fields (42)
  • allowed_lots_domain One2many → stock.production.lot
    comodel_name='stock.production.lot' compute='_compute_allowed_lots_domain'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' args: 'Capacity'
  • color Integer
    compute='_compute_color' args: 'Color'
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True args: 'res.company', 'Company'
  • date_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective End Date'
  • date_planned_finished Datetime
    compute='_compute_dates_planned' inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True tracking=True args: 'Scheduled Date Finished'
  • date_planned_start Datetime
    compute='_compute_dates_planned' inverse='_set_dates_planned' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True tracking=True args: 'Scheduled Date Start'
  • date_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective Start Date'
  • duration Float
    compute='_compute_duration' readonly=True store=True args: 'Real Duration'
  • duration_expected Float
    digits=(16, 2) help='Expected duration (in minutes)' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Per Unit'
  • finished_lot_id Many2one → stock.production.lot
    check_company=True domain="[('id', 'in', allowed_lots_domain)]" states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial Number'
  • finished_workorder_line_ids One2many → mrp.workorder.line
    string='By-products' args: 'mrp.workorder.line', 'finished_workorder_id'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' help='Technical field indicating whether the current user is working. ' args: 'Is the Current User Working'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • leave_id Many2one → resource.calendar.leaves
    check_company=True help='Slot into workcenter calendar once planned' args: 'resource.calendar.leaves'
  • move_finished_ids One2many → stock.move
    domain=[('raw_material_production_id', '=', False), ('production_id', '!=', False)] args: 'stock.move', 'workorder_id', 'Finished Moves'
  • move_line_ids One2many → stock.move.line
    help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    domain=[('raw_material_production_id', '!=', False), ('production_id', '=', False)] args: 'stock.move', 'workorder_id', 'Raw Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • next_work_order_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Next Work Order'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation'
  • production_availability Selection
    help='Technical: used in views and domains only.' readonly=True related='production_id.reservation_state' store=True args: 'Stock Availability'
  • production_date Datetime
    readonly=False related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_state Selection
    help='Technical: used in views only.' readonly=True related='production_id.state' args: 'Production State'
  • progress Float
    compute='_compute_progress' digits=(16, 2) args: 'Progress Done (%)'
  • qty_produced Float
    default=0.0 digits='Product Unit of Measure' help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits='Product Unit of Measure' args: 'Quantity To Be Produced'
  • raw_workorder_line_ids One2many → mrp.workorder.line
    string='Components' args: 'mrp.workorder.line', 'raw_workorder_id'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • state Selection
    default='pending' string='Status' args: [('pending', 'Waiting for another WO'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    check_company=True group_expand='_read_group_workcenter_id' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    help='Technical: used in views only' readonly=False related='workcenter_id.working_state' args: 'Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
  • worksheet_google_slide Char
    readonly=True related='operation_id.worksheet_google_slide' args: 'Worksheet URL'
  • worksheet_type Selection
    readonly=True related='operation_id.worksheet_type' args: 'Worksheet Type'
Public methods (14)
  • action_cancel(self)
  • action_see_move_scrap(self)
  • button_done(self)
  • button_finish(self)
  • button_pending(self)
  • button_scrap(self)
  • button_start(self)
  • button_unblock(self)
  • end_all(self)
  • end_previous(self, doall=False)
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • name_get(self)
  • record_production(self)
  • unlink(self)
  • write(self, values)

New fields (2)
  • finished_workorder_id Many2one → mrp.workorder
    ondelete='cascade' args: 'mrp.workorder', 'Finished Product for Workorder'
  • raw_workorder_id Many2one → mrp.workorder
    ondelete='cascade' args: 'mrp.workorder', 'Component for Workorder'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements)
    @api.model
    If 'run' is called on a kit, this override is made in order to call the original 'run' method with the values of the components of that kit.

New fields (5)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (5)
  • action_open_quants(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_mos(self)
  • get_components(self)
    Return the components list ids in case of kit product. Return the product itself otherwise

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' compute_sudo=False args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' compute_sudo=False args: 'Manufactured'
  • produce_delay Float
    default=0.0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added.' args: 'Manufacturing Lead Time'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' compute_sudo=False args: '# of BoM Where is Used'
Public methods (2)
  • action_used_in_bom(self)
  • action_view_mos(self)

New fields (0)

No new fields.

Public methods (3)
  • get_bom(self, bom_id=False, product_id=False, line_qty=False, line_id=False, level=False)
    @api.model
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_operations(self, bom_id=False, qty=0, level=0)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (1)
  • create_missing_unbuild_sequences(self)
    @api.model

New fields (9)
  • group_mrp_byproducts Boolean
    implied_group='mrp.group_mrp_byproducts' args: 'By-Products'
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_subcontracting Boolean
    args: 'Subcontracting'
  • module_mrp_workorder Boolean
    args: 'Work Orders'
  • module_quality_control Boolean
    args: 'Quality'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (14)
  • bom_line_id Many2one → mrp.bom.line
    check_company=True args: 'mrp.bom.line', 'BoM Line'
  • byproduct_id Many2one → mrp.bom.byproduct
    check_company=True help='By-product line that generated the move in a manufacturing order' args: 'mrp.bom.byproduct', 'By-products'
  • consume_unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • created_production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Created Production Order'
  • finished_lots_exist Boolean
    compute='_compute_order_finished_lot_ids' args: 'Finished Lots Exist'
  • is_done Boolean
    compute='_compute_is_done' help='Technical Field to order moves' store=True args: 'Done'
  • needs_lots Boolean
    compute='_compute_needs_lots' args: 'Tracking'
  • operation_id Many2one → mrp.routing.workcenter
    check_company=True args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_ids Many2many → stock.production.lot
    compute='_compute_order_finished_lot_ids' args: 'stock.production.lot'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order for components'
  • unbuild_id Many2one → mrp.unbuild
    check_company=True args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    default=1 args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order To Consume'
Public methods (2)
  • action_explode(self)
    Explodes pickings
  • default_get(self, fields_list)
    @api.model

New fields (5)
  • done_move Boolean
    readonly=False related='move_id.is_done' store=True args: 'Move Done'
  • lot_produced_ids Many2many → stock.production.lot
    check_company=True string='Finished Lot/Serial Number' args: 'stock.production.lot'
  • lot_produced_qty Float
    digits='Product Unit of Measure' help='Informative, not used in matching' args: 'Quantity Finished Product'
  • production_id Many2one → mrp.production
    check_company=True args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • code Selection
    selection_add=[('mrp_operation', 'Manufacturing')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
  • use_create_components_lots Boolean
    default=False help='Allow to create new lot/serial numbers for the components' string='Create New Lots/Serial Numbers for Components'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • action Selection
    selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    check_company=True states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    check_company=True help='Not to restrict or prefer quants, but informative.' states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • manu_type_id Many2one → stock.picking.type
    check_company=True domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]" args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture MTO Rule'
  • manufacture_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='Produce : Move the components to the production location directly and start the manufacturing process.\nPick / Produce : Unload the components from the Stock to Input location first, and then transfer it to the Production location.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components and then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture and then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    check_company=True args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    check_company=True args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, xmo-odoo, qdp-odoo, Géry Debongnie, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, Pierre Masereel, Adrien Dieudonne, RomainLibert, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, Nicolas Vannieuwerburgh, Arnold Moyaux, Adrian Torres, Nathan de Pryck, mreficent, XavierDo, Aurélien Warnon, Xavier-Do, Luis Torres, jerome hanke (jhk), Andrea Grazioso (agr-odoo), Fanny He, William Henrotin, Sébastien Theys, fw-bot, Luis González, Kinjal Mehta, Adrien Widart, Touati Djamel (otd), Tiffany Chang (tic), Simran Gajsinghani, Rémy Voet (ryv), Yenthe666, Pratima Gupta, Ashmawy Walid (was), Kiril Vangelovski
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - stock
    - barcodes
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (84)
XML IDNameModelTypeStatus
assets_backend mrp assets ir.ui.view qweb Inherits web.assets_backend
assets_common mrp bom common assets ir.ui.view qweb Inherits web.assets_common
exception_on_mo exception_on_mo ir.ui.view qweb New
label_production_view_pdf label_production_view_pdf ir.ui.view qweb New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_product_product_search_view mrp.product.product.search product.product xpath Inherits product.product_search_form_view
mrp_product_template_search_view mrp.product.template.search product.template xpath Inherits product.product_template_search_view
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workorder_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workorder_tree_view_inherit mrp.production.work.order.tree mrp.workorder tree New
mrp_report_stock_rule mrp_report_stock_rule ir.ui.view qweb Inherits stock.report_stock_rule
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_kanban_view mrp.routing.kanban mrp.routing kanban New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product button Inherits product.product_normal_form_view
product_template_form_view_bom_button product.template.procurement product.template button Inherits product.product_template_only_form_view
production_message production_message ir.ui.view qweb New
qunit_suite qunit_suite ir.ui.view qweb Inherits web.qunit_suite
report_bom_structure report_bom_structure ir.ui.view qweb New
report_mrp_bom report_mrp_bom ir.ui.view qweb New
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb New
report_mrp_bom_pdf report_mrp_bom_pdf ir.ui.view qweb New
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb New
report_mrp_operation_line report_mrp_operation_line ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_document_form mrp.document.form mrp.document xpath Inherits base.view_attachment_form
view_finisehd_move_line mrp.finished.move.line.form stock.move.line form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workorder_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_type_form_inherit_mrp Operation Types stock.picking.type field Inherits stock.view_picking_type_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_lots stock.move.lots.form stock.move form New
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (33)

New fields (2)
  • mo_id Many2one → mrp.production
    required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
    @api.multi
  • default_get(self, fields)
    @api.model

New fields (13)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the bills of material without removing it.' args: 'Active'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • picking_type_id Many2one → stock.picking.type
    domain=[('code', '=', 'mrp_operation')] help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define stock rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • product_id Many2one → product.product
    domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu'])]" help='If a product variant is defined the BOM is available only for this product.' args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Unit of Measure') required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    domain="[('type', 'in', ['product', 'consu'])]" required=True args: 'product.template', 'Product'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' oldname='product_uom' required=True args: 'uom.uom', 'Product Unit of Measure'
  • ready_to_produce Selection
    default='asap' help='Defines when a Manufacturing Order is considered as ready to be started' required=True string='Manufacturing Readiness' args: [('all_available', ' When all components are available'), ('asap', 'When components for 1st operation are available')]
  • routing_id Many2one → mrp.routing
    help='The operations for producing this BoM. When a routing is specified, the production orders will be executed through work orders, otherwise everything is processed in the production order itself. ' track_visibility='onchange' args: 'mrp.routing', 'Routing'
  • sequence Integer
    help='Gives the sequence order when displaying a list of bills of material.' args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (10)
  • check_kit_has_not_orderpoint(self)
    @api.constrains('product_tmpl_id', 'product_id', 'type')
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model
  • name_get(self)
    @api.multi
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • onchange_routing_id(self)
    @api.onchange('routing_id')
  • unlink(self)
    @api.multi

New fields (15)
  • attribute_value_ids Many2many → product.attribute.value
    help='BOM Product Variants needed form apply this line.' string='Apply on Variants' args: 'product.attribute.value'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • has_attachments Boolean
    compute='_compute_has_attachments' args: 'Has Attachments'
  • operation_id Many2one → mrp.routing.workcenter
    help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • parent_product_tmpl_id Many2one → product.template
    related='bom_id.product_tmpl_id' args: 'product.template', 'Parent Product Template'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Component'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_id Many2one → uom.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' oldname='product_uom' required=True args: 'uom.uom', 'Product Unit of Measure'
  • routing_id Many2one → mrp.routing
    help='The list of operations to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' readonly=False related='bom_id.routing_id' store=True args: 'mrp.routing', 'Routing'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
  • valid_product_attribute_value_ids Many2many → product.attribute.value
    related='bom_id.product_tmpl_id.valid_product_attribute_value_ids' args: 'product.attribute.value'
  • valid_product_attribute_value_wnva_ids Many2many → product.attribute.value
    related='bom_id.product_tmpl_id.valid_product_attribute_value_wnva_ids' args: 'product.attribute.value'
Public methods (5)
  • action_see_attachments(self)
    @api.multi
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_parent_product(self)
    @api.onchange('parent_product_tmpl_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    help='Gives the sequence order when displaying a list of MRP documents.' string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (0)

No public methods.

New fields (8)
  • lot_id Many2one → stock.production.lot
    string='Lot/Serial Number' args: 'stock.production.lot'
  • produce_line_ids One2many → mrp.product.produce.line
    string='Product to Track' args: 'mrp.product.produce.line', 'product_produce_id'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    args: 'uom.uom', 'Unit of Measure'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial Boolean
    args: 'Requires Serial'
Public methods (3)
  • check_finished_move_lots(self)
    @api.multi
  • default_get(self, fields)
    @api.model
  • do_produce(self)
    @api.multi

New fields (9)
  • lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot/Serial Number'
  • move_id Many2one → stock.move
    args: 'stock.move'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • product_produce_id Many2one → mrp.product.produce
    args: 'mrp.product.produce'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → uom.uom
    args: 'uom.uom', 'Unit of Measure'
  • qty_done Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Consumed'
  • qty_reserved Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Reserved'
  • qty_to_consume Float
    digits=dp.get_precision('Product Unit of Measure') args: 'To Consume'
Public methods (0)

No public methods.

New fields (43)
  • availability Selection
    compute='_compute_availability' store=True string='Materials Availability' args: [('assigned', 'Available'), ('partially_available', 'Partially Available'), ('waiting', 'Waiting'), ('none', 'None')]
  • bom_id Many2one → mrp.bom
    help='Bill of Materials allow you to define the list of required raw materials to make a finished product.' readonly=True states={'confirmed': [('readonly', False)]} args: 'mrp.bom', 'Bill of Material'
  • check_to_done Boolean
    compute='_get_produced_qty' help="Technical Field to see if we can show 'Mark as Done' button" string='Check Produced Qty'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • consumed_less_than_planned Boolean
    compute='_compute_consumed_less_than_planned' help='Technical field used to see if we have to display a warning or not when confirming an order.'
  • date_finished Datetime
    copy=False index=True readonly=True args: 'End Date'
  • date_planned_finished Datetime
    copy=False default=fields.Datetime.now index=True states={'confirmed': [('readonly', False)]} args: 'Deadline End'
  • date_planned_start Datetime
    copy=False default=fields.Datetime.now index=True oldname='date_planned' required=True states={'confirmed': [('readonly', False)]} args: 'Deadline Start'
  • date_start Datetime
    copy=False index=True readonly=True args: 'Start Date'
  • delivery_count Integer
    compute='_compute_picking_ids' string='Delivery Orders'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • has_moves Boolean
    compute='_has_moves'
  • is_locked Boolean
    copy=False default=True args: 'Is Locked'
  • location_dest_id Many2one → stock.location
    default=_get_default_location_dest_id help='Location where the system will stock the finished products.' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    default=_get_default_location_src_id help='Location where the system will look for components.' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'stock.location', 'Raw Materials Location'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] oldname='move_lines' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'raw_material_production_id', 'Raw Materials'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' args: 'Source'
  • picking_ids Many2many → stock.picking
    compute='_compute_picking_ids' string='Picking associated to this manufacturing order' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    default=_get_default_picking_type required=True args: 'stock.picking.type', 'Operation Type'
  • post_visible Boolean
    compute='_compute_post_visible' help='Technical field to check when we can post' args: 'Allowed to Post Inventory'
  • priority Selection
    default='1' readonly=True states={'confirmed': [('readonly', False)]} args: [('0', 'Not urgent'), ('1', 'Normal'), ('2', 'Urgent'), ('3', 'Very Urgent')], 'Priority'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') readonly=True required=True states={'confirmed': [('readonly', False)]} track_visibility='onchange' args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_id Many2one → uom.uom
    oldname='product_uom' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'uom.uom', 'Product Unit of Measure'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' store=True string='Total Quantity'
  • production_location_id Many2one → stock.location
    readonly=False related='product_id.property_stock_production' related_sudo=False args: 'stock.location', 'Production Location'
  • propagate Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • routing_id Many2one → mrp.routing
    compute='_compute_routing' help='The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' readonly=True store=True args: 'mrp.routing', 'Routing'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • state Selection
    copy=False default='confirmed' string='State' track_visibility='onchange' args: [('confirmed', 'Confirmed'), ('planned', 'Planned'), ('progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Inventory'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'Responsible'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_done_count Integer
    compute='_compute_workorder_done_count' args: '# Done Work Orders'
  • workorder_ids One2many → mrp.workorder
    copy=False oldname='workcenter_lines' readonly=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (18)
  • action_assign(self)
    @api.multi
  • action_cancel(self)
    @api.multi
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_see_move_scrap(self)
    @api.multi
  • action_toggle_is_locked(self)
  • action_view_mo_delivery(self)
    This function returns an action that display picking related to manufacturing order orders. It can either be a in a list or in a form view, if there is only one picking to show.
  • button_mark_done(self)
    @api.multi
  • button_plan(self)
    @api.multi
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
    @api.multi
  • button_unreserve(self)
    @api.multi
  • create(self, values)
    @api.model
  • do_unreserve(self)
    @api.multi
  • get_empty_list_help(self, help)
    @api.model
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'routing_id')
  • onchange_product_id(self)
    @api.onchange('product_id', 'picking_type_id', 'company_id')
    Finds UoM of changed product.
  • open_produce_product(self)
    @api.multi
  • post_inventory(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (7)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the routing without removing it.' args: 'Active'
  • code Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    help='Keep empty if you produce at the location where you find the raw materials. Set a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' args: 'stock.location', 'Raw Materials Location'
  • name Char
    required=True args: 'Routing'
  • note Text
    args: 'Description'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True oldname='workcenter_lines' args: 'mrp.routing.workcenter', 'routing_id', 'Operations'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (15)
  • batch Selection
    default='no' help="Set 'no' to schedule the next work order after the previous one. Set 'yes' to produce after the quantity set in 'Quantity To Process' has been produced." required=True string='Next Operation' args: [('no', 'Once all products are processed'), ('yes', 'Once a minimum number of products is processed')]
  • batch_size Float
    default=1.0 args: 'Quantity to Process'
  • company_id Many2one → res.company
    readonly=True related='routing_id.company_id' store=True args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • note Text
    args: 'Description'
  • routing_id Many2one → mrp.routing
    help='The routing contains all the Work Centers used and for how long. This will create work orders afterwards which alters the execution of the manufacturing order.' index=True ondelete='cascade' required=True args: 'mrp.routing', 'Parent Routing'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help='Time in minutes. Is the time used in manual mode, or the first time supposed in real time when there are not any work orders yet.' args: 'Manual Duration'
  • time_mode Selection
    default='auto' string='Duration Computation' args: [('auto', 'Compute based on real time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'worksheet'
Public methods (0)

No public methods.

New fields (13)
  • bom_id Many2one → mrp.bom
    domain=[('product_tmpl_id', '=', 'product_id.product_tmpl_id')] required=True states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    default=_get_default_location_dest_id required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    default=_get_default_location_id required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot'
  • mo_id Many2one → mrp.production
    domain="[('product_id', '=', product_id), ('state', 'in', ['done', 'cancel'])]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → uom.uom
    required=True states={'done': [('readonly', True)]} args: 'uom.uom', 'Unit of Measure'
  • state Selection
    default='draft' index=True string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (6)
  • action_unbuild(self)
    @api.multi
  • action_validate(self)
  • create(self, vals)
    @api.model
  • onchange_mo_id(self)
    @api.onchange('mo_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • unlink(self)
    @api.multi

New fields (26)
  • active Boolean
    default=True readonly=False related='resource_id.active' store=True args: 'Active'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hour(s) over the last month' args: 'Blocked Time'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' oldname='capacity_per_cycle' args: 'Capacity'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • costs_hour Float
    default=0.0 help='Specify cost of work center per hour.' string='Cost per hour'
  • name Char
    readonly=False related='resource_id.name' store=True args: 'Work Center'
  • note Text
    help='Description of the Work Center.' args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='OEE Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hour(s) over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • time_efficiency Float
    default=100 readonly=False related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    help='Time in minutes for the setup.' args: 'Time before prod.'
  • time_stop Float
    help='Time in minutes for the cleaning.' args: 'Time after prod.'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Workcenter Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Pending Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (2)
  • create(self, vals)
    @api.model
  • unblock(self)
    @api.multi

New fields (10)
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True args: 'Effectiveness'
  • production_id Many2one → mrp.production
    readonly='True' related='workorder_id.production_id' string='Manufacturing Order' args: 'mrp.production'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)
    @api.multi

New fields (5)
  • loss_id Many2one → mrp.workcenter.productivity.loss.type
    domain=[('loss_type', 'in', ['quality', 'availability'])] string='Category' args: 'mrp.workcenter.productivity.loss.type'
  • loss_type Selection
    readonly=False related='loss_id.loss_type' store=True string='Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (1)
  • loss_type Selection
    default='availability' required=True string='Category' args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')]
Public methods (1)
  • name_get(self)
    @api.depends('loss_type')
    As 'category' field in form view is a Many2one, its value will be in lower case. In order to display its value capitalized 'name_get' is overrided.

New fields (40)
  • active_move_line_ids One2many → stock.move.line
    domain=[('done_wo', '=', False)] args: 'stock.move.line', 'workorder_id'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' args: 'Capacity'
  • color Integer
    compute='_compute_color' args: 'Color'
  • date_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective End Date'
  • date_planned_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Scheduled Date Finished'
  • date_planned_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Scheduled Date Start'
  • date_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective Start Date'
  • duration Float
    compute='_compute_duration' readonly=True store=True args: 'Real Duration'
  • duration_expected Float
    digits=(16, 2) help='Expected duration (in minutes)' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Per Unit'
  • final_lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial Number'
  • is_first_wo Boolean
    compute='_compute_is_first_wo' string='Is the first WO to produce'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_working_users' help='Technical field indicating whether the current user is working. ' args: 'Is the Current User Working'
  • last_working_user_id One2many → res.users
    compute='_compute_working_users' string='Last user that worked on this work order.' args: 'res.users'
  • move_line_ids One2many → stock.move.line
    domain=[('done_wo', '=', True)] help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    args: 'stock.move', 'workorder_id', 'Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • next_work_order_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Next Work Order'
  • operation_id Many2one → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'Operation'
  • product_id Many2one → product.product
    help='Technical: used in views only.' readonly=True related='production_id.product_id' store=True args: 'product.product', 'Product'
  • product_tracking Selection
    help='Technical: used in views only.' readonly=False related='production_id.product_id.tracking' args: 'Product Tracking'
  • product_uom_id Many2one → uom.uom
    help='Technical: used in views only.' readonly=True related='production_id.product_uom_id' args: 'uom.uom', 'Unit of Measure'
  • production_availability Selection
    help='Technical: used in views and domains only.' readonly=True related='production_id.availability' store=True args: 'Stock Availability'
  • production_date Datetime
    readonly=False related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    index=True ondelete='cascade' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} track_visibility='onchange' args: 'mrp.production', 'Manufacturing Order'
  • production_state Selection
    help='Technical: used in views only.' readonly=True related='production_id.state' args: 'Production State'
  • qty_produced Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits=dp.get_precision('Product Unit of Measure') args: 'Quantity To Be Produced'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • state Selection
    default='pending' string='Status' args: [('pending', 'Pending'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    help='Technical: used in views only' readonly=False related='workcenter_id.working_state' args: 'Workcenter Status'
  • working_user_ids One2many → res.users
    compute='_compute_working_users' string='Working user on this work order.' args: 'res.users'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
Public methods (13)
  • action_cancel(self)
    @api.multi
  • action_see_move_scrap(self)
    @api.multi
  • button_done(self)
    @api.multi
  • button_finish(self)
    @api.multi
  • button_pending(self)
    @api.multi
  • button_scrap(self)
    @api.multi
  • button_start(self)
    @api.multi
  • button_unblock(self)
    @api.multi
  • end_all(self)
    @api.multi
  • end_previous(self, doall=False)
    @api.multi
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • name_get(self)
    @api.multi
  • record_production(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • bom_count Integer
    compute='_compute_bom_count' args: '# Bill of Material'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_id', 'BoM Components'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' args: 'Manufactured'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' args: '# BoM Where Used'
  • variant_bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_id', 'BOM Product Variants'
Public methods (3)
  • action_used_in_bom(self)
    @api.multi
  • action_view_bom(self)
    @api.multi
  • action_view_mos(self)
    @api.multi

New fields (6)
  • bom_count Integer
    compute='_compute_bom_count' args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • bom_line_ids One2many → mrp.bom.line
    args: 'mrp.bom.line', 'product_tmpl_id', 'BoM Components'
  • mrp_product_qty Float
    compute='_compute_mrp_product_qty' args: 'Manufactured'
  • produce_delay Float
    default=0.0 help='Average lead time in days to manufacture this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added.' args: 'Manufacturing Lead Time'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' args: '# of BoM Where is Used'
Public methods (2)
  • action_used_in_bom(self)
    @api.multi
  • action_view_mos(self)
    @api.multi

New fields (0)

No new fields.

Public methods (3)
  • get_bom(self, bom_id=False, product_id=False, line_qty=False, line_id=False, level=False)
    @api.model
  • get_html(self, bom_id=False, searchQty=1, searchVariant=False)
    @api.model
  • get_operations(self, bom_id=False, qty=0, level=0)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (8)
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'MRP Work Orders'
  • manufacturing_lead Float
    readonly=False related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_byproduct Boolean
    args: 'By-Products'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_workorder Boolean
    args: 'Work Orders'
  • module_quality_control Boolean
    args: 'Quality'
  • use_manufacturing_lead Boolean
    config_parameter='mrp.use_manufacturing_lead' oldname='default_use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (14)
  • active_move_line_ids One2many → stock.move.line
    domain=[('done_wo', '=', True)] string='Lots' args: 'stock.move.line', 'move_id'
  • bom_line_id Many2one → mrp.bom.line
    args: 'mrp.bom.line', 'BoM Line'
  • consume_unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • created_production_id Many2one → mrp.production
    args: 'mrp.production', 'Created Production Order'
  • finished_lots_exist Boolean
    compute='_compute_order_finished_lot_ids' args: 'Finished Lots Exist'
  • is_done Boolean
    compute='_compute_is_done' help='Technical Field to order moves' store=True args: 'Done'
  • needs_lots Boolean
    compute='_compute_needs_lots' args: 'Tracking'
  • operation_id Many2one → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_ids Many2many → stock.production.lot
    compute='_compute_order_finished_lot_ids' args: 'stock.production.lot'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order for raw materials'
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order To Consume'
Public methods (2)
  • action_explode(self)
    Explodes pickings
  • default_get(self, fields_list)
    @api.model

New fields (6)
  • done_move Boolean
    readonly=False related='move_id.is_done' store=True args: 'Move Done'
  • done_wo Boolean
    default=True help='Technical Field which is False when temporarily filled in in work order' args: 'Done for Work Order'
  • lot_produced_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Finished Lot/Serial Number'
  • lot_produced_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='Informative, not used in matching' args: 'Quantity Finished Product'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • write(self, vals)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • code Selection
    selection_add=[('mrp_operation', 'Manufacturing Operation')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (1)
  • use_next_on_work_order_id Many2one → mrp.workorder
    help='Technical: used to figure out default serial number on work orders' string='Next Work Order to Use' args: 'mrp.workorder'
Public methods (0)

No public methods.

New fields (1)
  • action Selection
    selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    help='Not to restrict or prefer quants, but informative.' states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (11)
  • manu_type_id Many2one → stock.picking.type
    domain=[('code', '=', 'mrp_operation')] args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Manufacture Rule'
  • manufacture_steps Selection
    default='mrp_one_step' help='Produce : Move the raw materials to the production location directly and start the manufacturing process.\nPick / Produce : Unload the raw materials from the Stock to Input location first, and then transfer it to the Production location.' required=True args: [('mrp_one_step', 'Manufacture (1 step)'), ('pbm', 'Pick components and then manufacture (2 steps)'), ('pbm_sam', 'Pick components, manufacture and then store products (3 steps)')], 'Manufacture'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture to Resupply'
  • pbm_loc_id Many2one → stock.location
    args: 'stock.location', 'Picking before Manufacturing Location'
  • pbm_mto_pull_id Many2one → stock.rule
    args: 'stock.rule', 'Picking Before Manufacturing MTO Rule'
  • pbm_route_id Many2one → stock.location.route
    ondelete='restrict' args: 'stock.location.route', 'Picking Before Manufacturing Route'
  • pbm_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Picking Before Manufacturing Operation Type'
  • sam_loc_id Many2one → stock.location
    args: 'stock.location', 'Stock after Manufacturing Location'
  • sam_rule_id Many2one → stock.rule
    args: 'stock.rule', 'Stock After Manufacturing Rule'
  • sam_type_id Many2one → stock.picking.type
    args: 'stock.picking.type', 'Stock After Manufacturing Operation Type'
Public methods (2)
  • get_rules_dict(self)
  • write(self, vals)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • check_product_is_not_kit(self)
    @api.constrains('product_id')

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Joren Van Onder, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, qdp-odoo, Géry Debongnie, Aaron Bohy, GitHub, Damien Bouvy, Olivier Colson, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Pierre Masereel, Laurent Smet, Denis Vermylen (dve), Adrien Dieudonne, len-odoo, Jorge Pinna Puissant, Nans Lefebvre, amoyaux, Arnold Moyaux, jvm-odoo, jerome hanke (jhk), Fanny He, William Henrotin, Khoi Nguyen, fw-bot, svs-odoo, Andrii Skrypka
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - stock
    - barcodes
    - web_planner
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (84)
XML IDNameModelTypeStatus
assets_backend mrp assets ir.ui.view qweb Inherits web.assets_backend
mrp_bom_component_tree_view mrp.bom.component.tree mrp.bom.line tree New
mrp_bom_cost_report mrp_bom_cost_report ir.ui.view qweb New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_kanban_view mrp.bom.kanban mrp.bom kanban New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_structure_report mrp_bom_structure_report ir.ui.view qweb New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_message_view_form mrp.message.view.form mrp.message form New
mrp_message_view_form_embedded_bom mrp.message.view.form.embedded.bom mrp.message form New
mrp_message_view_form_embedded_product mrp.message.view.form.embedded.product mrp.message form New
mrp_message_view_search mrp.message.view.search mrp.message search New
mrp_message_view_tree mrp.message.view.tree mrp.message tree New
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workcenter_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workcenter_tree_view_inherit mrp.production.work.order.tree mrp.workorder tree New
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_kanban_view mrp.routing.kanban mrp.routing kanban New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_kanban_view mrp.unbuild.kanban mrp.unbuild kanban New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workcenter_view_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product button Inherits product.product_normal_form_view
product_template_form_view_bom_button product.template.procurement product.template button Inherits product.product_template_only_form_view
product_template_search_view_procurment product.template.search.bom product.template xpath Inherits product.product_template_search_view
production_message production_message ir.ui.view qweb New
qunit_suite qunit_suite ir.ui.view qweb Inherits web.qunit_suite
report_mrporder report_mrporder ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
stock_warn_insufficient_qty_unbuild_form_view stock.warn.insufficient.qty.unbuild stock.warn.insufficient.qty.unbuild xpath Inherits stock.stock_warn_insufficient_qty_form_view
track_production_move_template track_production_move_template ir.ui.view qweb New
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp mrp.document kanban.mrp mrp.document kanban New
view_document_form mrp.document.form mrp.document xpath Inherits base.view_attachment_form
view_finisehd_move_line mrp.finished.move.line.form stock.move.line form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_bom_line_filter mrp.bom.line.select mrp.bom.line search New
view_mrp_message_kanban mrp.message.kanban mrp.message kanban New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workcenter_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_productivity_loss_kanban mrp.workcenter.productivity.loss.kanban mrp.workcenter.productivity.loss kanban New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_picking_type_form_inherit_mrp Operation Types stock.picking.type field Inherits stock.view_picking_type_form
view_procurement_rule_form_stock_inherit_mrp procurement.rule.form.stock.inherit.mrp procurement.rule field Inherits stock.view_procurement_rule_form
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_lots stock.move.lots.form stock.move form New
view_warehouse_inherited Stock Warehouse Inherited stock.warehouse xpath Inherits stock.view_warehouse
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (31)

New fields (2)
  • mo_id Many2one → mrp.production
    required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
    @api.multi
  • default_get(self, fields)
    @api.model

New fields (13)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the bills of material without removing it.' args: 'Active'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • picking_type_id Many2one → stock.picking.type
    domain=[('code', '=', 'mrp_operation')] help='When a procurement has a ‘produce’ route with a operation type set, it will try to create a Manufacturing Order for that product using a BoM of the same operation type. That allows to define procurement rules which trigger different manufacturing orders with different BoMs.' args: 'stock.picking.type', 'Operation Type'
  • product_id Many2one → product.product
    domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu'])]" help='If a product variant is defined the BOM is available only for this product.' args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Unit of Measure') required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    domain="[('type', 'in', ['product', 'consu'])]" required=True args: 'product.template', 'Product'
  • product_uom_id Many2one → product.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' oldname='product_uom' required=True args: 'product.uom', 'Product Unit of Measure'
  • ready_to_produce Selection
    default='asap' required=True string='Manufacturing Readiness' args: [('all_available', 'All components available'), ('asap', 'The components of 1st operation')]
  • routing_id Many2one → mrp.routing
    help='The operations for producing this BoM. When a routing is specified, the production orders will be executed through work orders, otherwise everything is processed in the production order itself. ' args: 'mrp.routing', 'Routing'
  • sequence Integer
    help='Gives the sequence order when displaying a list of bills of material.' args: 'Sequence'
  • type Selection
    default='normal' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Kit')], 'BoM Type'
Public methods (6)
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • name_get(self)
    @api.multi
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • onchange_routing_id(self)
    @api.onchange('routing_id')
  • unlink(self)
    @api.multi

New fields (11)
  • attribute_value_ids Many2many → product.attribute.value
    help='BOM Product Variants needed form apply this line.' string='Variants' args: 'product.attribute.value'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • has_attachments Boolean
    compute='_compute_has_attachments' args: 'Has Attachments'
  • operation_id Many2one → mrp.routing.workcenter
    help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True args: 'Product Quantity'
  • product_uom_id Many2one → product.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' oldname='product_uom' required=True args: 'product.uom', 'Product Unit of Measure'
  • routing_id Many2one → mrp.routing
    help='The list of operations to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' related='bom_id.routing_id' store=True args: 'mrp.routing', 'Routing'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
Public methods (4)
  • action_see_attachments(self)
    @api.multi
  • create(self, values)
    @api.model
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • ir_attachment_id Many2one → ir.attachment
    ondelete='cascade' required=True string='Related attachment' args: 'ir.attachment'
  • priority Selection
    help='Gives the sequence order when displaying a list of MRP documents.' string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (0)

No public methods.

New fields (8)
  • bom_id Many2one → mrp.bom
    domain="['|', ('product_id', '=', product_id), ('product_tmpl_id.product_variant_ids','=', product_id)]" args: 'mrp.bom', 'Bill of Material'
  • message Html
    required=True
  • name Text
    compute='_get_note_first_line' store=True
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    args: 'product.template', 'Product Template'
  • routing_id Many2one → mrp.routing
    string='Routing' args: 'mrp.routing'
  • valid_until Date
    default=_default_valid_until required=True args: 'Validity Date'
  • workcenter_id Many2one → mrp.workcenter
    string='Work Center' args: 'mrp.workcenter'
Public methods (1)
  • save(self)
    @api.multi
    Used in a wizard-like form view, manual save button when in edit mode

New fields (8)
  • lot_id Many2one → stock.production.lot
    string='Lot' args: 'stock.production.lot'
  • produce_line_ids One2many → mrp.product.produce.line
    string='Product to Track' args: 'mrp.product.produce.line', 'product_produce_id'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • product_tracking Selection
    readonly=True related='product_id.tracking'
  • product_uom_id Many2one → product.uom
    args: 'product.uom', 'Unit of Measure'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial Boolean
    args: 'Requires Serial'
Public methods (3)
  • check_finished_move_lots(self)
    @api.multi
  • default_get(self, fields)
    @api.model
  • do_produce(self)
    @api.multi

New fields (7)
  • lot_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Lot'
  • move_id Many2one → stock.move
    args: 'stock.move'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • product_produce_id Many2one → mrp.product.produce
    args: 'mrp.product.produce'
  • product_uom_id Many2one → product.uom
    args: 'product.uom', 'Unit of Measure'
  • qty_done Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Done'
  • qty_to_consume Float
    digits=dp.get_precision('Product Unit of Measure') args: 'To Consume'
Public methods (0)

No public methods.

New fields (40)
  • availability Selection
    compute='_compute_availability' store=True string='Materials Availability' args: [('assigned', 'Available'), ('partially_available', 'Partially Available'), ('waiting', 'Waiting'), ('none', 'None')]
  • bom_id Many2one → mrp.bom
    help='Bill of Materials allow you to define the list of required raw materials to make a finished product.' readonly=True states={'confirmed': [('readonly', False)]} args: 'mrp.bom', 'Bill of Material'
  • check_to_done Boolean
    compute='_get_produced_qty' help="Technical Field to see if we can show 'Mark as Done' button" string='Check Produced Qty'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • consumed_less_than_planned Boolean
    compute='_compute_consumed_less_than_planned' help='Technical field used to see if we have to display a warning or not when confirming an order.'
  • date_finished Datetime
    copy=False index=True readonly=True args: 'End Date'
  • date_planned_finished Datetime
    copy=False default=fields.Datetime.now index=True states={'confirmed': [('readonly', False)]} args: 'Deadline End'
  • date_planned_start Datetime
    copy=False default=fields.Datetime.now index=True oldname='date_planned' required=True states={'confirmed': [('readonly', False)]} args: 'Deadline Start'
  • date_start Datetime
    copy=False index=True readonly=True args: 'Start Date'
  • finished_move_line_ids One2many → stock.move.line
    compute='_compute_lines' inverse='_inverse_lines' string='Finished Product' args: 'stock.move.line'
  • has_moves Boolean
    compute='_has_moves'
  • is_locked Boolean
    copy=False default=True args: 'Is Locked'
  • location_dest_id Many2one → stock.location
    default=_get_default_location_dest_id help='Location where the system will stock the finished products.' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    default=_get_default_location_src_id help='Location where the system will look for components.' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'stock.location', 'Raw Materials Location'
  • move_dest_ids One2many → stock.move
    string='Stock Movements of Produced Goods' args: 'stock.move', 'created_production_id'
  • move_finished_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] oldname='move_lines' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'raw_material_production_id', 'Raw Materials'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' args: 'Source'
  • picking_type_id Many2one → stock.picking.type
    default=_get_default_picking_type required=True args: 'stock.picking.type', 'Operation Type'
  • post_visible Boolean
    compute='_compute_post_visible' help='Technical field to check when we can post' args: 'Allowed to Post Inventory'
  • priority Selection
    default='1' readonly=True states={'confirmed': [('readonly', False)]} args: [('0', 'Not urgent'), ('1', 'Normal'), ('2', 'Urgent'), ('3', 'Very Urgent')], 'Priority'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') readonly=True required=True states={'confirmed': [('readonly', False)]} track_visibility='onchange' args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_id Many2one → product.uom
    oldname='product_uom' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'product.uom', 'Product Unit of Measure'
  • production_location_id Many2one → stock.location
    related='product_id.property_stock_production' args: 'stock.location', 'Production Location'
  • propagate Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • routing_id Many2one → mrp.routing
    compute='_compute_routing' help='The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' readonly=True store=True args: 'mrp.routing', 'Routing'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • show_final_lots Boolean
    compute='_compute_show_lots' args: 'Show Final Lots'
  • state Selection
    copy=False default='confirmed' string='State' track_visibility='onchange' args: [('confirmed', 'Confirmed'), ('planned', 'Planned'), ('progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Allowed to Unreserve Inventory'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'Responsible'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_done_count Integer
    compute='_compute_workorder_done_count' args: '# Done Work Orders'
  • workorder_ids One2many → mrp.workorder
    copy=False oldname='workcenter_lines' readonly=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (16)
  • action_assign(self)
    @api.multi
  • action_cancel(self)
    @api.multi
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_see_move_scrap(self)
    @api.multi
  • action_toggle_is_locked(self)
  • button_mark_done(self)
    @api.multi
  • button_plan(self)
    @api.multi
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
    @api.multi
  • button_unreserve(self)
    @api.multi
  • create(self, values)
    @api.model
  • do_unreserve(self)
    @api.multi
  • onchange_picking_type(self)
    @api.onchange('picking_type_id', 'routing_id')
  • onchange_product_id(self)
    @api.onchange('product_id', 'picking_type_id', 'company_id')
    Finds UoM of changed product.
  • open_produce_product(self)
    @api.multi
  • post_inventory(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (7)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the routing without removing it.' args: 'Active'
  • code Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    help='Keep empty if you produce at the location where you find the raw materials. Set a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' args: 'stock.location', 'Raw Materials Location'
  • name Char
    required=True args: 'Routing Name'
  • note Text
    args: 'Description'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True oldname='workcenter_lines' args: 'mrp.routing.workcenter', 'routing_id', 'Operations'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (15)
  • batch Selection
    default='no' help="Set 'no' to schedule the next work order after the previous one. Set 'yes' to produce after the quantity set in 'Quantity To Process' has been produced." required=True string='Next Operation' args: [('no', 'Once all products are processed'), ('yes', 'Once a minimum number of products is processed')]
  • batch_size Float
    default=1.0 args: 'Quantity to Process'
  • company_id Many2one → res.company
    readonly=True related='routing_id.company_id' store=True args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • note Text
    args: 'Description'
  • routing_id Many2one → mrp.routing
    help='The routing contains all the Work Centers used and for how long. This will create work orders afterwards which alters the execution of the manufacturing order.' index=True ondelete='cascade' required=True args: 'mrp.routing', 'Parent Routing'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help='Time in minutes. Is the time used in manual mode, or the first time supposed in real time when there are not any work orders yet.' args: 'Manual Duration'
  • time_mode Selection
    default='auto' string='Duration Computation' args: [('auto', 'Compute based on real time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'worksheet'
Public methods (0)

No public methods.

New fields (13)
  • bom_id Many2one → mrp.bom
    domain=[('product_tmpl_id', '=', 'product_id.product_tmpl_id')] required=True states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • consume_line_ids One2many → stock.move
    readonly=True string='Consumed Disassembly Lines' args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    default=_get_default_location_dest_id required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    default=_get_default_location_id required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot'
  • mo_id Many2one → mrp.production
    domain="[('product_id', '=', product_id), ('state', 'in', ['done', 'cancel'])]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    readonly=True string='Processed Disassembly Lines' args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → product.uom
    required=True states={'done': [('readonly', True)]} args: 'product.uom', 'Unit of Measure'
  • state Selection
    default='draft' index=True string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (5)
  • action_unbuild(self)
    @api.multi
  • action_validate(self)
  • create(self, vals)
    @api.model
  • onchange_mo_id(self)
    @api.onchange('mo_id')
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (25)
  • active Boolean
    default=True related='resource_id.active' store=True args: 'Active'
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hour(s) over the last month' args: 'Blocked Time'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' oldname='capacity_per_cycle' args: 'Capacity'
  • code Char
    copy=False args: 'Code'
  • color Integer
    args: 'Color'
  • name Char
    related='resource_id.name' store=True
  • note Text
    help='Description of the Work Center.' args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='OEE Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hour(s) over the last month' args: 'Productive Time'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • time_efficiency Float
    default=100 related='resource_id.time_efficiency' store=True args: 'Time Efficiency'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    help='Time in minutes for the setup.' args: 'Time before prod.'
  • time_stop Float
    help='Time in minutes for the cleaning.' args: 'Time after prod.'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (1)
  • unblock(self)
    @api.multi

New fields (9)
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    related='loss_id.loss_type' store=True args: 'Effectiveness'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)
    @api.multi

New fields (4)
  • loss_type Selection
    default='availability' required=True args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')], 'Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (39)
  • active_move_line_ids One2many → stock.move.line
    domain=[('done_wo', '=', False)] args: 'stock.move.line', 'workorder_id'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' args: 'Capacity'
  • color Integer
    compute='_compute_color' args: 'Color'
  • date_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective End Date'
  • date_planned_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Scheduled Date Finished'
  • date_planned_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Scheduled Date Start'
  • date_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective Start Date'
  • duration Float
    compute='_compute_duration' readonly=True store=True args: 'Real Duration'
  • duration_expected Float
    digits=(16, 2) help='Expected duration (in minutes)' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' readonly=True store=True args: 'Duration Per Unit'
  • final_lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.production.lot', 'Lot/Serial Number'
  • is_produced Boolean
    compute='_compute_is_produced' string='Has Been Produced'
  • is_user_working Boolean
    compute='_compute_is_user_working' help='Technical field indicating whether the current user is working. ' args: 'Is the Current User Working'
  • move_line_ids One2many → stock.move.line
    domain=[('done_wo', '=', True)] help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.line', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    args: 'stock.move', 'workorder_id', 'Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • next_work_order_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Next Work Order'
  • operation_id Many2one → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'Operation'
  • product_id Many2one → product.product
    help='Technical: used in views only.' readonly=True related='production_id.product_id' store=True args: 'product.product', 'Product'
  • product_tracking Selection
    help='Technical: used in views only.' related='production_id.product_id.tracking' args: 'Product Tracking'
  • product_uom_id Many2one → product.uom
    help='Technical: used in views only.' readonly=True related='production_id.product_uom_id' args: 'product.uom', 'Unit of Measure'
  • production_availability Selection
    help='Technical: used in views and domains only.' readonly=True related='production_id.availability' store=True args: 'Stock Availability'
  • production_date Datetime
    related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    index=True ondelete='cascade' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} track_visibility='onchange' args: 'mrp.production', 'Manufacturing Order'
  • production_messages Html
    compute='_compute_production_messages' args: 'Workorder Message'
  • production_state Selection
    help='Technical: used in views only.' readonly=True related='production_id.state' args: 'Production State'
  • qty_produced Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • qty_remaining Float
    compute='_compute_qty_remaining' digits=dp.get_precision('Product Unit of Measure') args: 'Quantity To Be Produced'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • state Selection
    default='pending' string='Status' args: [('pending', 'Pending'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workorder_id'
  • tracking Selection
    related='production_id.product_id.tracking'
  • workcenter_id Many2one → mrp.workcenter
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    help='Technical: used in views only' related='workcenter_id.working_state' args: 'Workcenter Status'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
Public methods (13)
  • action_cancel(self)
    @api.multi
  • action_see_move_scrap(self)
    @api.multi
  • button_done(self)
    @api.multi
  • button_finish(self)
    @api.multi
  • button_pending(self)
    @api.multi
  • button_scrap(self)
    @api.multi
  • button_start(self)
    @api.multi
  • button_unblock(self)
    @api.multi
  • end_all(self)
    @api.multi
  • end_previous(self, doall=False)
    @api.multi
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • name_get(self)
    @api.multi
  • record_production(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (1)
  • action Selection
    selection_add=[('manufacture', 'Manufacture')]
Public methods (0)

No public methods.

New fields (3)
  • bom_count Integer
    compute='_compute_bom_count' args: '# Bill of Material'
  • mo_count Integer
    compute='_compute_mo_count' args: '# Manufacturing Orders'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' args: '# BoM Where Used'
Public methods (2)
  • action_used_in_bom(self)
    @api.multi
  • action_view_bom(self)
    @api.multi

New fields (5)
  • bom_count Integer
    compute='_compute_bom_count' args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • mo_count Integer
    compute='_compute_mo_count' args: '# Manufacturing Orders'
  • produce_delay Float
    default=0.0 help='Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added.' args: 'Manufacturing Lead Time'
  • used_in_bom_count Integer
    compute='_compute_used_in_bom_count' args: '# of BoM Where is Used'
Public methods (2)
  • action_used_in_bom(self)
    @api.multi
  • action_view_mos(self)
    @api.multi

New fields (0)

No new fields.

Public methods (2)
  • get_lines(self, boms)
    @api.multi
  • get_report_values(self, docids, data=None)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • get_children(self, records, level=0)
  • get_report_values(self, docids, data=None)
    @api.multi

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (9)
  • group_mrp_routings Boolean
    implied_group='mrp.group_mrp_routings' args: 'Work Orders & Quality'
  • manufacturing_lead Float
    related='company_id.manufacturing_lead' string='Manufacturing Lead Time'
  • module_mrp_byproduct Boolean
    args: 'By-Products'
  • module_mrp_maintenance Boolean
    args: 'Maintenance'
  • module_mrp_mps Boolean
    args: 'Master Production Schedule'
  • module_mrp_plm Boolean
    args: 'Product Lifecycle Management (PLM)'
  • module_mrp_repair Boolean
    args: 'Repair'
  • module_quality_mrp Boolean
    args: 'Quality'
  • use_manufacturing_lead Boolean
    oldname='default_use_manufacturing_lead' string='Default Manufacturing Lead Time'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • active_move_line_ids One2many → stock.move.line
    domain=[('done_wo', '=', True)] string='Lots' args: 'stock.move.line', 'move_id'
  • bom_line_id Many2one → mrp.bom.line
    args: 'mrp.bom.line', 'BoM Line'
  • consume_unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Consumed Disassembly Order'
  • created_production_id Many2one → mrp.production
    args: 'mrp.production', 'Created Production Order'
  • finished_lots_exist Boolean
    compute='_compute_order_finished_lot_ids' args: 'Finished Lots Exist'
  • is_done Boolean
    compute='_compute_is_done' help='Technical Field to order moves' store=True args: 'Done'
  • needs_lots Boolean
    compute='_compute_needs_lots' args: 'Tracking'
  • operation_id Many2one → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'Operation To Consume'
  • order_finished_lot_ids Many2many → stock.production.lot
    compute='_compute_order_finished_lot_ids' args: 'stock.production.lot'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order for finished products'
  • raw_material_production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order for raw materials'
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Disassembly Order'
  • unit_factor Float
    args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order To Consume'
Public methods (2)
  • action_explode(self)
    Explodes pickings
  • default_get(self, fields_list)
    @api.model

New fields (6)
  • done_move Boolean
    related='move_id.is_done' store=True args: 'Move Done'
  • done_wo Boolean
    default=True help='Technical Field which is False when temporarily filled in in work order' args: 'Done for Work Order'
  • lot_produced_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Finished Lot'
  • lot_produced_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='Informative, not used in matching' args: 'Quantity Finished Product'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • write(self, vals)
    @api.multi

New fields (4)
  • code Selection
    selection_add=[('mrp_operation', 'Manufacturing Operation')]
  • count_mo_late Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Late'
  • count_mo_todo Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders to Process'
  • count_mo_waiting Integer
    compute='_get_mo_count' string='Number of Manufacturing Orders Waiting'
Public methods (1)
  • get_mrp_stock_picking_action_picking_type(self)

New fields (1)
  • use_next_on_work_order_id Many2one → mrp.workorder
    help='Technical: used to figure out default serial number on work orders' args: 'mrp.workorder'
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    help='Not to restrict or prefer quants, but informative.' states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_links(self, move_line)
    @api.model

New fields (3)
  • manu_type_id Many2one → stock.picking.type
    domain=[('code', '=', 'mrp_operation')] args: 'stock.picking.type', 'Manufacturing Operation Type'
  • manufacture_pull_id Many2one → procurement.rule
    args: 'procurement.rule', 'Manufacture Rule'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture in this Warehouse'
Public methods (4)
  • create_routes(self)
    @api.multi
  • create_sequences_and_picking_types(self)
  • get_routes_dict(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (1)
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild'
Public methods (1)
  • action_done(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/mrp
VERSION
VERSION 2.0
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Julien Legros, qdp-odoo, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Martin Geubelle, Pierre Masereel, len-odoo, amoyaux
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - report
    - stock
    - procurement
    - barcodes
    - web_planner
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage the Manufacturing process in Odoo
===========================================

The manufacturing module allows you to cover planning, ordering, stocks and the manufacturing or assembly of products from raw materials and components. It handles the consumption and production of products according to a bill of materials and the necessary operations on machinery, tools or human resources according to routings.

It supports complete integration and planification of stockable goods, consumables or services. Services are completely integrated with the rest of the software. For instance, you can set up a sub-contracting service in a bill of materials to automatically purchase on order the assembly of your production.

Key Features
------------
* Make to Stock/Make to Order
* Multi-level bill of materials, no limit
* Multi-level routing, no limit
* Routings and work center integrated with analytic accounting
* Periodical scheduler computation
* Allows to browse bills of materials in a complete structure that includes child and phantom bills of materials

Dashboard / Reports for MRP will include:
-----------------------------------------
* Procurements in Exception (Graph)
* Stock Value Variation (Graph)
* Work Order Analysis
    

Code Analysis

Views touched (73)
XML IDNameModelTypeStatus
assets_backend mrp assets ir.ui.view qweb Inherits web.assets_backend
mrp_bom_component_tree_view mrp.bom.component.tree mrp.bom.line tree New
mrp_bom_cost_report mrp_bom_cost_report ir.ui.view qweb New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_line_tree_view mrp.bom.tree mrp.bom.line tree New
mrp_bom_line_view_form mrp.bom.line.view.form mrp.bom.line form New
mrp_bom_structure_report mrp_bom_structure_report ir.ui.view qweb New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_message_view_form mrp.message.view.form mrp.message form New
mrp_message_view_form_embedded_bom mrp.message.view.form.embedded.bom mrp.message form New
mrp_message_view_form_embedded_product mrp.message.view.form.embedded.product mrp.message form New
mrp_message_view_search mrp.message.view.search mrp.message search New
mrp_message_view_tree mrp.message.view.tree mrp.message tree New
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_production_workcenter_form_view_inherit mrp.production.work.order.form mrp.workorder form New
mrp_production_workcenter_tree_view_inherit mrp.production.work.order.tree mrp.workorder tree New
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_unbuild_form_view mrp.unbuild.form mrp.unbuild form New
mrp_unbuild_search_view mrp.unbuild.search mrp.unbuild search New
mrp_unbuild_tree_view mrp.unbuild.tree mrp.unbuild tree New
mrp_workcenter_block_wizard_form mrp.workcenter.productivity.form mrp.workcenter.productivity form New
mrp_workcenter_kanban mrp.workcenter.kanban mrp.workcenter kanban New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
mrp_workorder_view_gantt mrp.workorder.view.gantt mrp.workorder gantt New
oee_form_view mrp.workcenter.productivity.form mrp.workcenter.productivity form New
oee_graph_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_loss_form_view mrp.workcenter.productivity.loss.form mrp.workcenter.productivity.loss form New
oee_loss_search_view mrp.workcenter.productivity.loss.search mrp.workcenter.productivity.loss search New
oee_loss_tree_view mrp.workcenter.productivity.loss.tree mrp.workcenter.productivity.loss tree New
oee_pie_view mrp.workcenter.productivity.graph mrp.workcenter.productivity graph New
oee_pivot_view mrp.workcenter.productivity.pivot mrp.workcenter.productivity pivot New
oee_search_view mrp.workcenter.productivity.search mrp.workcenter.productivity search New
oee_tree_view mrp.workcenter.productivity.tree mrp.workcenter.productivity tree New
product_product_form_view_bom_button product.product.procurement product.product div Inherits product.product_normal_form_view
product_template_form_view_bom_button product.template.procurement product.template div Inherits product.product_template_only_form_view
product_template_search_view_procurment product.template.search.bom product.template xpath Inherits product.product_template_search_view
report_mrporder report_mrporder ir.ui.view qweb New
stock_production_type_kanban stock.picking.type.kanban stock.picking.type field Inherits stock.stock_picking_type_kanban
stock_scrap_view_form2_mrp_inherit_mrp stock.scrap.view.form2.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view2
stock_scrap_view_form_mrp_inherit_mrp stock.scrap.view.form.inherit.mrp stock.scrap field Inherits stock.stock_scrap_form_view
view_change_production_qty_wizard Change Quantity To Produce change.production.qty form New
view_document_file_kanban_mrp ir.attachment kanban.mrp ir.attachment kanban New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_bom_line_filter mrp.bom.line.select mrp.bom.line search New
view_mrp_config mrp settings mrp.config.settings form New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template group Inherits stock.view_template_property_form
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_production_work_order_search mrp.production.work.order.search mrp.workorder search New
view_mrp_production_workcenter_form_view_filter mrp.production.work.order.select mrp.workorder search New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_procurement_form_inherit procurement.order.form.inherit procurement.order data Inherits procurement.procurement_form_view
view_procurement_rule_form_stock_inherit_mrp procurement.rule.form.stock.inherit.mrp procurement.rule field Inherits stock.view_procurement_rule_form_stock_inherit
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_stock_move_lots stock.move.lots.form stock.move form New
view_warehouse_inherited Stock Warehouse Inherited stock.warehouse xpath Inherits stock.view_warehouse
view_work_center_load_graph report.workcenter.load.graph mrp.workorder graph New
view_workcenter_load_pivot report.workcenter.load.pivot mrp.workorder pivot New
workcenter_line_calendar mrp.production.work.order.calendar mrp.workorder calendar New
workcenter_line_gantt_production mrp.production.work.order.gantt.production mrp.workorder gantt New
workcenter_line_graph mrp.production.work.order.graph mrp.workorder graph New
workcenter_line_kanban mrp.production.work.order.kanban mrp.workorder kanban New
workcenter_line_pivot mrp.production.work.order.pivot mrp.workorder pivot New
Models touched (29)

New fields (2)
  • mo_id Many2one → mrp.production
    required=True args: 'mrp.production', 'Manufacturing Order'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True args: 'Quantity To Produce'
Public methods (2)
  • change_prod_qty(self)
    @api.multi
  • default_get(self, fields)
    @api.model

New fields (1)
  • priority Selection
    help='Gives the sequence order when displaying a list of tasks.' string='Priority' args: [('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Very High')]
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the bills of material without removing it.' args: 'Active'
  • bom_line_ids One2many → mrp.bom.line
    copy=True args: 'mrp.bom.line', 'bom_id', 'BoM Lines'
  • code Char
    args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • picking_type_id Many2one → stock.picking.type
    domain=[('code', '=', 'mrp_operation')] help='When a procurement has a ‘produce’ route with a picking type set, it will try to create a Manufacturing Order for that product using a BoM of the same picking type. That allows to define procurement rules which trigger different manufacturing orders with different BoMs. ' args: 'stock.picking.type', 'Picking Type'
  • product_id Many2one → product.product
    domain="['&', ('product_tmpl_id', '=', product_tmpl_id), ('type', 'in', ['product', 'consu'])]" help='If a product variant is defined the BOM is available only for this product.' args: 'product.product', 'Product Variant'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Unit of Measure') required=True args: 'Quantity'
  • product_tmpl_id Many2one → product.template
    domain="[('type', 'in', ['product', 'consu'])]" required=True args: 'product.template', 'Product'
  • product_uom_id Many2one → product.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' oldname='product_uom' required=True args: 'product.uom', 'Product Unit of Measure'
  • ready_to_produce Selection
    default='asap' required=True string='Manufacturing Readiness' args: [('all_available', 'All components available'), ('asap', 'The components of 1st operation')]
  • routing_id Many2one → mrp.routing
    help='The operations for producing this BoM. When a routing is specified, the production orders will be executed through work orders, otherwise everything is processed in the production order itself. ' args: 'mrp.routing', 'Routing'
  • sequence Integer
    help='Gives the sequence order when displaying a list of bills of material.' args: 'Sequence'
  • type Selection
    default='normal' help='Kit (Phantom): When processing a sales order for this product, the delivery order will contain the raw materials, instead of the finished product.' required=True args: [('normal', 'Manufacture this product'), ('phantom', 'Ship this product as a set of components (kit)')], 'BoM Type'
Public methods (6)
  • explode(self, product, quantity, picking_type=False)
    Explodes the BoM and creates two lists with all the information you need: bom_done and line_done Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM
  • name_get(self)
    @api.multi
  • onchange_product_tmpl_id(self)
    @api.onchange('product_tmpl_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')
  • onchange_routing_id(self)
    @api.onchange('routing_id')
  • unlink(self)
    @api.multi

New fields (11)
  • attribute_value_ids Many2many → product.attribute.value
    help='BOM Product Variants needed form apply this line.' string='Variants' args: 'product.attribute.value'
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' required=True args: 'mrp.bom', 'Parent BoM'
  • child_bom_id Many2one → mrp.bom
    compute='_compute_child_bom_id' args: 'mrp.bom', 'Sub BoM'
  • child_line_ids One2many → mrp.bom.line
    compute='_compute_child_line_ids' string='BOM lines of the referred bom' args: 'mrp.bom.line'
  • has_attachments Boolean
    compute='_compute_has_attachments' args: 'Has Attachments'
  • operation_id Many2one → mrp.routing.workcenter
    help='The operation where the components are consumed, or the finished products created.' args: 'mrp.routing.workcenter', 'Consumed in Operation'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True args: 'Product Quantity'
  • product_uom_id Many2one → product.uom
    default=_get_default_product_uom_id help='Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control' oldname='product_uom' required=True args: 'product.uom', 'Product Unit of Measure'
  • routing_id Many2one → mrp.routing
    help='The list of operations to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' related='bom_id.routing_id' store=True args: 'mrp.routing', 'Routing'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying.' args: 'Sequence'
Public methods (4)
  • action_see_attachments(self)
    @api.multi
  • create(self, values)
    @api.model
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom_id(self)
    @api.onchange('product_uom_id')

New fields (9)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • group_mrp_routings Selection
    help='Work Order Operations allow you to create and manage the manufacturing operations that should be followed within your work centers in order to produce a product. They are attached to bills of materials that will define the required raw materials.' implied_group='mrp.group_mrp_routings' args: [(0, 'Manage production by manufacturing orders'), (1, 'Manage production by work orders')], 'Routings & Planning'
  • group_product_variant Selection
    help='Work with product variant allows you to define some variant of the same products, an ease the product management in the ecommerce for example' implied_group='product.group_product_variant' args: [(0, 'No variants on products'), (1, 'Products can have several attributes, defining variants (Example: size, color,...)')], 'Product Variants'
  • manufacturing_lead Float
    related='company_id.manufacturing_lead' string='Manufacturing Lead Time *'
  • module_mrp_byproduct Selection
    help='You can configure by-products in the bill of material.\nWithout this module: A + B + C -> D.\nWith this module: A + B + C -> D + E.\n-This installs the module mrp_byproduct.' args: [(0, 'No by-products in bills of materials (A + B --> C)'), (1, 'Bills of materials may produce residual products (A + B --> C + D)')], 'By-Products'
  • module_mrp_maintenance Selection
    string='Maintenance' args: [(0, 'No maintenance machine and work centers'), (1, 'Preventive and Corrective maintenance management')]
  • module_mrp_mps Selection
    string='Master Production Schedule' args: [(0, 'No need for Master Production Schedule as products have short lead times'), (1, 'Use Master Production Schedule in order to create procurements based on forecasts')]
  • module_mrp_plm Selection
    string='PLM' args: [(0, 'No product lifecycle management'), (1, 'Manage engineering changes, versions and documents')]
  • module_quality_mrp Selection
    string='Quality' args: [(0, 'No quality control'), (1, 'Manage quality control points, checks and measures')]
Public methods (0)

No public methods.

New fields (8)
  • bom_id Many2one → mrp.bom
    domain="['|', ('product_id', '=', product_id), ('product_tmpl_id.product_variant_ids','=', product_id)]" args: 'mrp.bom', 'Bill of Material'
  • message Html
    required=True
  • name Text
    compute='_get_note_first_line' store=True
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • product_tmpl_id Many2one → product.template
    args: 'product.template', 'Product Template'
  • routing_id Many2one → mrp.routing
    string='Routing' args: 'mrp.routing'
  • valid_until Date
    default=_default_valid_until required=True args: 'Validity Date'
  • workcenter_id Many2one → mrp.workcenter
    string='Work Center' args: 'mrp.workcenter'
Public methods (1)
  • save(self)
    @api.multi
    Used in a wizard-like form view, manual save button when in edit mode

New fields (8)
  • consume_line_ids Many2many → stock.move.lots
    string='Product to Track' args: 'stock.move.lots', 'mrp_produce_stock_move_lots'
  • lot_id Many2one → stock.production.lot
    string='Lot' args: 'stock.production.lot'
  • product_id Many2one → product.product
    args: 'product.product', 'Product'
  • product_qty Float
    digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • product_tracking Selection
    related='product_id.tracking'
  • product_uom_id Many2one → product.uom
    args: 'product.uom', 'Unit of Measure'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production'
  • serial Boolean
    args: 'Requires Serial'
Public methods (3)
  • check_finished_move_lots(self)
    @api.multi
  • default_get(self, fields)
    @api.model
  • do_produce(self)
    @api.multi

New fields (35)
  • availability Selection
    compute='_compute_availability' store=True string='Availability' args: [('assigned', 'Available'), ('partially_available', 'Partially Available'), ('waiting', 'Waiting'), ('none', 'None')]
  • bom_id Many2one → mrp.bom
    help='Bill of Materials allow you to define the list of required raw materials to make a finished product.' readonly=True states={'confirmed': [('readonly', False)]} args: 'mrp.bom', 'Bill of Material'
  • check_to_done Boolean
    compute='_get_produced_qty' help="Technical Field to see if we can show 'Mark as Done' button" string='Check Produced Qty'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • date_finished Datetime
    copy=False index=True readonly=True args: 'End Date'
  • date_planned_finished Datetime
    copy=False default=fields.Datetime.now index=True states={'confirmed': [('readonly', False)]} args: 'Deadline End'
  • date_planned_start Datetime
    copy=False default=fields.Datetime.now index=True oldname='date_planned' required=True states={'confirmed': [('readonly', False)]} args: 'Deadline Start'
  • date_start Datetime
    copy=False index=True readonly=True args: 'Start Date'
  • has_moves Boolean
    compute='_has_moves'
  • location_dest_id Many2one → stock.location
    default=_get_default_location_dest_id help='Location where the system will stock the finished products.' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'stock.location', 'Finished Products Location'
  • location_src_id Many2one → stock.location
    default=_get_default_location_src_id help='Location where the system will look for components.' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'stock.location', 'Raw Materials Location'
  • move_finished_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'production_id', 'Finished Products'
  • move_raw_ids One2many → stock.move
    copy=False domain=[('scrapped', '=', False)] oldname='move_lines' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.move', 'raw_material_production_id', 'Raw Materials'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • origin Char
    copy=False help='Reference of the document that generated this production order request.' args: 'Source'
  • picking_type_id Many2one → stock.picking.type
    default=_get_default_picking_type required=True args: 'stock.picking.type', 'Picking Type'
  • post_visible Boolean
    compute='_compute_post_visible' help='Technical field to check when we can post' args: 'Inventory Post Visible'
  • priority Selection
    default='1' readonly=True states={'confirmed': [('readonly', False)]} args: [('0', 'Not urgent'), ('1', 'Normal'), ('2', 'Urgent'), ('3', 'Very Urgent')], 'Priority'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • procurement_ids One2many → procurement.order
    args: 'procurement.order', 'production_id', 'Related Procurements'
  • product_id Many2one → product.product
    domain=[('type', 'in', ['product', 'consu'])] readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'product.product', 'Product'
  • product_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'Quantity To Produce'
  • product_tmpl_id Many2one → product.template
    readonly=True related='product_id.product_tmpl_id' args: 'product.template', 'Product Template'
  • product_uom_id Many2one → product.uom
    oldname='product_uom' readonly=True required=True states={'confirmed': [('readonly', False)]} args: 'product.uom', 'Product Unit of Measure'
  • propagate Boolean
    help='If checked, when the previous move of the move (which was generated by a next procurement) is cancelled or split, the move generated by this move will too' args: 'Propagate cancel and split'
  • qty_produced Float
    compute='_get_produced_qty' string='Quantity Produced'
  • routing_id Many2one → mrp.routing
    compute='_compute_routing' help='The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning.' readonly=True store=True args: 'mrp.routing', 'Routing'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'production_id', 'Scraps'
  • state Selection
    copy=False default='confirmed' string='State' track_visibility='onchange' args: [('confirmed', 'Confirmed'), ('planned', 'Planned'), ('progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • unreserve_visible Boolean
    compute='_compute_unreserve_visible' help='Technical field to check when we can unreserve' args: 'Inventory Unreserve Visible'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'Responsible'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_done_count Integer
    compute='_compute_workorder_done_count' args: '# Done Work Orders'
  • workorder_ids One2many → mrp.workorder
    copy=False oldname='workcenter_lines' readonly=True args: 'mrp.workorder', 'production_id', 'Work Orders'
Public methods (15)
  • action_assign(self)
    @api.multi
  • action_cancel(self)
    @api.multi
    Cancels production order, unfinished stock moves and set procurement orders in exception
  • action_see_move_scrap(self)
    @api.multi
  • button_mark_done(self)
    @api.multi
  • button_plan(self)
    @api.multi
    Create work orders. And probably do stuff, like things.
  • button_scrap(self)
    @api.multi
  • button_unreserve(self)
    @api.multi
  • create(self, values)
    @api.model
  • do_unreserve(self)
    @api.multi
  • onchange_picking_type(self)
    @api.onchange('picking_type_id')
  • onchange_product_id(self)
    @api.onchange('product_id', 'picking_type_id', 'company_id')
    Finds UoM of changed product.
  • open_produce_product(self)
    @api.multi
  • post_inventory(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (7)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the routing without removing it.' args: 'Active'
  • code Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • location_id Many2one → stock.location
    help='Keep empty if you produce at the location where you find the raw materials.Set a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations.' args: 'stock.location', 'Production Location'
  • name Char
    required=True args: 'Routing Name'
  • note Text
    args: 'Description'
  • operation_ids One2many → mrp.routing.workcenter
    copy=True oldname='workcenter_lines' args: 'mrp.routing.workcenter', 'routing_id', 'Operations'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (15)
  • batch Selection
    default='no' help='Will determine if the next work order will be planned after the previous one or after the first Quantity To Process of the previous one.' required=True string='Next Operation' args: [('no', 'Once all products are processed'), ('yes', 'Once a minimum number of products is processed')]
  • batch_size Float
    default=1.0 args: 'Quantity to Process'
  • company_id Many2one → res.company
    readonly=True related='routing_id.company_id' store=True args: 'res.company', 'Company'
  • name Char
    required=True args: 'Operation'
  • note Text
    args: 'Description'
  • routing_id Many2one → mrp.routing
    help='The routing contains all the Work Centers used and for how long. This will create work orders afterwardswhich alters the execution of the manufacturing order. ' index=True ondelete='cascade' required=True args: 'mrp.routing', 'Parent Routing'
  • sequence Integer
    default=100 help='Gives the sequence order when displaying a list of routing Work Centers.' args: 'Sequence'
  • time_cycle Float
    compute='_compute_time_cycle' args: 'Duration'
  • time_cycle_manual Float
    default=60 help='Time in minutes. Is the time used in manual mode, or the first time supposed in real time when there are not any work orders yet.' args: 'Manual Duration'
  • time_mode Selection
    default='auto' string='Duration Computation' args: [('auto', 'Compute based on real time'), ('manual', 'Set duration manually')]
  • time_mode_batch Integer
    default=10 args: 'Based on'
  • workcenter_id Many2one → mrp.workcenter
    required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_ids One2many → mrp.workorder
    string='Work Orders' args: 'mrp.workorder', 'operation_id'
  • worksheet Binary
    args: 'worksheet'
Public methods (0)

No public methods.

New fields (13)
  • bom_id Many2one → mrp.bom
    domain=[('product_tmpl_id', '=', 'product_id.product_tmpl_id')] required=True states={'done': [('readonly', True)]} args: 'mrp.bom', 'Bill of Material'
  • consume_line_ids One2many → stock.move
    help='' readonly=True args: 'stock.move', 'consume_unbuild_id'
  • has_tracking Selection
    readonly=True related='product_id.tracking'
  • location_dest_id Many2one → stock.location
    default=_get_default_location_dest_id required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Destination Location'
  • location_id Many2one → stock.location
    default=_get_default_location_id required=True states={'done': [('readonly', True)]} args: 'stock.location', 'Location'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)]} args: 'stock.production.lot', 'Lot'
  • mo_id Many2one → mrp.production
    domain="[('product_id', '=', product_id), ('state', 'in', ['done', 'cancel'])]" states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • name Char
    copy=False default=<expr> readonly=True args: 'Reference'
  • produce_line_ids One2many → stock.move
    help='' readonly=True args: 'stock.move', 'unbuild_id'
  • product_id Many2one → product.product
    required=True states={'done': [('readonly', True)]} args: 'product.product', 'Product'
  • product_qty Float
    required=True states={'done': [('readonly', True)]} args: 'Quantity'
  • product_uom_id Many2one → product.uom
    required=True states={'done': [('readonly', True)]} args: 'product.uom', 'Unit of Measure'
  • state Selection
    default='draft' index=True string='Status' args: [('draft', 'Draft'), ('done', 'Done')]
Public methods (4)
  • action_unbuild(self)
    @api.multi
  • create(self, vals)
    @api.model
  • onchange_mo_id(self)
    @api.onchange('mo_id')
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (22)
  • blocked_time Float
    compute='_compute_blocked_time' digits=(16, 2) help='Blocked hour(s) over the last month' args: 'Blocked Time'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' oldname='capacity_per_cycle' args: 'Capacity'
  • color Integer
    args: 'Color'
  • note Text
    help='Description of the Work Center.' args: 'Description'
  • oee Float
    compute='_compute_oee' help='Overall Equipment Effectiveness, based on the last month'
  • oee_target Float
    default=90 help='OEE Target in percentage' string='OEE Target'
  • order_ids One2many → mrp.workorder
    args: 'mrp.workorder', 'workcenter_id', 'Orders'
  • performance Integer
    compute='_compute_performance' help='Performance over the last month' args: 'Performance'
  • productive_time Float
    compute='_compute_productive_time' digits=(16, 2) help='Productive hour(s) over the last month' args: 'Productive Time'
  • resource_id Many2one → resource.resource
    ondelete='cascade' required=True args: 'resource.resource', 'Resource'
  • routing_line_ids One2many → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'workcenter_id', 'Routing Lines'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of work centers.' required=True args: 'Sequence'
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workcenter_id', 'Time Logs'
  • time_start Float
    help='Time in minutes for the setup.' args: 'Time before prod.'
  • time_stop Float
    help='Time in minutes for the cleaning.' args: 'Time after prod.'
  • workcenter_load Float
    compute='_compute_workorder_count' args: 'Work Center Load'
  • working_state Selection
    compute='_compute_working_state' store=True args: [('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'In Progress')], 'Status'
  • workorder_count Integer
    compute='_compute_workorder_count' args: '# Work Orders'
  • workorder_late_count Integer
    compute='_compute_workorder_count' args: 'Total Late Orders'
  • workorder_pending_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_progress_count Integer
    compute='_compute_workorder_count' args: 'Total Running Orders'
  • workorder_ready_count Integer
    compute='_compute_workorder_count' args: '# Read Work Orders'
Public methods (1)
  • unblock(self)
    @api.multi

New fields (9)
  • date_end Datetime
    args: 'End Date'
  • date_start Datetime
    default=fields.Datetime.now required=True args: 'Start Date'
  • description Text
    args: 'Description'
  • duration Float
    compute='_compute_duration' store=True args: 'Duration'
  • loss_id Many2one → mrp.workcenter.productivity.loss
    ondelete='restrict' required=True args: 'mrp.workcenter.productivity.loss', 'Loss Reason'
  • loss_type Selection
    related='loss_id.loss_type' store=True args: 'Effectiveness'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
  • workcenter_id Many2one → mrp.workcenter
    required=True args: 'mrp.workcenter', 'Work Center'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order'
Public methods (1)
  • button_block(self)
    @api.multi

New fields (4)
  • loss_type Selection
    default='availability' required=True args: [('availability', 'Availability'), ('performance', 'Performance'), ('quality', 'Quality'), ('productive', 'Productive')], 'Effectiveness Category'
  • manual Boolean
    default=True args: 'Is a Blocking Reason'
  • name Char
    required=True args: 'Reason'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (37)
  • active_move_lot_ids One2many → stock.move.lots
    domain=[('done_wo', '=', False)] args: 'stock.move.lots', 'workorder_id'
  • capacity Float
    default=1.0 help='Number of pieces that can be produced in parallel.' args: 'Capacity'
  • color Integer
    compute='_compute_color' args: 'Color'
  • date_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective End Date'
  • date_planned_finished Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Scheduled Date Finished'
  • date_planned_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Scheduled Date Start'
  • date_start Datetime
    states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Effective Start Date'
  • duration Float
    compute='_compute_duration' readonly=True store=True args: 'Real Duration'
  • duration_expected Float
    digits=(16, 2) help='Expected duration (in minutes)' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Expected Duration'
  • duration_percent Integer
    compute='_compute_duration' group_operator='avg' readonly=True store=True args: 'Duration Deviation (%)'
  • duration_unit Float
    compute='_compute_duration' readonly=True store=True args: 'Duration Per Unit'
  • final_lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'stock.production.lot', 'Current Lot'
  • is_produced Boolean
    compute='_compute_is_produced'
  • is_user_working Boolean
    compute='_compute_is_user_working' help='Technical field indicating whether the current user is working. ' args: 'Is Current User Working'
  • move_lot_ids One2many → stock.move.lots
    domain=[('done_wo', '=', True)] help='Inventory moves for which you must scan a lot number at this work order' args: 'stock.move.lots', 'workorder_id', 'Moves to Track'
  • move_raw_ids One2many → stock.move
    args: 'stock.move', 'workorder_id', 'Moves'
  • name Char
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Work Order'
  • next_work_order_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Next Work Order'
  • operation_id Many2one → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'Operation'
  • product_id Many2one → product.product
    help='Technical: used in views only.' readonly=True related='production_id.product_id' args: 'product.product', 'Product'
  • product_tracking Selection
    help='Technical: used in views only.' related='production_id.product_id.tracking' args: 'Product Tracking'
  • product_uom_id Many2one → product.uom
    help='Technical: used in views only.' readonly=True related='production_id.product_uom_id' args: 'product.uom', 'Unit of Measure'
  • production_availability Selection
    help='Technical: used in views and domains only.' readonly=True related='production_id.availability' store=True args: 'Stock Availability'
  • production_date Datetime
    related='production_id.date_planned_start' store=True args: 'Production Date'
  • production_id Many2one → mrp.production
    index=True ondelete='cascade' required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} track_visibility='onchange' args: 'mrp.production', 'Manufacturing Order'
  • production_messages Html
    compute='_compute_production_messages' args: 'Workorder Message'
  • production_state Selection
    help='Technical: used in views only.' readonly=True related='production_id.state' args: 'Production State'
  • qty_produced Float
    default=0.0 digits=dp.get_precision('Product Unit of Measure') help='The number of products already handled by this work order' readonly=True args: 'Quantity'
  • qty_producing Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Currently Produced Quantity'
  • qty_production Float
    readonly=True related='production_id.product_qty' args: 'Original Production Quantity'
  • scrap_count Integer
    compute='_compute_scrap_move_count' string='Scrap Move'
  • scrap_ids One2many → stock.scrap
    args: 'stock.scrap', 'workorder_id'
  • state Selection
    default='pending' string='Status' args: [('pending', 'Pending'), ('ready', 'Ready'), ('progress', 'In Progress'), ('done', 'Finished'), ('cancel', 'Cancelled')]
  • time_ids One2many → mrp.workcenter.productivity
    args: 'mrp.workcenter.productivity', 'workorder_id'
  • workcenter_id Many2one → mrp.workcenter
    required=True states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'mrp.workcenter', 'Work Center'
  • working_state Selection
    help='Technical: used in views only' related='workcenter_id.working_state' args: 'Workcenter Status'
  • worksheet Binary
    readonly=True related='operation_id.worksheet' args: 'Worksheet'
Public methods (12)
  • action_cancel(self)
    @api.multi
  • action_see_move_scrap(self)
    @api.multi
  • button_done(self)
    @api.multi
  • button_finish(self)
    @api.multi
  • button_pending(self)
    @api.multi
  • button_scrap(self)
    @api.multi
  • button_start(self)
    @api.multi
  • button_unblock(self)
    @api.multi
  • end_all(self)
    @api.multi
  • end_previous(self, doall=False)
    @api.multi
    @param: doall: This will close all open time lines on the open work orders when doall = True, otherwise only the one of the current user
  • record_production(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (2)
  • bom_id Many2one → mrp.bom
    index=True ondelete='cascade' args: 'mrp.bom', 'BoM'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Manufacturing Order'
Public methods (2)
  • make_mo(self)
    @api.multi
    Create production orders from procurements
  • propagate_cancels(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • bom_count Integer
    compute='_compute_bom_count' args: '# Bill of Material'
  • mo_count Integer
    compute='_compute_mo_count' args: '# Manufacturing Orders'
Public methods (1)
  • action_view_bom(self)
    @api.multi

New fields (4)
  • bom_count Integer
    compute='_compute_bom_count' args: '# Bill of Material'
  • bom_ids One2many → mrp.bom
    args: 'mrp.bom', 'product_tmpl_id', 'Bill of Materials'
  • mo_count Integer
    compute='_compute_mo_count' args: '# Manufacturing Orders'
  • produce_delay Float
    default=0.0 help='Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added.' args: 'Manufacturing Lead Time'
Public methods (1)
  • action_view_mos(self)
    @api.multi

New fields (0)

No new fields.

Public methods (2)
  • get_children(self, object, level=0)
  • render_html(self, docids, data=None)
    @api.multi

New fields (0)

No new fields.

Public methods (2)
  • get_lines(self, boms)
    @api.multi
  • render_html(self, docids, data=None)
    @api.model

New fields (1)
  • manufacturing_lead Float
    default=0.0 help='Security days for each manufacturing operation.' required=True args: 'Manufacturing Lead Time'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (15)
  • active_move_lot_ids One2many → stock.move.lots
    domain=[('done_wo', '=', True)] string='Lots' args: 'stock.move.lots', 'move_id'
  • bom_line_id Many2one → mrp.bom.line
    args: 'mrp.bom.line', 'BoM Line'
  • consume_unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Consume Unbuild Order'
  • has_tracking Selection
    related='product_id.tracking' string='Product with Tracking'
  • is_done Boolean
    compute='_compute_is_done' help='Technical Field to order moves' store=True args: 'Done'
  • move_lot_ids One2many → stock.move.lots
    string='Lots' args: 'stock.move.lots', 'move_id'
  • operation_id Many2one → mrp.routing.workcenter
    args: 'mrp.routing.workcenter', 'Operation To Consume'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order for finished products'
  • quantity_available Float
    compute='_qty_available' digits=dp.get_precision('Product Unit of Measure') args: 'Quantity Available'
  • quantity_done Float
    compute='_qty_done_compute' digits=dp.get_precision('Product Unit of Measure') inverse='_qty_done_set' args: 'Quantity'
  • quantity_done_store Float
    digits=0 args: 'Quantity done store'
  • raw_material_production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order for raw materials'
  • unbuild_id Many2one → mrp.unbuild
    args: 'mrp.unbuild', 'Unbuild Order'
  • unit_factor Float
    args: 'Unit Factor'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order To Consume'
Public methods (10)
  • action_assign(self, no_prepare=False)
    @api.multi
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
  • action_explode(self)
    Explodes pickings
  • check_move_lots(self)
    @api.multi
  • create_lots(self)
    @api.multi
  • move_validate(self)
    @api.multi
    Validate moves based on a production order.
  • save(self)
    @api.multi
  • split_move_lot(self)
    @api.multi

New fields (12)
  • done_move Boolean
    related='move_id.is_done' store=True args: 'Move Done'
  • done_wo Boolean
    default=True help='Technical Field which is False when temporarily filled in in work order' args: 'Done for Work Order'
  • lot_id Many2one → stock.production.lot
    domain="[('product_id', '=', product_id)]" args: 'stock.production.lot', 'Lot'
  • lot_produced_id Many2one → stock.production.lot
    args: 'stock.production.lot', 'Finished Lot'
  • lot_produced_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='Informative, not used in matching' args: 'Quantity Finished Product'
  • move_id Many2one → stock.move
    args: 'stock.move', 'Move'
  • plus_visible Boolean
    compute='_compute_plus' args: 'Plus Visible'
  • product_id Many2one → product.product
    readonly=True related='move_id.product_id' store=True args: 'product.product', 'Product'
  • production_id Many2one → mrp.production
    args: 'mrp.production', 'Production Order'
  • quantity Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') args: 'To Do'
  • quantity_done Float
    digits=dp.get_precision('Product Unit of Measure') args: 'Done'
  • workorder_id Many2one → mrp.workorder
    args: 'mrp.workorder', 'Work Order'
Public methods (3)
  • do_minus(self)
    @api.multi
  • do_plus(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (4)
  • code Selection
    selection_add=[('mrp_operation', 'Manufacturing Operation')]
  • count_mo_late Integer
    compute='_get_mo_count'
  • count_mo_todo Integer
    compute='_get_mo_count'
  • count_mo_waiting Integer
    compute='_get_mo_count'
Public methods (0)

No public methods.

New fields (2)
  • consumed_quant_ids Many2many → stock.quant
    args: 'stock.quant', 'stock_quant_consume_rel', 'produce_quant_id', 'consume_quant_id'
  • produced_quant_ids Many2many → stock.quant
    args: 'stock.quant', 'stock_quant_consume_rel', 'consume_quant_id', 'produce_quant_id'
Public methods (0)

No public methods.

New fields (2)
  • production_id Many2one → mrp.production
    states={'done': [('readonly', True)]} args: 'mrp.production', 'Manufacturing Order'
  • workorder_id Many2one → mrp.workorder
    help='Not to restrict or prefer quants, but informative.' states={'done': [('readonly', True)]} args: 'mrp.workorder', 'Work Order'
Public methods (0)

No public methods.

New fields (3)
  • manu_type_id Many2one → stock.picking.type
    domain=[('code', '=', 'mrp_operation')] args: 'stock.picking.type', 'Manufacturing Picking Type'
  • manufacture_pull_id Many2one → procurement.rule
    args: 'procurement.rule', 'Manufacture Rule'
  • manufacture_to_resupply Boolean
    default=True help='When products are manufactured, they can be manufactured in this warehouse.' args: 'Manufacture in this Warehouse'
Public methods (4)
  • create_routes(self)
    @api.multi
  • create_sequences_and_picking_types(self)
  • get_routes_dict(self)
    @api.multi
  • write(self, vals)
    @api.multi
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/mrp
VERSION
VERSION 1.1
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, David Monjoie, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Yannick Tivisse, qsm-odoo, Martin Geubelle, Adrien Dieudonne, Sheth Sunny
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - report
    - procurement
    - stock_account
    - stock
    - barcodes
    - web_planner
    - account
    - analytic
    - web_tip
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage the Manufacturing process in Odoo
===========================================

The manufacturing module allows you to cover planning, ordering, stocks and the manufacturing or assembly of products from raw materials and components. It handles the consumption and production of products according to a bill of materials and the necessary operations on machinery, tools or human resources according to routings.

It supports complete integration and planification of stockable goods, consumables or services. Services are completely integrated with the rest of the software. For instance, you can set up a sub-contracting service in a bill of materials to automatically purchase on order the assembly of your production.

Key Features
------------
* Make to Stock/Make to Order
* Multi-level bill of materials, no limit
* Multi-level routing, no limit
* Routings and work center integrated with analytic accounting
* Periodical scheduler computation 
* Allows to browse bills of materials in a complete structure that includes child and phantom bills of materials

Dashboard / Reports for MRP will include:
-----------------------------------------
* Procurements in Exception (Graph)
* Stock Value Variation (Graph)
* Work Order Analysis
    

Code Analysis

Views touched (49)
XML IDNameModelTypeStatus
mrp_bom_component_tree_view mrp.bom.component.tree mrp.bom.line tree New
mrp_bom_cost mrp_bom_cost ir.ui.view qweb New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_line_tree_view mrp.bom.tree mrp.bom.line tree New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_company res.company.mrp.config res.company xpath Inherits base.view_company_form
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_kanban_view mrp.production.kanban mrp.production kanban New
mrp_production_product_form_view mrp.production.product.line.form mrp.production.product.line form New
mrp_production_product_tree_view mrp.production.product.line.tree mrp.production.product.line tree New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_property_form_view mrp.property.form mrp.property form New
mrp_property_group_form_view mrp.property.group.form mrp.property.group form New
mrp_property_tree_view mrp.property.tree mrp.property tree New
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
product_product_form_view_bom_button product.product.procurement product.product div Inherits product.product_normal_form_view
product_template_form_view_bom_button product.template.procurement product.template div Inherits product.product_template_only_form_view
product_template_search_view_procurment product.template.search.bom product.template xpath Inherits product.product_template_search_view
report_mrpbomstructure report_mrpbomstructure ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
view_change_production_qty_wizard Change Product Qty change.production.qty form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_bom_line_filter mrp.bom.line.select mrp.bom.line search New
view_mrp_config mrp settings mrp.config.settings form New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template group Inherits stock.view_template_property_form
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_property_search mrp.property.search mrp.property search New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_procurement_form_inherit procurement.order.form.inherit procurement.order data Inherits procurement.procurement_form_view
view_procurement_rule_form_stock_inherit_mrp procurement.rule.form.stock.inherit.mrp procurement.rule field Inherits stock.view_procurement_rule_form_stock_inherit
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_production_pivot mrp.production.pivot mrp.production pivot New
view_report_in_out_picking_form report.mrp.inout.form report.mrp.inout form New
view_report_in_out_picking_graph report.mrp.inout.graph report.mrp.inout graph New
view_report_in_out_picking_tree report.mrp.inout.tree report.mrp.inout tree New
view_stock_move_consume_wizard Consume Move stock.move.consume form New
view_warehouse_inherited Stock Warehouse Inherited stock.warehouse xpath Inherits stock.view_warehouse
view_workcenter_load_graph report.workcenter.load.graph report.workcenter.load graph New
view_workcenter_load_search report.workcenter.load.search report.workcenter.load search New
view_workcenter_load_tree report.workcenter.load.tree report.workcenter.load tree New
Models touched (2)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • get_lines(self, boms)
    @api.multi
  • render_html(self, data=None)
    @api.multi
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/mrp
VERSION
VERSION 1.1
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Atul Patel (OpenERP), Stephane Wirtel, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Foram Katharotiya (OpenERP), Purnendu Singh (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Tejas Tank, Thibault Delavallée, Vo Minh Thu, Josse Colpaert, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, Christophe Simonis, Xavier Morel, Goffin Simon, Anael Closson, Bhumi Thakkar (Open ERP), Cedric Snauwaert, Simon Lejeune, Frédéric van der Essen, Vishmita, Nicolas Martinelli, dhr, RGA(OpenERP), Amit Bhavsar (Open ERP), Anand Patel (OpenERP), Nimesh Contractor (OpenERP), Richard Mathot, qdp-odoo, Géry Debongnie, Darshan Kalola (OpenERP Trainee), Holger Brunn, jke-openerp, Aaron Bohy, bth-openerp, Bharat R. Devnani (OpenERP), Richard Mathot (OpenERP), ged-odoo, openerp-sle, Gery Debongnie, Randhir Mayatra rma-openerp, Amit Vora (OpenERP Trainee), sgo@tinyerp.com, Darshan Kalola (OpenERP), Darshan Kalola, Jitendra Prajapati (OpenERP), Sunil Sharma (OpenERP), Pooja Zankhariya (OpenERP), Jignesh Rathod (OpenERP), Yannick Tivisse, Yogesh Parekh (OpenERP Trainee)
WEBSITE
WEBSITEhttps://www.odoo.com/page/manufacturing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:40
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - report
    - procurement
    - stock_account
    - stock
    - board
    - web_kanban_gauge
    - web_kanban_sparkline
    - account
    - analytic
    - edi
    - email_template
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage the Manufacturing process in OpenERP
===========================================

The manufacturing module allows you to cover planning, ordering, stocks and the manufacturing or assembly of products from raw materials and components. It handles the consumption and production of products according to a bill of materials and the necessary operations on machinery, tools or human resources according to routings.

It supports complete integration and planification of stockable goods, consumables or services. Services are completely integrated with the rest of the software. For instance, you can set up a sub-contracting service in a bill of materials to automatically purchase on order the assembly of your production.

Key Features
------------
* Make to Stock/Make to Order
* Multi-level bill of materials, no limit
* Multi-level routing, no limit
* Routing and work center integrated with analytic accounting
* Periodical scheduler computation 
* Allows to browse bills of materials in a complete structure that includes child and phantom bills of materials

Dashboard / Reports for MRP will include:
-----------------------------------------
* Procurements in Exception (Graph)
* Stock Value Variation (Graph)
* Work Order Analysis
    

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
mrp_bom_component_tree_view mrp.bom.component.tree mrp.bom.line tree New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_tree_view mrp.bom.tree mrp.bom.line tree New
mrp_company res.company.mrp.config res.company xpath Inherits base.view_company_form
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_product_form_view mrp.production.product.line.form mrp.production.product.line form New
mrp_production_product_tree_view mrp.production.product.line.tree mrp.production.product.line tree New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_property_form_view mrp.property.form mrp.property form New
mrp_property_group_form_view mrp.property.group.form mrp.property.group form New
mrp_property_tree_view mrp.property.tree mrp.property tree New
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
product_product_form_view_bom_button product.product.procurement product.product div Inherits product.product_normal_form_view
product_template_form_view_bom_button product.template.procurement product.template div Inherits product.product_template_only_form_view
product_template_search_view_procurment product.template.search.bom product.template xpath Inherits product.product_template_search_view
report_mrpbomstructure report_mrpbomstructure ir.ui.view qweb New
report_mrporder report_mrporder ir.ui.view qweb New
view_change_production_qty_wizard Change Product Qty change.production.qty form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_bom_line_filter mrp.bom.line.select mrp.bom.line search New
view_mrp_config mrp settings mrp.config.settings form New
view_mrp_product_price_wizard Product Cost Structure mrp.product_price form New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_product_template_form_inherited product.form.mrp.inherited product.template xpath Inherits stock.view_template_property_form
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_property_search mrp.property.search mrp.property search New
view_mrp_workcenter_load_wizard Work Center Load mrp.workcenter.load form New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_procurement_form_inherit procurement.order.form.inherit procurement.order data Inherits procurement.procurement_form_view
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_report_in_out_picking_form report.mrp.inout.form report.mrp.inout form New
view_report_in_out_picking_graph report.mrp.inout.graph report.mrp.inout graph New
view_report_in_out_picking_tree report.mrp.inout.tree report.mrp.inout tree New
view_stock_move_consume_wizard Consume Move stock.move.consume form New
view_warehouse_inherited Stock Warehouse Inherited stock.warehouse xpath Inherits stock.view_warehouse
view_workcenter_load_graph report.workcenter.load.graph report.workcenter.load graph New
view_workcenter_load_search report.workcenter.load.search report.workcenter.load search New
view_workcenter_load_tree report.workcenter.load.tree report.workcenter.load tree New
Models touched (1)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/mrp
VERSION
VERSION 1.1
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Pinakin Nayi (OpenERP), Benoit Guillot, DBR (OpenERP), Harry (OpenERP), Antonin Bourguignon, ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Arnaud Pineux, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Alexis de Lattre, niv-openerp, Christophe Simonis, Dharti Ratani (OpenERP), Khushboo Bhatt (Open ERP), Mohammed Shekha, Bhumi Thakkar (Open ERP), Cedric Snauwaert, Ravish Murari (OpenERP), Amit Patel, Frédéric van der Essen, Gilles Major, Nicolas Martinelli, dhr, Alexandre Fayolle, Lionel Sausin, alexandre.fayolle@camptocamp.com, Paramjit Singh Sahota, Rifakat, Jagdish Panchal, Julien Legros, Laetitia Gangloff (Acsone), Jigar Amin (OpenERP), Bharat R. Devnani (OpenERP), Najlaâ El Khayat
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - process
    - web
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - procurement
    - stock
    - account
    - analytic
    - board
    - edi
    - email_template
    - resource
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage the Manufacturing process in OpenERP
===========================================

The manufacturing module allows you to cover planning, ordering, stocks and the manufacturing or assembly of products from raw materials and components. It handles the consumption and production of products according to a bill of materials and the necessary operations on machinery, tools or human resources according to routings.

It supports complete integration and planification of stockable goods, consumables or services. Services are completely integrated with the rest of the software. For instance, you can set up a sub-contracting service in a bill of materials to automatically purchase on order the assembly of your production.

Key Features
------------
* Make to Stock/Make to Order
* Multi-level bill of materials, no limit
* Multi-level routing, no limit
* Routing and work center integrated with analytic accounting
* Periodical scheduler computation 
* Allows to browse bills of materials in a complete structure that includes child and phantom bills of materials

Dashboard / Reports for MRP will include:
-----------------------------------------
* Procurements in Exception (Graph)
* Stock Value Variation (Graph)
* Work Order Analysis
    

Code Analysis

Views touched (41)
XML IDNameModelTypeStatus
board_mrp_manager_form board.mrp.manager.form board.board form New
mrp_bom_component_tree_view mrp.bom.component.tree mrp.bom tree New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_company res.company.mrp.config res.company xpath Inherits base.view_company_form
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_product_form_view mrp.production.product.line.form mrp.production.product.line form New
mrp_production_product_tree_view mrp.production.product.line.tree mrp.production.product.line tree New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_property_form_view mrp.property.form mrp.property form New
mrp_property_group_form_view mrp.property.group.form mrp.property.group form New
mrp_property_tree_view mrp.property.tree mrp.property tree New
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
product_form_view_bom_button product.product.procurement product.product xpath Inherits product.product_normal_form_view
product_product_normal_form_supply_view product.normal.form.mrp.inherit product.product xpath Inherits procurement.product_form_view_procurement_button
product_search_form_view_procurment product.search.bom product.product xpath Inherits product.product_search_form_view
view_change_production_qty_wizard Change Product Qty change.production.qty form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_config mrp settings mrp.config.settings form New
view_mrp_product_price_wizard Product Cost Structure mrp.product_price form New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_property_search mrp.property.search mrp.property search New
view_mrp_workcenter_load_wizard Work Center Load mrp.workcenter.load form New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_procurement_form_inherit procurement.order.form.inherit procurement.order data Inherits procurement.procurement_form_view
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_report_in_out_picking_form report.mrp.inout.form report.mrp.inout form New
view_report_in_out_picking_graph report.mrp.inout.graph report.mrp.inout graph New
view_report_in_out_picking_tree report.mrp.inout.tree report.mrp.inout tree New
view_workcenter_load_graph report.workcenter.load.graph report.workcenter.load graph New
view_workcenter_load_search report.workcenter.load.search report.workcenter.load search New
view_workcenter_load_tree report.workcenter.load.tree report.workcenter.load tree New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/mrp
VERSION
VERSION 1.1
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Rucha (Open ERP), Stephane Wirtel, Numerigraphe - Lionel Sausin, DBR (OpenERP), Harry (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Divyesh Makwana (Open ERP), Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Mayur Maheshwari (OpenERP), vro, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Xavier Morel, Chris Biersbach, Amit (OpenERP), Minh Tran, Amit Dodiya, Amit Bhavsar (Open ERP), Najlaâ, Thibault Francois, Carlos Vásquez, Bogdan Stanciu, ksa (Open ERP), Els Van Vossel, Israel Fermin Montilla, Rifakat Haradwala (Open ERP), mayur maheshwari (Open ERP), ssu, rch-openerp, aag (OpenERP), Yogesh (OpenERP), Sbh (OpenERP), ron@tinyerp.com, fp, AMP (OpenERP), Tejas (OpenERP), Amit Parmar (OpenERP), RavishchanraMurari (Open ERP), Kirti Savalia (OpenERP), Atik Agewan (OpenERP), Ravi Gohil (Open ERP), rpa (Open ERP)
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - procurement
    - base
    - process
    - product
    - decimal_precision
    - stock
    - account
    - base_setup
    - analytic
    - board
    - edi
    - email_template
    - mail
    - base_tools
    - resource
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This is the base module to manage the manufacturing process in OpenERP.
=======================================================================

Features:
---------
    * Make to Stock / Make to Order (by line)
    * Multi-level BoMs, no limit
    * Multi-level routing, no limit
    * Routing and work center integrated with analytic accounting
    * Scheduler computation periodically / Just In Time module
    * Multi-pos, multi-warehouse
    * Different reordering policies
    * Cost method by product: standard price, average price
    * Easy analysis of troubles or needs
    * Very flexible
    * Allows to browse Bill of Materials in complete structure that include child and phantom BoMs

It supports complete integration and planification of stockable goods,
consumable of services. Services are completely integrated with the rest
of the software. For instance, you can set up a sub-contracting service
in a BoM to automatically purchase on order the assembly of your production.

Reports provided by this module:
--------------------------------
    * Bill of Material structure and components
    * Load forecast on Work Centers
    * Print a production order
    * Stock forecasts

Dashboard provided by this module:
----------------------------------
    * List of next production orders
    * List of procurements in exception
    * Graph of work center load
    * Graph of stock value variation
    

Code Analysis

Views touched (41)
XML IDNameModelTypeStatus
board_mrp_manager_form board.mrp.manager.form board.board form New
mrp_bom_component_tree_view mrp.bom.component.tree mrp.bom tree New
mrp_bom_form_view mrp.bom.form mrp.bom form New
mrp_bom_revision_form mrp.bom.revision mrp.bom.revision form New
mrp_bom_revision_tree mrp.bom.revision mrp.bom.revision tree New
mrp_bom_tree_view mrp.bom.tree mrp.bom tree New
mrp_company res.company.mrp.config res.company page Inherits base.view_company_form
mrp_production_form_view mrp.production.form mrp.production form New
mrp_production_lot_form_view mrp.production.lot.line.form mrp.production.lot.line form New
mrp_production_lot_tree_view mrp.production.lot.line.tree mrp.production.lot.line tree New
mrp_production_product_form_view mrp.production.product.line.form mrp.production.product.line form New
mrp_production_product_tree_view mrp.production.product.line.tree mrp.production.product.line tree New
mrp_production_tree_view mrp.production.tree mrp.production tree New
mrp_property_form_view mrp.property.form mrp.property form New
mrp_property_group_form_view mrp.property.group.form mrp.property.group form New
mrp_property_tree_view mrp.property.tree mrp.property tree New
mrp_routing_form_view mrp.routing.form mrp.routing form New
mrp_routing_search_view mrp.routing.search mrp.routing search New
mrp_routing_tree_view mrp.routing.tree mrp.routing tree New
mrp_routing_workcenter_form_view mrp.routing.workcenter.form mrp.routing.workcenter form New
mrp_routing_workcenter_tree_view mrp.routing.workcenter.tree mrp.routing.workcenter tree New
mrp_workcenter_tree_view mrp.workcenter.tree mrp.workcenter tree New
mrp_workcenter_view mrp.workcenter.form mrp.workcenter form New
view_change_production_qty_wizard Change Product Qty change.production.qty form New
view_mrp_bom_filter mrp.bom.select mrp.bom search New
view_mrp_product_price_wizard Product Cost Structure mrp.product_price form New
view_mrp_product_produce_wizard MRP Product Produce mrp.product.produce form New
view_mrp_production_filter mrp.production.select mrp.production search New
view_mrp_property_search mrp.property.search mrp.property search New
view_mrp_workcenter_load_wizard Work Center Load mrp.workcenter.load form New
view_mrp_workcenter_search mrp.workcenter.search mrp.workcenter search New
view_procurement_form_inherit procurement.order.form.inherit procurement.order data Inherits procurement.procurement_form_view
view_production_calendar mrp.production.calendar mrp.production calendar New
view_production_gantt mrp.production.gantt mrp.production gantt New
view_production_graph mrp.production.graph mrp.production graph New
view_report_in_out_picking_form report.mrp.inout.form report.mrp.inout form New
view_report_in_out_picking_graph report.mrp.inout.graph report.mrp.inout graph New
view_report_in_out_picking_tree report.mrp.inout.tree report.mrp.inout tree New
view_workcenter_load_graph report.workcenter.load.graph report.workcenter.load graph New
view_workcenter_load_search report.workcenter.load.search report.workcenter.load search New
view_workcenter_load_tree report.workcenter.load.tree report.workcenter.load tree New
Models touched (0)

No models found for this module.