Skip to content

Commit

Permalink
[IMP] Inventory: Rewrite aging report as stock valuation report
Browse files Browse the repository at this point in the history
  • Loading branch information
benderliz committed Jan 9, 2025
1 parent 48a396a commit dd4777c
Show file tree
Hide file tree
Showing 9 changed files with 175 additions and 71 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,98 +1,202 @@
======================
Inventory aging report
======================
=========================
Stock valuation dashboard
=========================

.. |SVLs| replace:: :abbr:`SVLs (stock valuation layers)`

The inventory aging report evaluates all items in stock, providing insights into potentially sunken
purchase costs and delays in profitability.

Create customized pivot tables to analyze product, operation types, month, or company breakdowns.
This helps identify products in stock that are at risk of passing their expiration or viability
dates, or instances of rot/decay for fast-expiring items.

.. note::
When a company has physical assets, such as inventory, they often want to know approximately
how much has been spent on these goods, or how much they are worth at the moment. These numbers
are often reported for accounting purposes. For instance, an insurance company may want to know the
value of goods stored in a warehouse, in the event of a flood or fire.

This process of assigning a monetary value to account for inventory is known as *stock valuation*.
:doc:`Stock valuation <../../product_management/inventory_valuation/using_inventory_valuation>`
typically utilizes one of two accounting systems:
- **Perpetual**: The inventory is constantly (perpetually) being updated, and the value is
constantly changing.
- **Periodic**: The inventory value is checked on an occasional (periodic) basis, and the value is
set at this occasional time.

Using *:ref:`tracked inventory <inventory/product_management/tracking-inventory>`* in Odoo
necessitates a *perpetual* inventory accounting system because of the need to know when and where
inventory exists, and how much of it is available or forecasted. There are a few common :ref:`stock
valuation methods <inventory/warehouses_storage/costing_methods>` used in Odoo: standard price,
average cost (AVCO), and first in, first out (FIFO) accounting. It is important to know that the
valuation method chosen for a product impacts the calculation of several fields in the stock
valuation reports.

Where to access the dashboard
-----------------------------

Odoo's Stock Valuation dashboard displays the financial value of all tracked inventory, according
to each product's stock valuation method. This report can provide insights into sunken purchase
costs or delays in profitability. To access the dashboard, go to :menuselection:`Inventory app -->
Reporting --> Valuation`.

.. important::
The *Reporting* menu in *Inventory* is only accessible to users with :doc:`admin access
<../../../../general/users/access_rights>`.

To access the inventory aging report, go to :menuselection:`Inventory app --> Reporting -->
Inventory Aging`.
This dashboard has three different views, or inventory reports — :ref:`list view (i.e. the default,
stock valuation report) <inventory/warehouses_storage/valuation-report>`, :ref:`pivot view (i.e. the
stock aging report) <inventory/warehouses_storage/aging-report>`, and graph view. Each view can be
customized with different fields to break down inventory valuation by product, operation type, date,
or company.

.. _inventory/warehouses_storage/aging-report:
All three views can be filtered by various fields. To apply filters, click into the search bar at
the top of the report, or click the drop-down arrow next to it. For example, selecting the filter
:guilabel:`Has Remaining Qty` will show only pr ducts that are currently in stock.

Navigate the inventory aging report
===================================

By default, the :guilabel:`Inventory Aging` report displays a pivot table, with the month in
columns, and product category in rows. The default filters, :guilabel:`Incoming` and :guilabel:`Has
Remaining Qty`, show only products from receipts, and are currently in stock.
.. _inventory/warehouses_storage/valuation-report:

:guilabel:`Remaining Qty` displays the number of on-hand items, and :guilabel:`Remaining Value`
displays the total cost of purchasing these items.
List view: stock valuation
==========================

Clicking the :icon:`fa-plus-square` :guilabel:`(plus)` icon in each column or row reveals options to
expand the pivot table and show a detailed breakdown of the :guilabel:`Remaining Qty` and
:guilabel:`Remaining Value` by :guilabel:`Product`, :guilabel:`Product Category`, :guilabel:`Date`,
or :guilabel:`Company`. Clicking the :icon:`fa-minus-square-o` :guilabel:`(minus)` icon collapses it
back to its previous state.
By default, the :guilabel:`Stock Valuation` dashboard displays in *list view*, represented by the
:icon:`oi-view-list` :guilabel:`(list)` icon. This view is essentially a *Stock Valuation Report*,
which shows a detailed record of stock movements and their valuations.

.. figure:: aging/inventory-aging.png
:align: center
:alt: Inventory aging report.
Configure
---------

Inventory aging report, showing each **Product** in rows and each reception **Date** in columns,
to better monitor products with fast expiration dates. Each row shows the the total on-hand
quantity and inventory valuation of items purchased on each day.
The following columns are displayed by default:

