DDMRP

ddmrp
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/19.0/ddmrp
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, Don Kendall, oca-ci, DavidJForgeFlow, Paula Marfull, dkendall
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_location_is_sublocation
    - stock_move_quantity_product_uom
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==3.9.0
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Demand Driven Material Requirements Planning is a formal multi-echelon
planning and execution method developed by Ms. Carol Ptak and Mr. Chad
Smith.

DDMRP combines blended aspects of Material Requirements Planning (MRP),
Distribution Requirements Planning (DRP) with the pull and visibility
emphases found in Lean and the Theory of Constraints and the variability
reduction emphasis of Six Sigma.

This method has five sequential components:

1.  *Strategic Inventory Positioning*. Answers the question "Given our
    system and environment, where should we place inventory to have the
    best protection?" and determines where should decoupling points of
    inventory be placed.
2.  *Buffer Profiles and Levels*. Determine the amount of protection at
    those decoupling points.
3.  *Dynamic Adjustments*. Allow the company to adapt buffers to group
    and individual part trait changes over time through the use of
    several types of adjustments.
4.  *Demand Driven Planning*. Allow to launch purchase orders (POs),
    manufacturing orders (MOs) and Transfer Orders (TOs) based on the
    priority dictated by the buffers.
5.  *Visible and Collaborative Execution*. These POs, MOs and TOs have
    to be effectively managed to synchronize with the changes that often
    occur within the "execution horizon."

These five components work together to greatly dampen, if not eliminate,
the nervousness of traditional MRP systems and the bullwhip effect in
complex and challenging environments.

This approach provides real information about those parts that are truly
at risk of negatively impacting the planned availability of inventory.

DDMRP sorts the significant few items that require attention from the
many parts that are being managed. Under the DDMRP approach, fewer
planners can make better decisions more quickly. That means companies
will be better able to leverage their working and human capital.

Demand Driven Material Requirements Planning is quickly being adopted by
a wide variety of leading companies across the world.

Some of the benefits reported by the DDMRP method include:

- High fill rate performance
- Lead time reductions
- Inventory reductions, while improving customer service
- Eliminate costs related to expedite
- Planners see priorities instead of constantly fighting the conflicting
  messages of MRP

It is highly recommended to read the book 'Demand Driven Material
Requirements Planning (DDMRP)' by Carol Ptak and Chad Smith.

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - ddmrp mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
product_template_only_form_view_inherit product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line list New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_inherit_ddmrp report_mrp_bom_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
report_mrp_bom_pdf_line_inherit_ddmrp report_mrp_bom_pdf_line_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer list New
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_search stock.move.search stock.move field Inherits stock.view_move_search
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method list New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time list New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile list New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability list New
view_warehouse stock.warehouse stock.warehouse xpath Inherits stock.view_warehouse
Models touched (27)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • make_procurement(self)

New fields (9)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
  • recommended_qty Float
    readonly=True
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (4)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (1)
  • buffer_count Integer
    compute='_compute_buffer_count'
Public methods (1)
  • action_view_stock_buffers(self)

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (11)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_purchase_hide_onhand_status Boolean
    string='Hide Purchase On-Hand Status'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (79)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_source_future Selection
    related='adu_calculation_method.source_future'
  • adu_calculation_method_source_past Selection
    related='adu_calculation_method.source_past'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute='_compute_ddmrp_chart_planning' string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute='_compute_ddmrp_chart_execution' string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move' help='All demand stock moves for this buffer'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • group_id Many2one → stock.rule
    comodel_name='stock.rule' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' domain="[('id', 'in', valid_uom_ids)]" readonly=False store=True string='Procurement UoM'
  • product_categ_id Many2one → product.category
    comodel_name='product.category' readonly=True related='product_id.categ_id' store=True string='Product Category'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('is_storable', '=', True)] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' readonly=True string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one
    related='product_id.uom_id'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    column1='stock_buffer_id' column2='stock_move_id' comodel_name='stock.move' help='Stock moves considered qualified demand for this buffer' relation='stock_buffer_qualified_demand_stock_move_rel'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_inside_dlt_qty Float
    help='Request for Quotation total quantity that is planned inside of the DLT horizon.' readonly=True string='RFQ Qty (Inside DLT)'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • rfq_total_qty Float
    help='Request for Quotation total quantity that is planned' readonly=True string='RFQ Total Qty'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • top_of_red Float
    related='red_zone_qty' store=True string='Top Of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • valid_uom_ids Many2many → uom.uom
    comodel_name='uom.uom' compute='_compute_valid_uom_ids'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
