Repository
OCA/manufacture · module folder · Try on Runboat
Module version
1.0.4
Category
Manufacturing
Folder size
0.63 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/manufacture
Last tracking update
2026-08-20 11:30:00
Authors
Odoo Community Association (OCA), ForgeFlow, Ucamco
Maintainers
Odoo Community Association (OCA), ForgeFlow, Ucamco
Committers
Lois Rilo, JordiMForgeFlow, Weblate, OCA-git-bot, oca-ci, bosd, Hotdgo9
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
ddmrp, mrp_multi_level_estimate
Description
This module allows you to calculate, based in known inventory, demand,
and supply, and based on parameters set at product variant level, the
new procurements for each product.

To do this, the calculation starts at top level of the bill of material
and explodes this down to the lowest level.

## Key Features

- MRP parameters set by product variant MRP area pairs.
- Cron job to calculate the MRP demand.
- Manually calculate the MRP demand.
- Confirm the calculated MRP demand and create PO's, or MO's.
- Able to see the products for which action is needed throught Planned
  Orders.
- Integration with [Stock Demand
  Estimates](https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_demand_estimate)
  system. Note: You need to install [mrp_multi_level_estimate
  module](https://github.com/OCA/manufacture/tree/12.0/mrp_multi_level_estimate).

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
mrp_area_form mrp.area.form mrp.area form New
mrp_area_list mrp.area.list mrp.area list New
mrp_inventory_form mrp.inventory.form mrp.inventory form New
mrp_inventory_list mrp.inventory.list mrp.inventory list New
mrp_inventory_search mrp.inventory.search mrp.inventory search New
mrp_move_view_form mrp.move.form mrp.move form New
mrp_move_view_list mrp.move.list mrp.move list New
mrp_planned_order_view_form mrp.planned.order.form mrp.planned.order form New
mrp_planned_order_view_list mrp.planned.order.list mrp.planned.order list New
mrp_planned_order_view_pivot mrp.planned.order.pivot mrp.planned.order pivot New
mrp_planned_order_view_search mrp.planned.order.search mrp.planned.order search New
product_mrp_area_form product.mrp.area.form product.mrp.area form New
product_mrp_area_list product.mrp.area.list product.mrp.area list New
product_mrp_area_search product.mrp.area.search product.mrp.area search New
product_template_only_form_view_mrp product.template.product.form.mrp product.template form Inherits product.product_template_only_form_view
view_location_form stock.location.form stock.location form Inherits stock.view_location_form
view_mrp_inventory_graph mrp.inventory.graph mrp.inventory graph New
view_mrp_inventory_pivot mrp.inventory.pivot mrp.inventory pivot New
view_mrp_inventory_procure_without_security mrp.inventory.procure.form - readonly qty mrp.inventory.procure form Inherits view_mrp_inventory_procure_wizard
view_mrp_inventory_procure_wizard mrp.inventory.procure.form mrp.inventory.procure form New
view_mrp_product_product_form view.product.mrp.area.product.form product.product form Inherits product.product_normal_form_view
view_run_mrp_multi_level_wizard Run MRP mrp.multi.level form New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (14)

New fields (6)
  • active Boolean
    default=True
  • calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' related='warehouse_id.calendar_id' string='Working Hours'
  • company_id Many2one → res.company
    comodel_name='res.company' related='warehouse_id.company_id' store=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' required=True string='Location'
  • name Char
    required=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (0)

No public methods.

New fields (18)
  • company_id Many2one → res.company
    comodel_name='res.company' related='product_mrp_area_id.mrp_area_id.warehouse_id.company_id' store=True
  • date Date
  • demand_qty Float
    string='Demand'
  • final_on_hand_qty Float
    aggregator='avg' string='Forecasted Inventory'
  • initial_on_hand_qty Float
    aggregator='avg' string='Starting Inventory'
  • main_supplier_id Many2one
    readonly=True related='product_mrp_area_id.main_supplier_id' store=True string='Main Supplier'
  • mrp_area_id Many2one → mrp.area
    comodel_name='mrp.area' related='product_mrp_area_id.mrp_area_id' store=True string='MRP Area'
  • mrp_planner_id Many2one
    readonly=True related='product_mrp_area_id.mrp_planner_id' store=True
  • order_release_date Date
    compute='_compute_order_release_date' store=True
  • planned_order_ids One2many → mrp.planned.order
    comodel_name='mrp.planned.order' inverse_name='mrp_inventory_id' readonly=True
  • product_id Many2one → product.product
    comodel_name='product.product' related='product_mrp_area_id.product_id' store=True
  • product_mrp_area_id Many2one → product.mrp.area
    comodel_name='product.mrp.area' index=True ondelete='cascade' required=True string='Product Parameters'
  • rfq_qty Float
    help='Quantity on Request for Quotation.\nThis quantity is included in the supply quantity but it is not confirmed yet.' string='RfQ'
  • running_availability Float
    aggregator='avg' help='Theoretical inventory level if all planned orders were released.' string='Planned Availability'
  • supply_method Selection
    readonly=True related='product_mrp_area_id.supply_method' store=True string='Supply Method'
  • supply_qty Float
    string='Supply'
  • to_procure Float
    compute='_compute_to_procure' store=True
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_uom_id' string='Product UoM'
Public methods (2)
  • action_open_planned_orders(self)
  • action_open_rfqs(self)

New fields (1)
  • item_ids One2many → mrp.inventory.procure.item
    comodel_name='mrp.inventory.procure.item' inverse_name='wiz_id' string='Items'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • make_procurement(self)

New fields (10)
  • date_planned Date
    required=True string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='Location'
  • mrp_inventory_id Many2one → mrp.inventory
    comodel_name='mrp.inventory' string='Mrp Inventory'
  • planned_order_id Many2one → mrp.planned.order
    comodel_name='mrp.planned.order'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
  • qty Float
    string='Quantity'
  • supply_method Selection
    readonly=True selection=[('buy', 'Buy'), ('none', 'Undefined'), ('manufacture', 'Produce'), ('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')]
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' string='Warehouse'
  • wiz_id Many2one → mrp.inventory.procure
    comodel_name='mrp.inventory.procure' ondelete='cascade' readonly=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (21)
  • bom_id Many2one → mrp.bom
    args: 'mrp.bom'
  • company_id Many2one → res.company
    comodel_name='res.company' related='product_mrp_area_id.mrp_area_id.warehouse_id.company_id' store=True
  • current_date Date
  • current_qty Float
  • mrp_area_id Many2one → mrp.area
    comodel_name='mrp.area' index=True related='product_mrp_area_id.mrp_area_id' store=True string='MRP Area'
  • mrp_date Date
    string='MRP Date'
  • mrp_order_number Char
    string='Order Number'
  • mrp_origin Selection
    selection=[('mo', 'Manufacturing Order'), ('po', 'Purchase Order'), ('mv', 'Move'), ('fc', 'Forecast'), ('mrp', 'MRP')] string='Origin'
  • mrp_qty Float
    string='MRP Quantity'
  • mrp_type Selection
    selection=[('s', 'Supply'), ('d', 'Demand')] string='Type'
  • name Char
    string='Description'
  • origin Char
    string='Source Document'
  • parent_product_id Many2one → product.product
    comodel_name='product.product' index=True string='Parent Product'
  • planned_order_up_ids Many2many → mrp.planned.order
    column1='move_down_id' column2='order_id' comodel_name='mrp.planned.order' relation='mrp_move_planned_order_rel' string='Planned Orders UP'
  • product_id Many2one → product.product
    comodel_name='product.product' related='product_mrp_area_id.product_id' store=True
  • product_mrp_area_id Many2one → product.mrp.area
    comodel_name='product.mrp.area' index=True ondelete='cascade' required=True string='Product MRP Area'
  • production_id Many2one → mrp.production
    comodel_name='mrp.production' index=True string='Manufacturing Order'
  • purchase_line_id Many2one → purchase.order.line
    comodel_name='purchase.order.line' index=True string='Purchase Order Line'
  • purchase_order_id Many2one → purchase.order
    comodel_name='purchase.order' index=True string='Purchase Order'
  • state Selection
    selection=[('draft', 'Draft'), ('assigned', 'Assigned'), ('confirmed', 'Confirmed'), ('waiting', 'Waiting'), ('partially_available', 'Partially Available'), ('ready', 'Ready'), ('sent', 'Sent'), ('to approve', 'To Approve'), ('approved', 'Approved')]
  • stock_move_id Many2one → stock.move
    comodel_name='stock.move' index=True string='Stock Move'
Public methods (0)

No public methods.

New fields (1)
  • mrp_area_ids Many2many → mrp.area
    comodel_name='mrp.area' help='If empty, all areas will be computed.' string='MRP Areas to run'
Public methods (5)
  • create_action(self, product_mrp_area_id, mrp_date, mrp_qty, name, values=None)
    @api.model
  • create_planned_order(self, product_mrp_area_id, mrp_qty, name, mrp_date_supply, mrp_action_date, values=None)
    @api.model
  • explode_action(self, product_mrp_area_id, mrp_action_date, name, qty, action, values=None)
    @api.model
    Explode requirements.
  • run_mrp_multi_level(self)
  • should_build_time_phased_inventory(self, product_mrp_area)

New fields (17)
  • company_id Many2one → res.company
    comodel_name='res.company' related='product_mrp_area_id.mrp_area_id.warehouse_id.company_id' store=True
  • due_date Date
    help='Date in which the supply must have been completed.' required=True
  • fixed Boolean
    default=True
  • mo_count Integer
    compute='_compute_mrp_production_count'
  • mrp_action Selection
    selection=[('manufacture', 'Manufacturing Order'), ('phantom', 'Kit'), ('buy', 'Purchase Order'), ('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push'), ('none', 'None')] string='Action'
  • mrp_area_id Many2one → mrp.area
    comodel_name='mrp.area' index=True readonly=True related='product_mrp_area_id.mrp_area_id' store=True string='MRP Area'
  • mrp_inventory_id Many2one → mrp.inventory
    comodel_name='mrp.inventory' ondelete='set null' string='Associated MRP Inventory'
  • mrp_move_down_ids Many2many → mrp.move
    column1='order_id' column2='move_down_id' comodel_name='mrp.move' relation='mrp_move_planned_order_rel' string='MRP Move DOWN'
  • mrp_planner_id Many2one
    readonly=True related='product_mrp_area_id.mrp_planner_id' store=True
  • mrp_production_ids One2many → mrp.production
    string='Manufacturing Orders' args: 'mrp.production', 'planned_order_id'
  • mrp_qty Float
    string='Quantity'
  • name Char
    string='Description'
  • order_release_date Date
    help='Order release date planned by MRP.' required=True string='Release Date'
  • origin Char
    string='Source Document'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True related='product_mrp_area_id.product_id' store=True
  • product_mrp_area_id Many2one → product.mrp.area
    comodel_name='product.mrp.area' index=True ondelete='cascade' required=True string='Product MRP Area'
  • qty_released Float
    readonly=True
Public methods (2)
  • action_open_linked_mrp_production(self)
  • action_toggle_fixed(self)

New fields (1)
  • planned_order_id Many2one → mrp.planned.order
    comodel_name='mrp.planned.order' index=True
Public methods (0)

No public methods.

New fields (27)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company' related='mrp_area_id.warehouse_id.company_id' store=True
  • distribution_lead_time Float
  • location_id Many2one
    related='mrp_area_id.location_id'
  • location_proc_id Many2one → stock.location
    comodel_name='stock.location' domain="[('location_id', 'child_of', location_id)]" help="Set this if you need to procure from a different locationthan area's location." string='Procure Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' index=True store=True string='Main Supplier'
  • main_supplierinfo_id Many2one → product.supplierinfo
    comodel_name='product.supplierinfo' compute='_compute_main_supplier' store=True string='Supplier Info'
  • mrp_applicable Boolean
    string='MRP Applicable'
  • mrp_area_id Many2one → mrp.area
    comodel_name='mrp.area' required=True
  • mrp_exclude Boolean
    string='Exclude from MRP'
  • mrp_inspection_delay Integer
    string='Inspection Delay'
  • mrp_lead_time Float
    compute='_compute_mrp_lead_time' string='Lead Time'
  • mrp_maximum_order_qty Float
    default=0.0 string='Maximum Order Qty'
  • mrp_minimum_order_qty Float
    default=0.0 string='Minimum Order Qty'
  • mrp_minimum_stock Float
    string='Safety Stock'
  • mrp_move_ids One2many → mrp.move
    comodel_name='mrp.move' inverse_name='product_mrp_area_id' readonly=True
  • mrp_nbr_days Integer
    default=0 help='Number of days to group demand for this product during the MRP run, in order to determine the quantity to order.' string='Nbr. Days'
  • mrp_planner_id Many2one → res.users
    args: 'res.users'
  • mrp_qty_multiple Float
    default=1.0 string='Qty Multiple'
  • mrp_transit_delay Integer
    default=0 string='Transit Delay'
  • mrp_verified Boolean
    help='Identifies that this product has been verified to be valid for the MRP.' string='Verified for MRP'
  • planned_order_ids One2many → mrp.planned.order
    comodel_name='mrp.planned.order' inverse_name='product_mrp_area_id' readonly=True
  • product_id Many2one → product.product
    comodel_name='product.product' ondelete='cascade' required=True string='Product'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' readonly=True related='product_id.product_tmpl_id' store=True
  • qty_available Float
    compute='_compute_qty_available' string='Quantity Available'
  • supply_bom_id Many2one → mrp.bom
    comodel_name='mrp.bom' compute='_compute_supply_method' string='Supply BoM'
  • supply_method Selection
    compute='_compute_supply_method' selection=[('buy', 'Buy'), ('none', 'Undefined'), ('manufacture', 'Produce'), ('phantom', 'Kit'), ('pull', 'Pull From'), ('push', 'Push To'), ('pull_push', 'Pull & Push')]
Public methods (4)
  • action_view_incoming_stock_moves(self)
  • action_view_outgoing_stock_moves(self)
  • action_view_stock_moves(self, domain)
  • update_min_qty_from_main_supplier(self)

New fields (5)
  • llc Integer
    default=0 index=True string='Low Level Code'
  • manufacturing_order_ids One2many → mrp.production
    comodel_name='mrp.production' domain=[('state', '=', 'draft')] inverse_name='product_id' string='Manufacturing Orders'
  • mrp_area_count Integer
    compute='_compute_mrp_area_count' readonly=True string='MRP Area Parameter Count'
  • mrp_area_ids One2many → product.mrp.area
    comodel_name='product.mrp.area' inverse_name='product_id' string='MRP Area parameters'
  • purchase_order_line_ids One2many → purchase.order.line
    comodel_name='purchase.order.line' inverse_name='product_id' string='Purchase Orders'
Public methods (2)
  • action_view_mrp_area_parameters(self)
  • write(self, values)

New fields (2)
  • mrp_area_count Integer
    compute='_compute_mrp_area_count' readonly=True string='MRP Area Parameter Count'
  • mrp_area_ids One2many → product.mrp.area
    comodel_name='product.mrp.area' inverse_name='product_tmpl_id' string='MRP Area parameters'
Public methods (1)
  • action_view_mrp_area_parameters(self)

New fields (1)
  • mrp_area_count Integer
    compute='_compute_mrp_area_count' readonly=True string='MRP Area Parameter Count'
Public methods (1)
  • action_view_mrp_area_location(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.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…