Skip to content

Commit ed9e4f6

Browse files
Feliciousjero-odoosamueljlieber
committed
[IMP] inventory: horizon days
closes #12107 Signed-off-by: Felicia Kuan (feku) <[email protected]> Co-authored-by: Jess Rogers <[email protected]> Co-authored-by: Sam Lieber (sali) <[email protected]>
1 parent 82db6b0 commit ed9e4f6

File tree

6 files changed

+108
-51
lines changed

6 files changed

+108
-51
lines changed

content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.rst

Lines changed: 57 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Reordering rules
1212
.. |MOs| replace:: :abbr:`MOs (Manufacturing Orders)`
1313
.. |BoM| replace:: :abbr:`BoM (Bill of Materials)`
1414
.. |BoMs| replace:: :abbr:`BoMs (Bills of Materials)`
15-
.. |adjust| replace:: :icon:`oi-settings-adjust` :guilabel:`(adjust)` icon
15+
.. |adjust| replace:: :icon:`oi-settings-adjust` :guilabel:`(adjust settings)` icon
1616

1717
*Reordering rules* are used to keep forecasted stock levels above a certain threshold without
1818
exceeding a specified upper limit. This is accomplished by specifying a minimum quantity that stock
@@ -30,13 +30,14 @@ created instead. This is the case regardless of the selected replenishment route
3030
To set up reordering rules for the first time, refer to:
3131

3232
- :ref:`Reordering rules setup <inventory/warehouses_storage/configure-rr>`
33-
- :ref:`Trigger <inventory/product_management/trigger>`
33+
- :ref:`Trigger <inventory/warehouses_storage/trigger>`
3434
- :ref:`Preferred route <inventory/warehouses_storage/route>`
3535

3636
To understand and optimize replenishment using advanced features, see:
3737

3838
- :ref:`Just-in-time logic <inventory/warehouses_storage/just-in-time>`
39-
- :ref:`Visibility days <inventory/product_management/visibility-days>`
39+
- :ref:`Visibility days <inventory/warehouses_storage/visibility-days>`
40+
- :ref:`Horizon days <inventory/warehouses_storage/horizon-days>`
4041

4142
.. _inventory/warehouses_storage/configure-rr:
4243

@@ -70,8 +71,7 @@ necessary for Odoo to track the product's stock levels and trigger reordering ru
7071
Replenishment method
7172
--------------------
7273

73-
Next, configure the replenishment method (e.g., buy or manufacture) by going to the
74-
:guilabel:`Inventory` tab and select one or more routes from the :guilabel:`Routes` section.
74+
Next, configure the replenishment method (e.g. buy or manufacture).
7575

7676
If the product is purchased, :ref:`install <general/install>` the **Purchase** app, and confirm that
7777
the :guilabel:`Purchase` checkbox is enabled under the product name. In the :guilabel:`Purchase`
@@ -81,22 +81,21 @@ Odoo uses the vendor at the top of the list to generate |RFQs| when reordering r
8181
In the :guilabel:`Inventory` tab's :guilabel:`Routes` field, tick the :guilabel:`Buy` checkbox.
8282

8383
.. seealso::
84-
- :doc:`Buy route <../../../purchase/manage_deals/rfq>`
85-
- :doc:`Vendor pricelist <../../../purchase/products/pricelist>`
84+
:doc:`Vendor pricelist <../../../purchase/products/pricelist>`
8685

8786
If the product is manufactured, :ref:`install <general/install>` the **Manufacturing** app, and in
8887
the :guilabel:`Inventory` tab's :guilabel:`Routes` field, tick the :guilabel:`Manufacture` checkbox.
8988

9089
Next, ensure at least one :doc:`bill of materials
9190
<../../../manufacturing/basic_setup/bill_configuration>` (BoM) is displayed in the :guilabel:`Bill
9291
of Materials` smart button at the top of the product form. This is necessary because Odoo only
93-
creates manufacturing orders for products with a |BoM|.
92+
creates manufacturing orders (MOs) for products with a |BoM|.
9493

9594
If a |BoM| does not already exist for the product, click the :guilabel:`Bill of Materials` smart
9695
button, then click :guilabel:`New` to configure a new |BoM|.
9796

9897
.. seealso::
99-
- :doc:`Manufacture route <../../../manufacturing/basic_setup/bill_configuration>`
98+
:doc:`Configure BoM <../../../manufacturing/basic_setup/bill_configuration>`
10099