.. note::
Records in the :guilabel:`Inventory Aging` report are *stock valuation layers* (SVLs),
representing product moves that impact stock valuation.
- :guilabel:`Date`: the date and time when the stock move was created. The valuation report is
sorted by this field, emphasizing the importance of time when valuing inventory.
- :guilabel:`Reference`: the reference document associated with this stock move (e.g., a
warehouse receipt, a delivery order, or a manual inventory adjustment).
- :guilabel:`Product`: the product that is being moved and valued.
- :guilabel:`Quantity`: the number of units by which this product's stock has increased or
decreased in this particular stock move.
- :guilabel:`Total Value`: the value of the product's stock in this particular stock move,
calculated by multiplying the :guilabel:`Quantity` and :guilabel:`Unit Value`.

Inventory adjustments do **not** create |SVLs|; only items purchased from vendors do.
.. note::
If a :guilabel:`Reference` document includes several goods, there will be a *separate line item*
generated on the Stock Valuation Report for *each* good.

There are additional fields that can be added to this view to provide more insight into the
stock's valuation:

- :guilabel:`Lot/Serial Number`: the uniquely identifying lot or serial number for this product.
- :guilabel:`Company`: for businesses that operate with multiple companies, this field displays
the company by which this stock move took place.
- :guilabel:`Remaining Quantity`: the number of units remaining for this valuation of the product,
after demand has been accounted for (even from other stock moves). This field can be especially
helpful for FIFO and AVCO accounting, as it conveys which units of stock came into a warehouse
first and the value of said stock.
- :guilabel:`Unit Value`: the cost of one unit of the product (**not** the price to consumers).
- :guilabel:`Description`: a description of the reason for this stock valuation (typically, a stock
move has occurred). By default, this field is set as the concatenation of the
:guilabel:`Reference` and :guilabel:`Product` fields. However, the field may also display other
important messages for this line item, such as a note stating that the line item is an adjustment
due to a change in the product's inventory valuation method.
- :guilabel:`Remaining Value`: the value of this product's current stock levels for this particular
stock move, after demand has been accounted for. Along with :guilabel:`Remaining Quantity`, this
field can be especially helpful for FIFO and AVCO accounting, as they convey which stock came
into a warehouse first and the value of said stock.

.. image:: aging/stock-valuation-report.png
:alt: Stock valuation report.

Each line item in the :guilabel:`Stock Valuation` report represents a record in Odoo's system known
as a *stock valuation layer (SVL)*. SVLs are generated when products move in a way that impacts
their stock valuation. Specifically, the stock moves that generate SVLs are warehouse receipts,
deliveries, dropshipping orders, and dropshipping returns. These stock moves must first be validated
(by clicking the :guilabel:`Validate` button) for the SVL to be created.

If a product's inventory valuation method changes on the product form, new line items are generated
on the Stock Valuation Report to reflect the resulting SVLs. For example, if the valuation method
changes from *standard price* to either *AVCO* or *FIFO* accounting, *revaluation entries* will be
automatically posted to reflect the change in pricing for goods that remain in stock. One entry will
be negative to "remove" the old pricing, and the second entry will be positive to record the new
pricing. These entries are connected to journal entries in Odoo's **Accounting** app.

.. image:: aging/before-val-method-change.png
:alt: Remaining value and quantity fields are calculated based on SVLs.

An example of what the Stock Valuation Report table shows when a few stock moves have occurred
for a product using standard price accounting.

.. image:: aging/after-val-quant.png
:alt: Remaining value and quantity fields are calculated based on SVLs.

An example of what the Stock Valuation Report table shows after a product has switched from
standard price to FIFO accounting.


.. example::
The :guilabel:`Remaining Value` and :guilabel:`Remaining Quantity` fields are derived from what
occurs at the SVL level in Odoo and, as such, are better understood with an example.

Say `Frankie's Consignment Shop` buys sweaters at the cost, or :guilabel:`Unit Value`, of
`5.00` dollars. For the first time, Frankie's purchases and receives a :guilabel:`Quantity` of
`100.00` sweaters in one stock move, then re-sells and delivers `-10.00` sweaters in a second
stock move.

In the first stock move line item, the :guilabel:`Remaining Quantity` will change from `100.00`
to `90.00`, once the second stock move is recorded. This change reflects that, although 100
sweaters were originally purchased, only 90 of those sweaters remain in stock and should be
counted in the valuation. Similarly, the :guilabel:`Remaining Value` will drop from `$500.00` to
`$450.00`. The :guilabel:`Total Value` will remain at `$500.00`, regardless of subsequent
transactions.

