| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/19.0/ddmrp |
| VERSION | |
| VERSION | 1.1.0 |
| CATEGORY | |
| CATEGORY | Warehouse |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, Don Kendall, oca-ci, DavidJForgeFlow, Paula Marfull, dkendall |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
make_procurement(self)
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'
onchange_uom_id(self)
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?'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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?'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals_list)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
buffer_count
Integer
compute='_compute_buffer_count'
action_view_stock_buffers(self)
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False, domain=None)
cron_ddmrp_adu(self, automatic=False, domain=None)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart_execution(self)
get_ddmrp_chart_planning(self)
onchange_warehouse_id(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
No public methods.
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'
action_open_stock_move_source(self)
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (1)run(self, procurements, raise_user_error=True)
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'
No public methods.
No new fields.
Public methods (1)create(self, vals_list)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/18.0/ddmrp |
| VERSION | |
| VERSION | 1.10.0 |
| CATEGORY | |
| CATEGORY | Warehouse |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Jacques-Etienne Baudoux, Akim Juillerat, Lois Rilo, Jordi Ballester Alomar, Weblate, OCA-git-bot, Simone Orsi, oca-ci, ThiagoMForgeFlow, DavidJForgeFlow, Henry Backman |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
make_procurement(self)
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'
onchange_uom_id(self)
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?'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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?'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals_list)
No new fields.
Public methods (1)run(self, procurements, raise_user_error=True)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
buffer_count
Integer
compute='_compute_buffer_count'
action_view_stock_buffers(self)
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False, domain=None)
cron_ddmrp_adu(self, automatic=False, domain=None)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart_execution(self)
get_ddmrp_chart_planning(self)
onchange_product_id(self)
onchange_warehouse_id(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
No public methods.
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'
action_open_stock_move_source(self)
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
No new fields.
Public methods (1)create(self, vals_list)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/17.0/ddmrp |
| VERSION | |
| VERSION | 1.10.0 |
| CATEGORY | |
| CATEGORY | Warehouse |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Lois Rilo, Weblate, OCA-git-bot, oca-ci, RicardCForgeFlow, ThiagoMForgeFlow, DavidJForgeFlow, AlexPForgeFlow, Henry Backman |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
make_procurement(self)
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'
onchange_uom_id(self)
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?'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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?'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals_list)
No new fields.
Public methods (1)run(self, procurements, raise_user_error=True)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
buffer_count
Integer
compute='_compute_buffer_count'
action_view_stock_buffers(self)
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False, domain=None)
cron_ddmrp_adu(self, automatic=False, domain=None)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart_execution(self)
get_ddmrp_chart_planning(self)
onchange_product_id(self)
onchange_warehouse_id(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
No public methods.
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'
action_open_stock_move_source(self)
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
No new fields.
Public methods (1)create(self, vals_list)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/16.0/ddmrp |
| VERSION | |
| VERSION | 1.16.0 |
| CATEGORY | |
| CATEGORY | Warehouse |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Lois Rilo, Jordi Ballester Alomar, JordiMForgeFlow, Weblate, OCA-git-bot, oca-ci, Christopher Ormaza, BernatPForgeFlow, ThiagoMForgeFlow, DavidJForgeFlow, AlexPForgeFlow, Henry Backman |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
make_procurement(self)
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'
onchange_uom_id(self)
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'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals_list)
No new fields.
Public methods (1)run(self, procurements, raise_user_error=True)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
buffer_count
Integer
compute='_compute_buffer_count'
action_view_stock_buffers(self)
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False, domain=None)
cron_ddmrp_adu(self, automatic=False, domain=None)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart_execution(self)
get_ddmrp_chart_planning(self)
onchange_product_id(self)
onchange_warehouse_id(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
No public methods.
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'
action_open_stock_move_source(self)
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
No new fields.
Public methods (1)create(self, vals_list)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/15.0/ddmrp |
| VERSION | |
| VERSION | 1.17.0 |
| CATEGORY | |
| CATEGORY | Warehouse |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Lois 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 | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
make_procurement(self)
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'
onchange_uom_id(self)
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'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals_list)
No new fields.
Public methods (1)run(self, procurements, raise_user_error=True)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
No new fields.
Public methods (0)No public methods.
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False)
cron_ddmrp_adu(self, automatic=False)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart(self)
get_ddmrp_chart_execution(self)
onchange_product_id(self)
onchange_warehouse_id(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
No public methods.
buffer_ids
Many2many → stock.buffer
comodel_name='stock.buffer'
string='Linked Stock Buffers'
created_purchase_line_id
Many2one
index=True
action_open_stock_move_source(self)
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
No new fields.
Public methods (1)create(self, vals_list)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/14.0/ddmrp |
| VERSION | |
| VERSION | 1.24.0 |
| CATEGORY | |
| CATEGORY | Warehouse |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Alexis 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 | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
make_procurement(self)
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'
onchange_uom_id(self)
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'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals_list)
No new fields.
Public methods (1)run(self, procurements, raise_user_error=True)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
No new fields.
Public methods (0)No public methods.
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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'
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False)
cron_ddmrp_adu(self, automatic=False)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart(self)
get_ddmrp_chart_execution(self)
onchange_product_id(self)
onchange_warehouse_id(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
string='Name'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
string='Name'
No public methods.
buffer_ids
Many2many → stock.buffer
comodel_name='stock.buffer'
string='Linked Stock Buffers'
created_purchase_line_id
Many2one
index=True
action_open_stock_move_source(self)
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
No new fields.
Public methods (1)create(self, vals_list)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/13.0/ddmrp |
| VERSION | |
| VERSION | 1.34.0 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Guewen 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 | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
action_duplicate_buffer(self)
default_get(self, fields_list)
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
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'
default_get(self, fields)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
make_procurement(self)
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'
onchange_uom_id(self)
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'
action_change_context_location(self)
location_id
Many2one → stock.location
comodel_name='stock.location'
action_change_location(self)
default_get(self, fields_list)
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'
No public methods.
mrp_qty_to_procure
Float
compute='_compute_mrp_qty_release'
string='Quantity to release'
No public methods.
No new fields.
Public methods (0)No public methods.
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 (%)'
create(self, vals)
No new fields.
Public methods (1)run(self, procurements)
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'
No public methods.
buffer_count
Integer
compute='_compute_buffer_count'
buffer_ids
One2many → stock.buffer
comodel_name='stock.buffer'
inverse_name='product_id'
string='Stock Buffers'
action_view_stock_buffers(self)
write(self, values)
No new fields.
Public methods (0)No public methods.
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
write(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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'
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)
cron_actions(self, only_nfp=False)
cron_ddmrp(self, automatic=False)
cron_ddmrp_adu(self, automatic=False)
default_get(self, fields)
do_auto_procure(self)
get_ddmrp_chart(self)
get_ddmrp_chart_execution(self)
onchange_adu(self)
onchange_product_id(self)
onchange_warehouse_id(self)
open_moves(self)
refresh_buffer(self)
write(self, vals)
company_id
Many2one → res.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'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Lead Time Factor'
name
Char
required=True
string='Name'
No public methods.
company_id
Many2one → res.company
factor
Float
required=True
string='Variability Factor'
name
Char
required=True
string='Name'
No public methods.
buffer_ids
Many2many → stock.buffer
comodel_name='stock.buffer'
string='Linked Stock Buffers'
create(self, vals_list)
write(self, vals)
state
Selection
index=True
No public methods.
No new fields.
Public methods (1)action_stock_buffer_open(self)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/ddmrp |
| GIT | |
| GIT | https://github.com/OCA/ddmrp.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/ddmrp/tree/11.0/ddmrp |
| VERSION | |
| VERSION | 1.3.2 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Eficent |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Eficent |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, GitHub, Stéphane Bidoul (ACSONE), Lois Rilo, OCA Transbot, oca-travis, Weblate, OCA-git-bot, OCA Git Bot, hveficent |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/ddmrp |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (2)run_cron_ddmrp(self)
run_cron_ddmrp_adu(self)
No new fields.
Public methods (1)make_procurement(self)
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'
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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'
create(self, vals)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
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'
No public methods.
ddmrp_comment
Text
string='Follow-up Notes'
No public methods.
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 (%)'
create(self, vals)
No new fields.
Public methods (0)No public methods.
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'
No public methods.
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'
No public methods.
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'
No public methods.
No new fields.
Public methods (1)procure_calculation(self)
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'
No public methods.
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'
cron_actions(self)
cron_ddmrp(self, automatic=False)
cron_ddmrp_adu(self, automatic=False)
onchange_adu(self)
open_moves(self)