101100
.. _inventory/warehouses_storage/rr-fields:
102101

@@ -131,14 +130,14 @@ rule line item:
131130
calculated using on-hand quantities and future demand, see the :ref:`Just-in-time logic
132131
<inventory/warehouses_storage/just-in-time>` section.
133132

134-
For advanced usage of reordering rules, learn about the following reordering rule fields:
133+
For advanced usage, learn about the following reordering rule fields:
135134

136-
- :ref:`Trigger <inventory/product_management/trigger>`
135+
- :ref:`Trigger <inventory/warehouses_storage/trigger>`
137136
- :ref:`Preferred route <inventory/warehouses_storage/route>`
138137
- :ref:`Vendor <inventory/warehouses_storage/set-vendor>`
139138
- :ref:`Bill of materials <inventory/warehouses_storage/set-bom-field>`
140139
- :ref:`Procurement group <inventory/warehouses_storage/procurement-grp>`
141-
- :ref:`Visibility days <inventory/product_management/visibility-days>`
140+
- :ref:`Visibility days <inventory/warehouses_storage/visibility-days>`
142141

143142
.. note::
144143
The fields above are not available by default, and must be enabled by selecting the |adjust| in
@@ -182,31 +181,28 @@ replenished products should be stored. By default, this location is set to :guil
182181
In the :guilabel:`Route` field, select the route the rule should use to replenish the item. For
183182
example, if the product should be purchased from a vendor, select the :guilabel:`Buy` route.
184183

185-
In the :guilabel:`Min Quantity` field and :guilabel:`Max Quantity` field, leave the values set to
186-
`0.00`. In the :guilabel:`To Order` field, enter a value of `1.00`.
184+
In the :guilabel:`Min` field and :guilabel:`Max` field, leave the values set to `0.00`. In the
185+
:guilabel:`To Order` field, enter a value of `1.00`.
187186

188187
.. image:: reordering_rules/001-rule.png
189188
:alt: A 0/0/1 reordering rule.
190189

191190
With the reordering rule configured using these values, each time an |SO| causes the forecasted
192-
quantity of the product to fall below the :guilabel:`Min Quantity` of `0.00`, the selected
193-
:guilabel:`Route` is used to replenish the product in one-unit increments, back up to the
194-
:guilabel:`Max Quantity` of `0.00`.
191+
quantity of the product to fall below the :guilabel:`Min` of `0.00`, the selected :guilabel:`Route`
192+
is used to replenish the product in one-unit increments, back up to the :guilabel:`Max` of `0.00`.
195193

196194
.. example::
197-
A picture frame is configured with a 0/0/1 reordering rule that uses the *Buy* route. Zero units
198-
of the picture frame are kept on-hand at any given time.
195+
An item is configured with a 0/0/1 reordering rule that uses the *Buy* route. Zero units are kept
196+
on-hand at any given time.
199197

200-
An |SO| is confirmed for one unit of the picture frame, which causes the forecasted quantity to
201-
drop to `-1.00`. This triggers the reordering rule, which automatically creates a |PO| for one
202-
unit of the picture frame.
198+
A |SO| is confirmed for one unit, which causes the forecasted quantity to drop to `-1.00`. This
199+
triggers the reordering rule, which automatically creates a |PO| for one unit.
203200

204-
Once the product is received from the vendor, the forecasted quantity of the picture frame
205-
returns to `0.00`. There is now one picture frame on-hand, but it is not reserved for the |SO|
206-
which triggered its purchase. It can be used to fulfill that |SO|, or reserved for a different
207-
order.
201+
Once the product is received from the vendor, the forecasted quantity returns to `0.00`. There is
202+
now one unit on-hand, but it is not reserved for the |SO| which triggered its purchase. It can be
203+
used to fulfill that |SO|, or reserved for a different order.
208204

209-
.. _inventory/product_management/trigger:
205+
.. _inventory/warehouses_storage/trigger:
210206

211207
Trigger
212208
=======
@@ -237,8 +233,7 @@ Auto
237233
:guilabel:`Auto`, generate purchase or manufacturing orders when either:
238234

239235
#. The scheduler runs, and the *Forecasted* quantity is below the minimum, or
240-
#. A sales order is confirmed, and lowers the *Forecasted* quantity of the product below the
241-
minimum.
236+
#. A |SO| is confirmed, and lowers the *Forecasted* quantity of the product below the minimum.
242237