On the other hand, the :guilabel:`Remaining Quantity` of the second stock move line item will be
recorded and remain at `0.00` because the quantity of `-10.00` was sold. In the system, because
the SVL was a sale, there is no stock left that needs to be valued from that transaction.

.. image:: aging/remaining-val-quant.png
:alt: Remaining value and quantity fields are calculated based on SVLs.

Change the valuation date
-------------------------

The :guilabel:`Valuation At Date` button, located in the top-left corner of the Stock Valuation
page, reveals a pop-up window. In this pop-up, select a date to act as a "cut-off" for the stock
moves to be valued.

Generate reports
================
.. note::
The value of the stock moves will not be point-in-time for any dates chosen in the past. In other
words, the stock move shown when selecting a past date will still display the current on-hand
value of its products.

After learning how to :ref:`navigate the inventory aging report
<inventory/warehouses_storage/aging-report>`, it can be used to create and share different reports.
.. _inventory/warehouses_storage/aging-report:

A few common reports that can be created using the :guilabel:`Inventory Aging` report are detailed
below.
Pivot view: stock aging
=======================

Rotating stock report
---------------------
From the Stock Valuation dashboard, access pivot view by clicking the :icon:`oi-view-pivot`
:guilabel:`(pivot table)` icon. This view is essentially a *Stock Aging Report*, and it shows the
on-hand quantity and value of inventory by purchase date, which can help monitor products with
expiration dates.

To create a report to identify items that have been in stock for a while, follow these steps:
Configure
---------

#. Navigate to :menuselection:`Inventory app --> Reporting --> Inventory Aging`.
#. On the :guilabel:`Inventory Aging` report, click the :icon:`fa-caret-down` :guilabel:`(caret
down)` icon in the :guilabel:`Search...` bar to see a drop-down list of :guilabel:`Filters`,
:guilabel:`Group By`, and :guilabel:`Favorite` options.
#. Choose :guilabel:`Product` under the :guilabel:`Group By` section. Doing so expands the pivot
table to show a product in each row.
#. Click the :icon:`fa-plus-square` :guilabel:`(plus)` icon to the left of the date column. Hover
over :guilabel:`Date` from the drop-down menu and choose :guilabel:`Year`, :guilabel:`Quarter`,
:guilabel:`Month`, :guilabel:`Week`, or :guilabel:`Day`. Doing so expands the columns to show the
:guilabel:`Remaining Qty` and :guilabel:`Remaining Value` by the selected time period.
By default, the pivot view shows the value of all *product categories* by *day and month*. Clicking
the :icon:`plus-square` :guilabel:`(plus)` icon in each column or row will reveal a drop-down
list of options to further tabulate the table and create a more granular breakdown of the inventory
valuation. The drop-down options include: :guilabel:`Product`, :guilabel:`Lot/Serial Number`,
:guilabel:`Product Category`, :guilabel:`Date`, :guilabel:`Company`, or :guilabel:`Add Custom Group`
Clicking the :icon:`minus-square-o` :guilabel:`(minus)` icon collapses the field back to an empty
state.

.. tip::
For products that have a longer shelf life, choose longer time periods such as
:guilabel:`Month` or :guilabel:`Quarter` when expanding columns by :guilabel:`Date`.
In the table, the :guilabel:`Remaining Qty` column displays the number of on-hand items, and
:guilabel:`Remaining Value` displays the total cost of purchasing these items.

.. image:: aging/column-expand-icon.png
:align: center
:alt: Pivot table, highlighting the plus icon to expand columns.
.. image:: aging/stock-aging-report.png
:alt: Stock aging report, showing product row items and day columns.

#. The report now displays the on-hand stock of items, and their total purchasing cost, for each
time period.
Stock Aging report (pivot view), showing each **Product** in rows and each reception **Date** in
columns. which can help to monitor products with expiration dates.

.. example::
Inventory aging report, with the :guilabel:`Group By`: :guilabel:`Product` option selected,
and with the :guilabel:`Date` column set to :guilabel:`Day`. It gives insight into how much
raw fish sashimi products were purchased on each day, and how much it cost. This informs the
business owners how much stock is at risk of rotting in stock, per day.
Graph view
==========

.. image:: aging/inventory-aging.png
:align: center
:alt: Inventory aging report, showing product row items and day columns.
The stock value can be depicted graphically by clicking the :icon:`area-chart` :guilabel:`(graph)`
icon. By default, the graph is displayed in :icon:`line-chart` line chart view and filtered to show
the cumulative total of all inventory value over time in Odoo.

At the top of the report, a :icon:`bar-chart` bar chart or :icon:`pie-chart` pie chart view can be
selected instead.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 comments on commit dd4777c

Please sign in to comment.