Public methods (30)
  • action_dummy(self)
  • action_request_procurement(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu_direct_demand(self)
  • action_view_future_adu_indirect_demand(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu_direct_demand(self)
  • action_view_past_adu_indirect_demand(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_moves(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply_moves(self)
  • action_view_supply_moves_inside_dlt_window(self)
  • action_view_supply_moves_outside_dlt_window(self)
  • action_view_supply_rfq_inside_dlt_window(self)
  • action_view_supply_rfq_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False, domain=None)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False, domain=None)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart_execution(self)
  • get_ddmrp_chart_planning(self)
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (2)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
  • qualified_demand_buffer_ids Many2many → stock.buffer
    column1='stock_move_id' column2='stock_buffer_id' comodel_name='stock.buffer' relation='stock_buffer_qualified_demand_stock_move_rel' string='Qualified Demand For Buffers'
Public methods (3)
  • action_open_stock_move_source(self)
    Open the source record of the stock move, if it exists.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a stock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/18.0/ddmrp
VERSION
VERSION 1.10.0
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSJacques-Etienne Baudoux, Akim Juillerat, Lois Rilo, Jordi Ballester Alomar, Weblate, OCA-git-bot, Simone Orsi, oca-ci, ThiagoMForgeFlow, DavidJForgeFlow, Henry Backman
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:12
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_location_is_sublocation
OCA/stock-logistics-workflow:
    - stock_move_quantity_product_uom
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==3.6.3
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Demand Driven Material Requirements Planning is a formal multi-echelon
planning and execution method developed by Ms. Carol Ptak and Mr. Chad
Smith.

DDMRP combines blended aspects of Material Requirements Planning (MRP),
Distribution Requirements Planning (DRP) with the pull and visibility
emphases found in Lean and the Theory of Constraints and the variability
reduction emphasis of Six Sigma.

This method has five sequential components:

1.  *Strategic Inventory Positioning*. Answers the question "Given our
    system and environment, where should we place inventory to have the
    best protection?" and determines where should decoupling points of
    inventory be placed.
2.  *Buffer Profiles and Levels*. Determine the amount of protection at
    those decoupling points.
3.  *Dynamic Adjustments*. Allow the company to adapt buffers to group
    and individual part trait changes over time through the use of
    several types of adjustments.
4.  *Demand Driven Planning*. Allow to launch purchase orders (POs),
    manufacturing orders (MOs) and Transfer Orders (TOs) based on the
    priority dictated by the buffers.
5.  *Visible and Collaborative Execution*. These POs, MOs and TOs have
    to be effectively managed to synchronize with the changes that often
    occur within the "execution horizon."

These five components work together to greatly dampen, if not eliminate,
the nervousness of traditional MRP systems and the bullwhip effect in
complex and challenging environments.

This approach provides real information about those parts that are truly
at risk of negatively impacting the planned availability of inventory.

DDMRP sorts the significant few items that require attention from the
many parts that are being managed. Under the DDMRP approach, fewer
planners can make better decisions more quickly. That means companies
will be better able to leverage their working and human capital.

Demand Driven Material Requirements Planning is quickly being adopted by
a wide variety of leading companies across the world.

Some of the benefits reported by the DDMRP method include:

- High fill rate performance
- Lead time reductions
- Inventory reductions, while improving customer service
- Eliminate costs related to expedite
- Planners see priorities instead of constantly fighting the conflicting
  messages of MRP

It is highly recommended to read the book 'Demand Driven Material
Requirements Planning (DDMRP)' by Carol Ptak and Chad Smith.

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - ddmrp mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
product_template_only_form_view_inherit product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line list New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_inherit_ddmrp report_mrp_bom_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
report_mrp_bom_pdf_line_inherit_ddmrp report_mrp_bom_pdf_line_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer list New
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_search stock.move.search stock.move field Inherits stock.view_move_search
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method list New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time list New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile list New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability list New
view_warehouse stock.warehouse stock.warehouse xpath Inherits stock.view_warehouse
Models touched (28)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • make_procurement(self)

New fields (9)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
  • recommended_qty Float
    readonly=True
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (4)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (1)
  • buffer_count Integer
    compute='_compute_buffer_count'
Public methods (1)
  • action_view_stock_buffers(self)

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (11)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_purchase_hide_onhand_status Boolean
    string='Hide Purchase On-Hand Status'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (78)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_source_future Selection
    related='adu_calculation_method.source_future'
  • adu_calculation_method_source_past Selection
    related='adu_calculation_method.source_past'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart_planning string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute=_compute_ddmrp_chart_execution string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move' help='All demand stock moves for this buffer'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • group_id Many2one → procurement.group
    comodel_name='procurement.group' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' readonly=False store=True string='Procurement UoM'
  • product_categ_id Many2one → product.category
    comodel_name='product.category' readonly=True related='product_id.categ_id' store=True string='Product Category'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('is_storable', '=', True)] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' readonly=True string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one
    related='product_id.uom_id'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    column1='stock_buffer_id' column2='stock_move_id' comodel_name='stock.move' help='Stock moves considered qualified demand for this buffer' relation='stock_buffer_qualified_demand_stock_move_rel'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_inside_dlt_qty Float
    help='Request for Quotation total quantity that is planned inside of the DLT horizon.' readonly=True string='RFQ Qty (Inside DLT)'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • rfq_total_qty Float
    help='Request for Quotation total quantity that is planned' readonly=True string='RFQ Total Qty'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • top_of_red Float
    related='red_zone_qty' store=True string='Top Of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
Public methods (31)
  • action_dummy(self)
  • action_request_procurement(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu_direct_demand(self)
  • action_view_future_adu_indirect_demand(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu_direct_demand(self)
  • action_view_past_adu_indirect_demand(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_moves(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply_moves(self)
  • action_view_supply_moves_inside_dlt_window(self)
  • action_view_supply_moves_outside_dlt_window(self)
  • action_view_supply_rfq_inside_dlt_window(self)
  • action_view_supply_rfq_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False, domain=None)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False, domain=None)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart_execution(self)
  • get_ddmrp_chart_planning(self)
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (2)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
  • qualified_demand_buffer_ids Many2many → stock.buffer
    column1='stock_move_id' column2='stock_buffer_id' comodel_name='stock.buffer' relation='stock_buffer_qualified_demand_stock_move_rel' string='Qualified Demand For Buffers'
Public methods (3)
  • action_open_stock_move_source(self)
    Open the source record of the stock move, if it exists.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a stock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/17.0/ddmrp
VERSION
VERSION 1.10.0
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSLois Rilo, Weblate, OCA-git-bot, oca-ci, RicardCForgeFlow, ThiagoMForgeFlow, DavidJForgeFlow, AlexPForgeFlow, Henry Backman
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_helper
OCA/stock-logistics-workflow:
    - stock_move_quantity_product_uom
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==3.4.1
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Demand Driven Material Requirements Planning is a formal multi-echelon
planning and execution method developed by Ms. Carol Ptak and Mr. Chad
Smith.

DDMRP combines blended aspects of Material Requirements Planning (MRP),
Distribution Requirements Planning (DRP) with the pull and visibility
emphases found in Lean and the Theory of Constraints and the variability
reduction emphasis of Six Sigma.

This method has five sequential components:

1.  *Strategic Inventory Positioning*. Answers the question "Given our
    system and environment, where should we place inventory to have the
    best protection?" and determines where should decoupling points of
    inventory be placed.
2.  *Buffer Profiles and Levels*. Determine the amount of protection at
    those decoupling points.
3.  *Dynamic Adjustments*. Allow the company to adapt buffers to group
    and individual part trait changes over time through the use of
    several types of adjustments.
4.  *Demand Driven Planning*. Allow to launch purchase orders (POs),
    manufacturing orders (MOs) and Transfer Orders (TOs) based on the
    priority dictated by the buffers.
5.  *Visible and Collaborative Execution*. These POs, MOs and TOs have
    to be effectively managed to synchronize with the changes that often
    occur within the "execution horizon."

These five components work together to greatly dampen, if not eliminate,
the nervousness of traditional MRP systems and the bullwhip effect in
complex and challenging environments.

This approach provides real information about those parts that are truly
at risk of negatively impacting the planned availability of inventory.

DDMRP sorts the significant few items that require attention from the
many parts that are being managed. Under the DDMRP approach, fewer
planners can make better decisions more quickly. That means companies
will be better able to leverage their working and human capital.

Demand Driven Material Requirements Planning is quickly being adopted by
a wide variety of leading companies across the world.

Some of the benefits reported by the DDMRP method include:

- High fill rate performance
- Lead time reductions
- Inventory reductions, while improving customer service
- Eliminate costs related to expedite
- Planners see priorities instead of constantly fighting the conflicting
  messages of MRP

It is highly recommended to read the book 'Demand Driven Material
Requirements Planning (DDMRP)' by Carol Ptak and Chad Smith.

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - ddmrp mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
product_template_only_form_view_inherit product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line tree New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_inherit_ddmrp report_mrp_bom_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
report_mrp_bom_pdf_line_inherit_ddmrp report_mrp_bom_pdf_line_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer tree New
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_search stock.move.search stock.move field Inherits stock.view_move_search
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method tree New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time tree New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile tree New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability tree New
view_warehouse stock.warehouse stock.warehouse xpath Inherits stock.view_warehouse
Models touched (28)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • make_procurement(self)

New fields (9)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
  • recommended_qty Float
    readonly=True
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (4)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (4)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (1)
  • buffer_count Integer
    compute='_compute_buffer_count'
Public methods (1)
  • action_view_stock_buffers(self)

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (11)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_purchase_hide_onhand_status Boolean
    string='Hide Purchase On-Hand Status'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (78)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_source_future Selection
    related='adu_calculation_method.source_future'
  • adu_calculation_method_source_past Selection
    related='adu_calculation_method.source_past'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart_planning string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute=_compute_ddmrp_chart_execution string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move' help='All demand stock moves for this buffer'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • group_id Many2one → procurement.group
    comodel_name='procurement.group' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' readonly=False store=True string='Procurement UoM'
  • product_categ_id Many2one → product.category
    comodel_name='product.category' readonly=True related='product_id.categ_id' store=True string='Product Category'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'product')] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' readonly=True string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one
    related='product_id.uom_id'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    column1='stock_buffer_id' column2='stock_move_id' comodel_name='stock.move' help='Stock moves considered qualified demand for this buffer' relation='stock_buffer_qualified_demand_stock_move_rel'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_inside_dlt_qty Float
    help='Request for Quotation total quantity that is planned inside of the DLT horizon.' readonly=True string='RFQ Qty (Inside DLT)'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • rfq_total_qty Float
    help='Request for Quotation total quantity that is planned' readonly=True string='RFQ Total Qty'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • top_of_red Float
    related='red_zone_qty' store=True string='Top Of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
Public methods (31)
  • action_dummy(self)
  • action_request_procurement(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu_direct_demand(self)
  • action_view_future_adu_indirect_demand(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu_direct_demand(self)
  • action_view_past_adu_indirect_demand(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_moves(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply_moves(self)
  • action_view_supply_moves_inside_dlt_window(self)
  • action_view_supply_moves_outside_dlt_window(self)
  • action_view_supply_rfq_inside_dlt_window(self)
  • action_view_supply_rfq_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False, domain=None)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False, domain=None)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart_execution(self)
  • get_ddmrp_chart_planning(self)
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (2)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
  • qualified_demand_buffer_ids Many2many → stock.buffer
    column1='stock_move_id' column2='stock_buffer_id' comodel_name='stock.buffer' relation='stock_buffer_qualified_demand_stock_move_rel' string='Qualified Demand For Buffers'
Public methods (3)
  • action_open_stock_move_source(self)
    Open the source record of the stock move, if it exists.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a stock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/16.0/ddmrp
VERSION
VERSION 1.16.0
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSLois Rilo, Jordi Ballester Alomar, JordiMForgeFlow, Weblate, OCA-git-bot, oca-ci, Christopher Ormaza, BernatPForgeFlow, ThiagoMForgeFlow, DavidJForgeFlow, AlexPForgeFlow, Henry Backman
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_helper
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==3.1.1
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - ddmrp mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
product_template_only_form_view_inherit product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line tree New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_inherit_ddmrp report_mrp_bom_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
report_mrp_bom_pdf_line_inherit_ddmrp report_mrp_bom_pdf_line_inherit_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer tree New
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_search stock.move.search stock.move field Inherits stock.view_move_search
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method tree New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time tree New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile tree New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability tree New
view_warehouse stock.warehouse stock.warehouse xpath Inherits stock.view_warehouse
Models touched (28)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • make_procurement(self)

New fields (9)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
  • recommended_qty Float
    readonly=True
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (1)
  • buffer_count Integer
    compute='_compute_buffer_count'
Public methods (1)
  • action_view_stock_buffers(self)

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (11)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_purchase_hide_onhand_status Boolean
    string='Hide Purchase On-Hand Status'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (78)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_source_future Selection
    related='adu_calculation_method.source_future'
  • adu_calculation_method_source_past Selection
    related='adu_calculation_method.source_past'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart_planning string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute=_compute_ddmrp_chart_execution string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move' help='All demand stock moves for this buffer'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • group_id Many2one → procurement.group
    comodel_name='procurement.group' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' readonly=False store=True string='Procurement UoM'
  • product_categ_id Many2one → product.category
    comodel_name='product.category' readonly=True related='product_id.categ_id' store=True string='Product Category'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'product')] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' readonly=True string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one
    related='product_id.uom_id'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    column1='stock_buffer_id' column2='stock_move_id' comodel_name='stock.move' help='Stock moves considered qualified demand for this buffer' relation='stock_buffer_qualified_demand_stock_move_rel'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_inside_dlt_qty Float
    help='Request for Quotation total quantity that is planned inside of the DLT horizon.' readonly=True string='RFQ Qty (Inside DLT)'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • rfq_total_qty Float
    help='Request for Quotation total quantity that is planned' readonly=True string='RFQ Total Qty'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • top_of_red Float
    related='red_zone_qty' store=True string='Top Of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
Public methods (31)
  • action_dummy(self)
  • action_request_procurement(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu_direct_demand(self)
  • action_view_future_adu_indirect_demand(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu_direct_demand(self)
  • action_view_past_adu_indirect_demand(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_moves(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply_moves(self)
  • action_view_supply_moves_inside_dlt_window(self)
  • action_view_supply_moves_outside_dlt_window(self)
  • action_view_supply_rfq_inside_dlt_window(self)
  • action_view_supply_rfq_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False, domain=None)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False, domain=None)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart_execution(self)
  • get_ddmrp_chart_planning(self)
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
  • created_purchase_line_id Many2one
    index=True
  • qualified_demand_buffer_ids Many2many → stock.buffer
    column1='stock_move_id' column2='stock_buffer_id' comodel_name='stock.buffer' relation='stock_buffer_qualified_demand_stock_move_rel' string='Qualified Demand For Buffers'
Public methods (3)
  • action_open_stock_move_source(self)
    Open the source record of the stock move, if it exists.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a stock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/15.0/ddmrp
VERSION
VERSION 1.17.0
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSLois Rilo, Jordi Ballester, OCA Transbot, Sébastien Alix, JordiMForgeFlow, Luis Felipe Miléo, Weblate, OCA-git-bot, oca-ci, Christopher Ormaza, BernatPForgeFlow, Bernat Puig Font, AlexPForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:34
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_helper
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==2.4.2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - mrp_bom_location mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line tree New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb Inherits mrp.report_mrp_bom_line
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
report_mrpbomstructure_ddmrp report_mrpbomstructure_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer tree New
view_make_procure_without_security Request Procurement make.procurement.buffer field Inherits ddmrp.view_make_procurement_buffer_wizard
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method tree New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time tree New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile tree New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability tree New
view_warehouse stock.warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (28)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • make_procurement(self)

New fields (10)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
  • qty_without_security Float
    string='Quantity'
  • recommended_qty Float
    readonly=True
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (10)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (75)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute=_compute_ddmrp_chart string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • group_id Many2one → procurement.group
    comodel_name='procurement.group' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' readonly=False store=True string='Procurement UoM'
  • product_categ_id Many2one → product.category
    comodel_name='product.category' readonly=True related='product_id.categ_id' store=True string='Product Category'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'product')] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one
    related='product_id.uom_id'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_inside_dlt_qty Float
    help='Request for Quotation total quantity that is planned inside of the DLT horizon.' readonly=True string='RFQ Qty (Inside DLT)'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • rfq_total_qty Float
    help='Request for Quotation total quantity that is planned' readonly=True string='RFQ Total Qty'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True
  • top_of_red Float
    related='red_zone_qty' store=True string='Top Of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True
Public methods (30)
  • action_dummy(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu_direct_demand(self)
  • action_view_future_adu_indirect_demand(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu_direct_demand(self)
  • action_view_past_adu_indirect_demand(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_moves(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply_moves(self)
  • action_view_supply_moves_inside_dlt_window(self)
  • action_view_supply_moves_outside_dlt_window(self)
  • action_view_supply_rfq_inside_dlt_window(self)
  • action_view_supply_rfq_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart(self)
  • get_ddmrp_chart_execution(self)
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (2)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
  • created_purchase_line_id Many2one
    index=True
Public methods (3)
  • action_open_stock_move_source(self)
    Open the source record of the stock move, if it exists.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a sock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/14.0/ddmrp
VERSION
VERSION 1.24.0
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSAlexis de Lattre, Lois Rilo, Jordi Ballester, OCA Transbot, Sébastien Alix, JordiMForgeFlow, Thierry Ducrest, oca-travis, Weblate, OCA-git-bot, Iryna Vyshnevska, Atchuthan, Sodexis, oca-ci, davidborromeo, Christopher Ormaza, BernatPForgeFlow, oca-git-bot, nguyenhk, KV
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_helper
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==2.3.1
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (40)
XML IDNameModelTypeStatus
assets_backend web_widget_buffer_info assets ir.ui.view qweb Inherits web.assets_backend
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - mrp_bom_location mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line tree New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb Inherits mrp.report_mrp_bom_line
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
report_mrpbomstructure_ddmrp report_mrpbomstructure_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer tree New
view_make_procure_without_security Request Procurement make.procurement.buffer field Inherits ddmrp.view_make_procurement_buffer_wizard
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method tree New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time tree New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile tree New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability tree New
view_warehouse stock.warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (28)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • make_procurement(self)

New fields (10)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
    string='Qty'
  • qty_without_security Float
    string='Quantity'
  • recommended_qty Float
    readonly=True string='Recommended Qty'
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements, raise_user_error=True)
    @api.model

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True string='Name'
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (11)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_purchase_hide_onhand_status Boolean
    string='Hide Purchase On-Hand Status'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (72)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute=_compute_ddmrp_chart string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True string='Green Zone Qty'
  • group_id Many2one → procurement.group
    comodel_name='procurement.group' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure' string='Minimum Order Quantity'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True string='Name'
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True string='Net flow position'
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
    string='Order Spike Horizon'
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True string='Order Spike Threshold'
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Planning Priority Level'
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' readonly=False store=True string='Procurement UoM'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'product')] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' default=<expr> readonly=True related='product_id.uom_id' required=True string='Product Unit of Measure'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True string='Qty Multiple'
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True string='Qualified demand'
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True string='Red Base Qty'
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True string='Red Safety Qty'
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True string='Red Zone Qty'
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True string='Top of Green'
  • top_of_red Float
    related='red_zone_qty' store=True string='Top Of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True string='Top of Yellow'
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True string='Yellow Zone Qty'
Public methods (30)
  • action_dummy(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu_direct_demand(self)
  • action_view_future_adu_indirect_demand(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu_direct_demand(self)
  • action_view_past_adu_indirect_demand(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_moves(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply_moves(self)
  • action_view_supply_moves_inside_dlt_window(self)
  • action_view_supply_moves_outside_dlt_window(self)
  • action_view_supply_rfq_inside_dlt_window(self)
  • action_view_supply_rfq_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart(self)
  • get_ddmrp_chart_execution(self)
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES string='Item Type'
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True string='Name'
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (2)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
  • created_purchase_line_id Many2one
    index=True
Public methods (3)
  • action_open_stock_move_source(self)
    Open the source record of the stock move, if it exists.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a sock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/13.0/ddmrp
VERSION
VERSION 1.34.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSGuewen Baconnier, Jacques-Etienne Baudoux, Lois Rilo, Jordi Ballester Alomar, OCA Transbot, Sébastien Alix, Thierry Ducrest, oca-travis, Weblate, OCA-git-bot, oca-ci, BernatPForgeFlow, Matthieu Méquignon, GuillemCForgeFlow, DavidJForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:13
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/stock-logistics-warehouse:
    - stock_demand_estimate
    - stock_warehouse_calendar
    - stock_helper
OCA/web:
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase_stock
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - purchase
    - mrp
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh==1.1.0
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (40)
XML IDNameModelTypeStatus
assets_backend web_widget_buffer_info assets ir.ui.view qweb Inherits web.assets_backend
ddmrp_duplicate_buffer_wizard Ddmrp Duplicate Buffer Wizard ddmrp.duplicate.buffer form New
mrp_bom_change_location_wizard Mrp Bom Change Location Wizard mrp.bom.change.location form New
mrp_bom_form_view mrp.bom.form - mrp_bom_location mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_bom_line_view_form mrp.bom.line.form mrp.bom.line field Inherits mrp.mrp_bom_line_view_form
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
product_normal_form_view_inherit product.product.form.inherit product.product xpath Inherits product.product_normal_form_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line tree New
purchase_order_line_form2 purchase.order.line.form2 purchase.order.line field Inherits purchase.purchase_order_line_form2
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrp_bom_line report_mrp_bom_line ir.ui.view qweb Inherits mrp.report_mrp_bom_line
report_mrp_bom_pdf_line report_mrp_bom_pdf_line ir.ui.view qweb Inherits mrp.report_mrp_bom_pdf_line
report_mrpbomstructure_ddmrp report_mrpbomstructure_ddmrp ir.ui.view qweb Inherits mrp.report_mrp_bom
res_config_settings_view_form res.config.settings.view.form.inherit.ddmrp res.config.settings xpath Inherits base.res_config_settings_view_form
stock_buffer_search stock.buffer.search stock.buffer search New
stock_buffer_view_form stock.buffer.form stock.buffer form New
stock_buffer_view_tree stock.buffer.tree stock.buffer tree New
view_make_procure_without_security Request Procurement make.procurement.buffer field Inherits ddmrp.view_make_procurement_buffer_wizard
view_make_procurement_buffer_wizard Request Procurement make.procurement.buffer form New
view_move_consumption_pivot stock.move.consumption.pivot stock.move pivot New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_picking_form stock.picking.form.inherit stock.picking div Inherits stock.view_picking_form
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method tree New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time tree New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile tree New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability tree New
view_warehouse stock.warehouse stock.warehouse field Inherits stock.view_warehouse
Models touched (28)

New fields (3)
  • location_id Many2one → stock.location
    comodel_name='stock.location' string='New Location'
  • product_id Many2one → product.product
    comodel_name='product.product' string='New Product'
  • type Selection
    required=True selection=[('both', 'Change both values'), ('product', 'Change Product'), ('location', 'Change Location')] string='Duplication Type'
Public methods (2)
  • action_duplicate_buffer(self)
  • default_get(self, fields_list)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
  • run_cron_ddmrp_adu(self)

New fields (2)
  • item_ids One2many → make.procurement.buffer.item
    comodel_name='make.procurement.buffer.item' inverse_name='wiz_id' string='Items'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help='If set, will be used as preferred vendor for purchase routes.' string='Vendor'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • make_procurement(self)

New fields (10)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' readonly=False string='Stock Buffer'
  • date_planned Datetime
    required=False string='Planned Date'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True string='Location'
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product'
  • qty Float
    string='Qty'
  • qty_without_security Float
    string='Quantity'
  • recommended_qty Float
    readonly=True string='Recommended Qty'
  • uom_id Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of Measure'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' readonly=True string='Warehouse'
  • wiz_id Many2one → make.procurement.buffer
    comodel_name='make.procurement.buffer' ondelete='cascade' readonly=True required=True string='Wizard'
Public methods (1)
  • onchange_uom_id(self)
    @api.onchange('uom_id')

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_buffer' string='Stock Buffer'
  • context_location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_context_location' string='Stock Location'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (1)
  • action_change_context_location(self)

New fields (1)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
Public methods (2)
  • action_change_location(self)
  • default_get(self, fields_list)
    @api.model

New fields (5)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' compute='_compute_is_buffered' string='Stock Buffer'
  • context_location_id Many2one
    related='bom_id.context_location_id'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • location_id Many2one
    related='context_location_id'
Public methods (0)

No public methods.

New fields (1)
  • mrp_qty_to_procure Float
    compute='_compute_mrp_qty_release' string='Quantity to release'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • buffer_id Many2one → stock.buffer
    comodel_name='stock.buffer' index=True string='Stock Buffer'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • run(self, procurements)
    @api.model

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True string='Name'
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (2)
  • buffer_count Integer
    compute='_compute_buffer_count'
  • buffer_ids One2many → stock.buffer
    comodel_name='stock.buffer' inverse_name='product_id' string='Stock Buffers'
Public methods (2)
  • action_view_stock_buffers(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (4)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' copy=False readonly=True string='Stock Buffers'
  • ddmrp_comment Text
    readonly=False related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (2)
  • create(self, vals)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • ddmrp_adu_calc_include_scrap Boolean
    string='Include scrap locations in ADU calculation'
  • ddmrp_auto_update_nfp Boolean
    help="Transfer status changes can trigger the update of relevant buffer's NFP." string='Update NFP on Stock Buffers on relevant events.'
  • ddmrp_qty_multiple_tolerance Float
    string='Qty Multiple Tolerance'
Public methods (0)

No public methods.

New fields (10)
  • ddmrp_adu_calc_include_scrap Boolean
    readonly=False related='company_id.ddmrp_adu_calc_include_scrap'
  • ddmrp_auto_update_nfp Boolean
    readonly=False related='company_id.ddmrp_auto_update_nfp'
  • ddmrp_qty_multiple_tolerance Float
    readonly=False related='company_id.ddmrp_qty_multiple_tolerance'
  • module_ddmrp_adjustment Boolean
    string='apply adjustments to dynamically alter buffers'
  • module_ddmrp_chatter Boolean
    string='Chatter in Stock Buffers'
  • module_ddmrp_coverage_days Boolean
    string='Shows the current on-hand for stock buffers expressed as coverage days.'
  • module_ddmrp_history Boolean
    string='Store historical data from stock buffers'
  • module_ddmrp_packaging Boolean
    string='Use packagings on stock buffers.'
  • module_ddmrp_warning Boolean
    string='Configuration Warnings in Stock Buffers'
  • module_stock_buffer_capacity_limit Boolean
    string='Storage Capacity Limits'
Public methods (0)

No public methods.

New fields (72)
  • active Boolean
    default=True
  • adu Float
    default=0.0 digits='Average Daily Usage' help='Average Daily Usage' readonly=True string='ADU'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' required=True string='ADU calculation method'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits='Average Daily Usage' string='Fixed ADU'
  • auto_procure Boolean
    default=False help='Whenever the buffer is recomputed, if this option is set, it will procure automatically if needed.'
  • auto_procure_option Selection
    default='standard' required=True selection=[('standard', 'When recommended (NFP below TOY)'), ('stockout', 'When in stockout')]
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' required=True string='Buffer Profile'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart string='DDMRP Chart'
  • ddmrp_chart_execution Text
    compute=_compute_ddmrp_chart string='DDMRP Execution Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • distributed_source_location_id Many2one → stock.location
    comodel_name='stock.location' help='Source location from where goods will be replenished. Computed when buffer is refreshed from following the Stock Rules.' index=True readonly=True string='Replenishment Location'
  • distributed_source_location_qty Float
    compute='_compute_distributed_source_location_qty' help='Quantity free for distributed buffer in the source location. When a procurement is requested, if the option is active on the profile, it will be limited to this quantity.' search='_search_distributed_source_location_qty' string='Source Location Free Quantity (distributed)'
  • dlt Float
    compute='_compute_dlt' help='Decoupled Lead Time (days)' string='DLT (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • extra_lead_time Float
    default=0.0 help="When defined, this lead time will be added to the decoupled lead time for the computation of the zones size (it won't affect planned date for procurements).\nThis is particularly useful in situations of infrequent but periodic demand. E.g. We receive a large order every 30 days, whereas the supplier takes 10 days to supply. \nIn this case the yellow zone must cover for the entire cycle of 30 days of demand.\nIn situations with infrequent demand the ADU tends to be very small, and every new order would be treated as a spike, when \nin reality this is not an exceptional situation." string='Extra lead time (for Sizing)'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits='Product Unit of Measure' help='Green zone qty option considering minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone qty option considering desired Order Cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True string='Green Zone Qty'
  • group_id Many2one → procurement.group
    comodel_name='procurement.group' copy=False help='Moves created through this buffer will be put in this procurement group. If none is given, the moves generated by stock rules will be grouped into one big picking.' string='Procurement Group'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • incoming_outside_dlt_qty Float
    readonly=True string='Incoming (Outside DLT)'
  • incoming_total_qty Float
    readonly=True string='Total Incoming'
  • item_type Selection
    related='buffer_profile_id.item_type'
  • lead_days Integer
    default=1 help='Lead time for distributed products.' args: 'Lead Time (Distributed)'
  • location_id Many2one → stock.location
    comodel_name='stock.location' ondelete='cascade' required=True string='Location'
  • main_supplier_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_main_supplier' help='The main supplier is the first listed supplier defined on the product that is valid for this product variant. Any date restrictions are not taken into account.' index=True store=True string='Main Supplier'
  • minimum_order_quantity Float
    digits='Product Unit of Measure' string='Minimum Order Quantity'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='buffer_id' string='Manufacturing Orders'
  • name Char
    copy=False default=<expr> required=True string='Name'
  • net_flow_position Float
    digits='Product Unit of Measure' readonly=True string='Net flow position'
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • on_hand_target_max Float
    compute='_compute_on_hand_target_max' help='It denotes how far you are on average from the target' string='Target On Hand (Max)'
  • on_hand_target_min Float
    help='It denotes what the target stock on hand range is.' related='top_of_red' string='On Hand Target Range'
  • on_hand_target_position Float
    compute='_compute_on_hand_target_position' help='It denotes what the target stock on hand is. The computation is: OH Target = TOR + Green Zone / 2 ' string='Avg On Hand Target Position'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
    string='Order Spike Horizon'
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits='Product Unit of Measure' store=True string='Order Spike Threshold'
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Planning Priority Level'
  • procure_max_qty Float
    digits='Product Unit of Measure' help='Maximum qty for a single procurement' string='Maximum Procure Batch'
  • procure_min_qty Float
    digits='Product Unit of Measure' help='Minimum qty for a single procurement' string='Minimum Procure Batch'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True string='Procure Recommendation'
  • procure_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_procure_uom_id' readonly=False store=True string='Procurement UoM'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'product')] ondelete='cascade' required=True string='Product'
  • product_location_qty_available_not_res Float
    help='Quantity available in this stock buffer, this is the total quantity on hand minus the outgoing reservations.' string='Quantity On Hand (Unreserved)'
  • product_type Selection
    readonly=True related='product_id.type'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' default=<expr> readonly=True related='product_id.uom_id' required=True string='Product Unit of Measure'
  • product_vendor_code Char
    compute='_compute_product_vendor_code' string='Vendor Code'
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False readonly=True string='Purchase Order Lines'
  • qty_multiple Float
    default=1 digits='Product Unit of Measure' help='The procurement quantity will be rounded up to this multiple. If it is 0, the exact quantity will be used.' required=True string='Qty Multiple'
  • qualified_demand Float
    digits='Product Unit of Measure' readonly=True string='Qualified demand'
  • qualified_demand_mrp_move_ids Many2many → mrp.move
    comodel_name='mrp.move'
  • qualified_demand_stock_move_ids Many2many → stock.move
    comodel_name='stock.move'
  • red_base_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True string='Red Base Qty'
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True string='Red Safety Qty'
  • red_zone_qty Float
    compute='_compute_red_zone' digits='Product Unit of Measure' store=True string='Red Zone Qty'
  • replenish_method Selection
    related='buffer_profile_id.replenish_method'
  • rfq_outside_dlt_qty Float
    help='Request for Quotation total quantity that is planned outside of the DLT horizon.' readonly=True string='RFQ Qty (Outside DLT)'
  • show_execution_chart Boolean
  • top_of_green Float
    compute='_compute_green_zone' digits='Product Unit of Measure' store=True string='Top of Green'
  • top_of_red Float
    related='red_zone_qty' store=True string='Top of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True string='Top of Yellow'
  • used_in_bom_count Integer
    related='product_id.used_in_bom_count'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' ondelete='cascade' required=True string='Warehouse'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits='Product Unit of Measure' store=True string='Yellow Zone Qty'
Public methods (28)
  • action_dummy(self)
  • action_used_in_bom(self)
  • action_view_bom(self)
  • action_view_future_adu(self)
  • action_view_mrp_productions(self)
  • action_view_past_adu(self)
  • action_view_purchase(self)
  • action_view_qualified_demand_mrp(self)
  • action_view_qualified_demand_pickings(self)
  • action_view_stock_demand_estimates(self)
  • action_view_supply(self, outside_dlt=False)
  • action_view_supply_inside_dlt_window(self)
  • action_view_supply_outside_dlt_window(self)
  • action_view_yearly_consumption(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_actions(self, only_nfp=False)
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False)
    @api.model
    Calculate key DDMRP parameters for each buffer. Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • default_get(self, fields)
    @api.model
  • do_auto_procure(self)
  • get_ddmrp_chart(self)
  • get_ddmrp_chart_execution(self)
  • onchange_adu(self)
    @api.onchange('adu_fixed', 'adu_calculation_method')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • open_moves(self)
  • refresh_buffer(self)
  • write(self, vals)

New fields (8)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • distributed_reschedule_max_proc_time Float
    default=0.0 help='When you request procurement from a buffer, their scheduled date is rescheduled to now + this procurement time (in minutes). Their scheduled date represents the latest the transfers should be done, and therefore, past this timestamp, considered late.' string='Re-Schedule Procurement Max Proc. Time (minutes)'
  • item_type Selection
    required=True selection=_ITEM_TYPES string='Item Type'
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True string='Name'
  • replenish_distributed_limit_to_free_qty Boolean
    default=False help='When activated, the recommended quantity will be maxed at the quantity available in the replenishment source location.' string='Limit replenishment to free quantity'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (1)
  • buffer_ids Many2many → stock.buffer
    comodel_name='stock.buffer' string='Linked Stock Buffers'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (1)
  • state Selection
    index=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_stock_buffer_open(self)
    Open a sock.buffer list related to products of the stock.picking.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/ddmrp
GIT
GIThttps://github.com/OCA/ddmrp.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/ddmrp/tree/11.0/ddmrp
VERSION
VERSION 1.3.2
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Eficent
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Eficent
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Stéphane Bidoul (ACSONE), Lois Rilo, OCA Transbot, oca-travis, Weblate, OCA-git-bot, OCA Git Bot, hveficent
WEBSITE
WEBSITEhttps://github.com/OCA/ddmrp
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/manufacture:
    - mrp_bom_location
    - mrp_multi_level
    - mrp_warehouse_calendar
OCA/server-tools:
    - base_cron_exclusion
OCA/server-ux:
    - date_range
OCA/stock-logistics-warehouse:
    - stock_warehouse_orderpoint_stock_info
    - stock_warehouse_orderpoint_stock_info_unreserved
    - stock_available_unreserved
    - stock_orderpoint_purchase_link
    - stock_orderpoint_move_link
    - stock_orderpoint_uom
    - stock_orderpoint_manual_procurement
    - stock_demand_estimate
    - stock_warehouse_calendar
OCA/web:
    - web_tree_dynamic_colored_field
    - web_widget_x2many_2d_matrix
    - web_widget_bokeh_chart
odoo/odoo:
    - purchase
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - barcodes
    - web_planner
    - account
    - analytic
    - portal
    - http_routing
    - mrp
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES bokeh
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
mrp_bom_form_view mrp.bom.form - mrp_bom_location mrp.bom field Inherits mrp.mrp_bom_form_view
mrp_production_tree_view mrp.production.tree mrp.production field Inherits mrp.mrp_production_tree_view
purchase_order_form purchase.order.form - ddmrp purchase.order xpath Inherits purchase.purchase_order_form
purchase_order_line_execution_tree purchase.order.line.tree - ddmrp purchase.order.line tree New
purchase_order_line_search purchase.order.line.search - ddmrp purchase.order.line filter Inherits purchase.purchase_order_line_search
report_mrpbomstructure_ddmrp report_mrpbomstructure_ddmrp ir.ui.view qweb Inherits mrp_bom_location.report_mrpbomstructure_location
view_ddmrp_stock_buffer_planning_tree stock.warehouse.orderpoint.planner.tree stock.warehouse.orderpoint tree New
view_move_form stock.move.form stock.move field Inherits stock.view_move_form
view_move_tree stock.move.tree stock.move field Inherits stock.view_move_tree
view_mrp_production_filter mrp.production.select mrp.production field Inherits mrp.view_mrp_production_filter
view_product_adu_calculation_method_form product.adu.calculation.method.form product.adu.calculation.method form New
view_product_adu_calculation_method_search product.adu.calculation.method.search product.adu.calculation.method search New
view_product_adu_calculation_method_tree product.adu.calculation.method.tree product.adu.calculation.method tree New
view_purchase_order_filter request.quotation.select - ddmrp purchase.order filter Inherits purchase.view_purchase_order_filter
view_run_ddmrp_wizard ddmrp.run.form ddmrp.run form New
view_stock_buffer_profile_form stock.buffer.profile.form stock.buffer.profile form New
view_stock_buffer_profile_lead_time_form stock.buffer.profile.lead.time.form stock.buffer.profile.lead.time form New
view_stock_buffer_profile_lead_time_search stock.buffer.profile.lead.time.search stock.buffer.profile.lead.time search New
view_stock_buffer_profile_lead_time_tree stock.buffer.profile.lead.time.tree stock.buffer.profile.lead.time tree New
view_stock_buffer_profile_search stock.buffer.profile.search stock.buffer.profile search New
view_stock_buffer_profile_tree stock.buffer.profile.tree stock.buffer.profile tree New
view_stock_buffer_profile_variability_form stock.buffer.profile.variability.form stock.buffer.profile.variability form New
view_stock_buffer_profile_variability_search stock.buffer.profile.variability.search stock.buffer.profile.variability search New
view_stock_buffer_profile_variability_tree stock.buffer.profile.variability.tree stock.buffer.profile.variability tree New
view_warehouse stock.warehouse stock.warehouse field Inherits stock.view_warehouse
view_warehouse_orderpoint_form stock.warehouse.orderpoint.form stock.warehouse.orderpoint button Inherits stock.view_warehouse_orderpoint_form
view_warehouse_orderpoint_tree stock.warehouse.orderpoint.tree stock.warehouse.orderpoint field Inherits stock.view_warehouse_orderpoint_tree
warehouse_orderpoint_search stock.warehouse.orderpoint.search stock.warehouse.orderpoint field Inherits stock.warehouse_orderpoint_search
Models touched (18)

New fields (0)

No new fields.

Public methods (2)
  • run_cron_ddmrp(self)
    @api.multi
  • run_cron_ddmrp_adu(self)
    @api.multi

New fields (0)

No new fields.

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

New fields (4)
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • has_mto_rule Boolean
    compute='_compute_mto_rule' help='Follows an MTO Pull Rule' string='MTO'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    comodel_name='stock.warehouse.orderpoint' compute='_compute_orderpoint' string='Orderpoint'
Public methods (0)

No public methods.

New fields (4)
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • has_mto_rule Boolean
    compute='_compute_mto_rule' help='Follows an MTO Pull Rule' string='MTO'
  • is_buffered Boolean
    compute='_compute_is_buffered' help='True when the product has an DDMRP buffer associated.' string='Buffered?'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    comodel_name='stock.warehouse.orderpoint' compute='_compute_is_buffered' string='Orderpoint'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Alert Level'
  • on_hand_percent Float
    string='On Hand/TOR (%)'
  • orderpoint_id Many2one → stock.warehouse.orderpoint
    comodel_name='stock.warehouse.orderpoint' index=True string='Reordering rule'
Public methods (1)
  • create(self, vals)
    @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 (9)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • factor_future Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the future part of the combination.' string='Future Factor'
  • factor_past Float
    default=0.5 help='When using a blended method, this is the relative weight assigned to the past part of the combination.' string='Past Factor'
  • horizon_future Float
    help='Length-of-period horizon in days looking forward.' string='Future Horizon'
  • horizon_past Float
    help='Length-of-period horizon in days looking past.' string='Past Horizon'
  • method Selection
    selection='_get_calculation_method' string='Calculation method'
  • name Char
    required=True string='Name'
  • source_future Selection
    help='Information source used for future calculation.' selection='_get_source_selection' string='Future Source'
  • source_past Selection
    help='Information source used for past calculation.' selection='_get_source_selection' string='Past Source'
Public methods (0)

No public methods.

New fields (1)
  • ddmrp_comment Text
    string='Follow-up Notes'
Public methods (0)

No public methods.

New fields (3)
  • ddmrp_comment Text
    related='order_id.ddmrp_comment'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Buffer On-Hand Status Level'
  • on_hand_percent Float
    readonly=True string='On Hand/TOR (%)'
Public methods (1)
  • create(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • item_type Selection
    required=True selection=_ITEM_TYPES string='Item Type'
  • lead_time_id Many2one → stock.buffer.profile.lead.time
    comodel_name='stock.buffer.profile.lead.time' string='Lead Time Factor'
  • name Char
    compute='_compute_name' store=True string='Name'
  • replenish_method Selection
    required=True selection=_REPLENISH_METHODS string='Replenishment method'
  • variability_id Many2one → stock.buffer.profile.variability
    comodel_name='stock.buffer.profile.variability' string='Variability Factor'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • factor Float
    required=True string='Lead Time Factor'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company', 'Company'
  • factor Float
    required=True string='Variability Factor'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • procure_calculation(self)
    @api.multi
    Override standard method to disable the feature.

New fields (1)
  • nfp_incoming_safety_factor Float
    help='Factor used to compute the number of days to look into the future for incoming shipments for the purposes of the Net Flow position calculation.' args: 'Net Flow Position Incoming Safety Factor'
Public methods (0)

No public methods.

New fields (39)
  • adu Float
    default=0.0 digits=UNIT readonly=True string='Average Daily Usage (ADU)'
  • adu_calculation_method Many2one → product.adu.calculation.method
    comodel_name='product.adu.calculation.method' string='ADU calculation method'
  • adu_calculation_method_type Selection
    related='adu_calculation_method.method'
  • adu_fixed Float
    default=1.0 digits=UNIT string='Fixed ADU'
  • buffer_profile_id Many2one → stock.buffer.profile
    comodel_name='stock.buffer.profile' string='Buffer Profile'
  • ddmrp_chart Text
    compute=_compute_ddmrp_chart string='DDMRP Chart'
  • ddmrp_demand_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Demand Chart'
  • ddmrp_supply_chart Text
    compute='_compute_ddmrp_demand_supply_chart' string='DDMRP Supply Chart'
  • dlt Float
    compute='_compute_dlt' string='Decoupled Lead Time (days)'
  • execution_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL store=True string='On-Hand Alert Level'
  • green_override Float
    string='Green Zone (Override)'
  • green_zone_lt_factor Float
    compute='_compute_green_zone' help='Green zone Lead Time Factor' store=True string='Green Zone Lead Time Factor'
  • green_zone_moq Float
    compute='_compute_green_zone' digits=UNIT help='Green zone minimum order quantity' store=True string='Green Zone Minimum Order Quantity'
  • green_zone_oc Float
    compute='_compute_green_zone' help='Green zone order cycle' store=True string='Green Zone Order Cycle'
  • green_zone_qty Float
    compute='_compute_green_zone' digits=UNIT store=True string='Green Zone Qty'
  • incoming_dlt_qty Float
    readonly=True string='Incoming (Within DLT)'
  • minimum_order_quantity Float
    digits=UNIT string='Minimum Order Quantity'
  • mrp_production_ids One2many → mrp.production
    comodel_name='mrp.production' inverse_name='orderpoint_id' string='Manufacturing Orders'
  • net_flow_position Float
    digits=UNIT readonly=True string='Net flow position'
  • net_flow_position_percent Float
    readonly=True string='Net flow position (% of TOG)'
  • on_hand_percent Float
    readonly=True store=True string='On Hand/TOR (%)'
  • order_cycle Float
    string='Minimum Order Cycle (days)'
  • order_spike_horizon Float
    string='Order Spike Horizon'
  • order_spike_threshold Float
    compute='_compute_order_spike_threshold' digits=UNIT store=True string='Order Spike Threshold'
  • planning_priority_level Selection
    readonly=True selection=_PRIORITY_LEVEL string='Planning Priority Level'
  • procure_recommended_date Date
    compute='_compute_procure_recommended_date'
  • procure_recommended_qty Float
    compute='_compute_procure_recommended_qty' store=True
  • purchase_line_ids Many2many → purchase.order.line
    comodel_name='purchase.order.line' copy=False string='PO Lines'
  • qualified_demand Float
    digits=UNIT readonly=True string='Qualified demand'
  • red_base_qty Float
    compute='_compute_red_zone' digits=UNIT store=True string='Red Base Qty'
  • red_override Float
    string='Red Zone (Override)'
  • red_safety_qty Float
    compute='_compute_red_zone' digits=UNIT store=True string='Red Safety Qty'
  • red_zone_qty Float
    compute='_compute_red_zone' digits=UNIT store=True string='Red Zone Qty'
  • replenish_method Selection
    readonly=True related='buffer_profile_id.replenish_method'
  • top_of_green Float
    compute='_compute_green_zone' digits=UNIT store=True string='Top of Green'
  • top_of_red Float
    related='red_zone_qty' store=True string='Top of Red'
  • top_of_yellow Float
    compute='_compute_yellow_zone' digits=UNIT store=True string='Top of Yellow'
  • yellow_override Float
    string='Yellow Zone (Override)'
  • yellow_zone_qty Float
    compute='_compute_yellow_zone' digits=UNIT store=True string='Yellow Zone Qty'
Public methods (5)
  • cron_actions(self)
    @api.multi
    This method is meant to be inherited by other modules in order to enhance extensibility.
  • cron_ddmrp(self, automatic=False)
    @api.model
    calculate key DDMRP parameters for each orderpoint Called by cronjob.
  • cron_ddmrp_adu(self, automatic=False)
    @api.model
    calculate ADU for each DDMRP buffer. Called by cronjob.
  • onchange_adu(self)
    @api.multi@api.onchange('adu_fixed', 'adu_calculation_method')
  • open_moves(self)
    @api.multi