243238
If the :guilabel:`Buy` route is selected, then an |RFQ| is generated. To view and manage |RFQs|,
244239
navigate to :menuselection:`Purchase app --> Orders --> Requests for Quotation`.
@@ -275,13 +270,12 @@ Manual
275270
*Manual reordering rules*, configured by setting the reordering rule's :guilabel:`Trigger` field to
276271
:guilabel:`Manual`, list a product on the :doc:`replenishment dashboard <report>` when the
277272
forecasted quantity falls below a specified minimum. Products on this dashboard are called *needs*,
278-
because they are needed to fulfill upcoming sales orders, for which the forecasted quantity is not
279-
enough.
273+
because they are needed to fulfill upcoming |SOs|, for which the forecasted quantity is not enough.
280274

281275
The replenishment dashboard, accessible by navigating to :menuselection:`Inventory app -->
282-
Operations --> Replenishment`, considers sales order deadlines, forecasted stock levels, and vendor
283-
lead times. It displays needs **only** when it is time to reorder items, thanks to the :guilabel:`To
284-
Reorder` filter.
276+
Operations --> Replenishment`, considers order deadlines, forecasted stock levels, and lead times.
277+
It displays needs **only** when it is time to reorder items, thanks to the :guilabel:`To Reorder`
278+
filter.
285279

286280
When a product appears on the replenishment dashboard, clicking the :guilabel:`Order` button
287281
generates the purchase or manufacturing order with the specified amounts :guilabel:`To Order`.
@@ -299,6 +293,9 @@ Odoo allows for multiple routes to be selected as replenishment methods under th
299293
:guilabel:`Buy` and :guilabel:`Manufacture`, indicating to Odoo that the product can be bought or
300294
manufactured.
301295

296+
.. seealso::
297+
:ref:`Set route on product form <inventory/warehouses_storage/set-method>`
298+
302299
Odoo also enables users to set a preferred route for a product's reordering rule. This is the
303300
replenishment method (e.g., buying or manufacturing) that the rule defaults to, if multiple are
304301
available.
@@ -345,13 +342,14 @@ advanced configurations of reordering rules. Consider the following:
345342
are linked to a particular demand.
346343

347344
.. note::
348-
Procurement groups link replenishment methods to demand, enabling smart buttons to appear when
349-
using the :doc:`MTO route <mto>`.
345+
Procurement groups link replenishment methods to demand, making smart buttons to appear
346+
similar to how smart buttons appear when using the :doc:`MTO route <mto>`.
350347

351348
.. figure:: reordering_rules/po-smartbutton.png
352349
:alt: Showing smart button to PO.
353350

354-
Sales order (demand) with a linked purchase order (replenishment method).
351+
Sales order (demand) with a smart button linking to the related purchase order
352+
(replenishment method).
355353

356354
In the context of reordering rules:
357355

@@ -421,19 +419,14 @@ Important considerations:
421419
Forecasted date and To Order quantity
422420
-------------------------------------
423421

424-
To view the *forecasted date*, go to the replenishment report and click the :icon:`fa-info-circle`
422+
The *forecasted date* is the earliest receipt date for a product, if it is ordered right now. It is
423+
calculated by summing the lead times linked to the product's replenishment process. The total of
424+
these lead times, added to the current date, determines when Odoo checks for demanded stock.
425+
426+
To view the forecasted date go to the replenishment report and click the :icon:`fa-info-circle`
425427
:guilabel:`(info)` icon for the desired reordering rule. The :guilabel:`Replenishment Information`
426428
pop-up window displays the :guilabel:`Forecasted Date` and various lead times.
427429

428-
The *forecasted date* is the total time needed to procure a product in Odoo. It is calculated by
429-
summing the lead times linked to the product's replenishment process. The total of these lead times,
430-
added to the current date, determines when Odoo checks for demanded stock.
431-
432-
.. important::
433-
The forecasted date is the **earliest possible date** the customer can receive the product if the
434-
replenishment process began right **now**. It is calculated by adding all lead times related to
435-
the product to the current date.
436-
437430
.. example::
438431
A manual reordering rule is set up with no minimum or maximum quantities.
439432

@@ -490,7 +483,7 @@ the **long-term forecasted quantity**.
490483

491484
Opening the :guilabel:`Forecasted Report` shows the :guilabel:`Forecasted` units is `5.00`.
492485

493-
.. _inventory/product_management/visibility-days:
486+
.. _inventory/warehouses_storage/visibility-days:
494487

495488
Visibility days
496489
===============
@@ -539,9 +532,6 @@ Setting :guilabel:`Visibility Days` to `20.0` allows Odoo to "look ahead" 20 day
539532
- It groups |SO| 2's order with |SO| 1, reducing shipping costs by consolidating orders.
540533
- |SO| 3, which is due on Dec 25, is one day late and is not grouped with the other two orders.
541534

542-
.. image:: reordering_rules/visibility-days.png
543-
:alt: Visibility days visualization.
544-
545535
Counterexample where visibility days is not triggered
546536
-----------------------------------------------------
547537

@@ -557,3 +547,19 @@ replenishment costs more effectively.
557547

558548
.. image:: reordering_rules/counterexample.png
559549
:alt: Example where the visibility days does not trigger.
550+
551+
Horizon days
552+
============
553+
554+
*Horizon days* determine how many days ahead Odoo checks if the forecasted quantity will drop below
555+
reordering rule's minimum. The feature is meant to help users plan replenishment in advance, by
556+
increasing the :ref:`forecasted date <inventory/warehouses_storage/forecasted-date>`.
557+
558+
.. math::
559+
:class: overflow-scroll
560+
561+
\text{Forecasted date} = \text{Current date} + \text{Vendor Lead Time} + \text{Horizon Days}
562+
563+
564+
Since horizon days are only meant to be used with manual reordering rules, find details about the
565+
feature in the :doc:`Replenishment report article <report>`.

content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.rst

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,57 @@ in the reordering rule.
6161
.. image:: report/order-to-max.png
6262
:alt: The Order to Max option on the replenishment dashboard.
6363

64+
.. _inventory/warehouses_storage/horizon-days:
65+
66+
Horizon days
67+
------------
68+
69+
*Horizon days* determine how many days ahead Odoo checks if the forecasted quantity will drop below
70+
reordering rule's minimum. The feature is meant to help users plan replenishment in advance, by
71+
increasing the :ref:`forecasted date <inventory/warehouses_storage/forecasted-date>` on the
72+
:doc:`replenishment report <report>`.
73+
74+
.. example::
75+
Setting horizon days to `7` ensures all manual reordering rules set to trigger within the next
76+
seven days appear on the replenishment report, allowing users to review and decide which products
77+
to order in advance.
78+
79+
To set horizon days, go to :menuselection:`Inventory app --> Operations --> Replenishment`, and
80+
click :icon:`fa-angle-double-right` :icon:`fa-folder` :guilabel:`Manual` in the left sidebar. In the
81+
menu that appears, set the number of :guilabel:`Horizon` days.
82+
83+
Both horizon days and :ref:`visibility days <inventory/warehouses_storage/visibility-days>` allow
84+
Odoo to anticipate future demand, but they work differently:
85+
86+
- **Visibility days**: only checks future demand if a replenishment would have been triggered today.
87+
- **Horizon days**: looks ahead a specified number of days and triggers reordering rules as soon as
88+
the forecasted quantity falls below the minimum within that window — even if no replenishment is
89+
needed today.
90+
91+
.. example::
92+
- Current date: Feb 18
93+
- On hand quantity: 10
94+
- Reordering rule: Min: 5, Max 10
95+
- Vendor lead time: 1 day
96+
97+
8 units are needed for an |SO| on Feb 23. That means, on Feb 23, there will only be 2 units in
98+
stock.
99+
100+
**Without horizon days**
101+
102+
- The demand appears on the replenishment report only on Feb 22, one day before the delivery
103+
date.
104+
- Forecasted date: Feb 19 (current date + vendor lead time)
105+
106+
**With horizon days (4 or more days)**
107+
108+
- Odoo considers demand up to Feb 23 as relevant today (Feb 18)
109+
- The need for 8 more units appears immediately in the replenishment report
110+
- Forecasted date: Feb 23 (current date + vendor lead time + horizon days)
111+
112+
.. image:: report/horizon-days.png
113+
:alt: Show forecasted date brought forward.
114+
64115
Replenishment information
65116
=========================
66117

0 commit comments

Comments
 (0)