[ADD] Manufacturing: MO costs

closes odoo/documentation#10015

Signed-off-by: John Holton (hojo) <hojo@odoo.com>
This commit is contained in:
John Holton (hojo) 2024-06-28 14:44:38 -07:00
parent 6b17ed5052
commit 2de0593eb7
5 changed files with 217 additions and 0 deletions

View File

@ -12,3 +12,4 @@ Basic setup
basic_setup/one_step_manufacturing
basic_setup/two_step_manufacturing
basic_setup/three_step_manufacturing
basic_setup/mo_costs

View File

@ -0,0 +1,216 @@
=========================
Manufacturing order costs
=========================
.. |MO| replace:: :abbr:`MO (Manufacturing Order)`
.. |MOs| replace:: :abbr:`MOs (Manufacturing Orders)`
.. |POs| replace:: :abbr:`POs (Purchase Orders)`
.. |BoM| replace:: :abbr:`BoM (Bill of Materials)`
.. |BoMs| replace:: :abbr:`BoMs (Bills of Materials)`
The ability to accurately calculate the cost of manufacturing a product is critical when determining
product profitability. Odoo's *Manufacturing* app simplifies this calculation by automatically
calculating the cost to complete each manufacturing order (MO), as well as the average production
cost of a product, based on all completed |MOs|.
.. important::
Odoo's Manufacturing app distinguishes between the *manufacturing order cost* and the *real cost*
of an |MO|.
The |MO| cost represents how much it *should* cost to complete an |MO|, based on the
configuration of the product's bill of materials (BoM). This takes into account the cost and
quantity of components, as well as the cost of completing the necessary operations.
The real cost represents how much it *actually* costs to complete the |MO|. A few factors can
cause the real cost to differ from the |MO| cost. For example, an operation may take longer to
complete than estimated, a greater component quantity might be needed than was specified on the
|BoM|, or the price of components may change during manufacturing.
Cost configuration
==================
Odoo computes |MO| costs based on the configuration of the |BoM| used to manufacture a product. This
includes the cost and quantity of components and operations listed on the |BoM|, in addition to the
operating costs of the work centers where those operations are carried out.
Component cost
--------------
Component cost is calculated automatically, based on the average purchase cost of a component across
all purchase orders (POs). To view a component's cost, navigate to :guilabel:`Inventory app -->
Products --> Products`, and select a component product. The cost is displayed in the
:guilabel:`Cost` field of the :guilabel:`General Information` tab, on the component's product form.
It is possible to set the cost of a component manually, by clicking the :guilabel:`Cost` field on
the component's product form, and entering a value. However, any future |POs| for the component
override a value entered manually, resetting the :guilabel:`Cost` field back to an automatically
computed value.
Work center cost
----------------
To set the operating cost for a specific work center, navigate to :menuselection:`Manufacturing app
--> Configuration --> Work Centers`, and select a work center.
To set the operating cost for the work center, as a whole, enter a value in the :guilabel:`per
workcenter` field, located beside the :guilabel:`Cost per hour` section on the work center's
:guilabel:`General Information` tab. This operating cost is used regardless of how many employees
are working at the work center at any given time.
To set the operating cost for the work center based on the number of employees working there at a
given time, enter a value in the :guilabel:`per employee` field, located beside the :guilabel:`Cost
per hour` section on the work center's :guilabel:`General Information` tab. For example, if `25.00`
is entered in the :guilabel:`per employee` field, it costs $25.00 per hour for *each* employee
working at the work center.
Note that, if values are entered in both the :guilabel:`per workcenter` *and* :guilabel:`per
employee` fields, the value in the :guilabel:`per workcenter` field takes precedence, and the value
in the :guilabel:`per employee` field is ignored.
.. important::
It is also possible to set a per hour cost for specific employees, by navigating to the
:menuselection:`Employees` app, selecting an employee, clicking the :guilabel:`HR Settings` tab
on their employee form, and entering a value in the :guilabel:`Hourly Cost` field.
Just like the *per workcenter* field on a work center form, the :guilabel:`Hourly Cost` field on
an employee's form overrides the *per employee* field on a work center form.
However, the *per workcenter* field takes precedence over both the *per employee* field on the
workcenter form *and* the :guilabel:`Hourly Cost` field on the employee form.
|BoM| cost
----------
Configuring a |BoM| so Odoo can accurately calculate the cost of |MOs| that use it requires two
steps. First, components **must** be added, and the required quantity specified. Second, operations
**must** be added, along with the work centers where they are carried out.
Begin by navigating to :menuselection:`Manufacturing app --> Products --> Bills of Materials`.
Select a |BoM|, or create a new one by clicking :guilabel:`New`.
In the :guilabel:`Components` tab of the |BoM| form, add each component by clicking :guilabel:`Add a
line`, selecting the component from the drop-down menu in the :guilabel:`Component` column, and
entering the quantity in the :guilabel:`Quantity` column.
In the :guilabel:`Operations` tab, add an operation by clicking :guilabel:`Add a line` to open the
:guilabel:`Create Operations` pop-up window. Enter a title for the operation in the
:guilabel:`Operation` field.
Select the :guilabel:`Work Center` where the operation is carried out. Then, add a
:guilabel:`Default Duration`, which is the estimated amount of time the operation takes to complete.
By default, the :guilabel:`Duration Computation` field is set to :guilabel:`Set duration manually`,
which means that the number entered in :guilabel:`Default Duration` field is always used as the
expected duration of the operation.
Selecting :guilabel:`Compute based on tracked time` causes Odoo to automatically compute the default
duration based on a certain number of work orders, which is set in the :guilabel:`Based on` field.
Before there are work orders to compute this duration, the value in the :guilabel:`Default Duration`
field is used instead.
The hourly cost of operating the work center, and the duration of the operation, are used to
calculate the operation's cost.
Finally, click :guilabel:`Save & Close` to add the operation to the |BoM|, and close the
:guilabel:`Create Operations` pop-up window. Alternatively, click :guilabel:`Save & New` to add the
operation to the |BoM|, and open a blank :guilabel:`Create Operations` pop-up window to add another
operation.
.. seealso::
For a full overview of |BoM| configuration, see the documentation on :doc:`bills of materials
<bill_configuration>`.
|MO| overview
=============
Each |MO| has an *overview* page, which lists a variety of information about the |MO|, including
|MO| cost and real cost. To view the overview for an |MO|, navigate to :menuselection:`Manufacturing
app --> Operations --> Manufacturing Orders`, and select an |MO|. Then, click the :icon:`fa-bars`
:guilabel:`Overview` smart button at the top of the |MO|.
Both the |MO| cost and real cost take into account the cost and quantity of components, as well as
the cost of completing each work order. The overview page lists a row for each of these values, with
the sum of them listed at the bottom of the :guilabel:`MO Cost` and :guilabel:`Real Cost` columns.
Before work begins on an |MO|, the :guilabel:`MO Cost` and :guilabel:`Real Cost` columns display the
same costs. This is the *estimated* cost of completing the |MO|.
However, once work commences, the values in the :guilabel:`Real Cost` column may begin to diverge
from the values in the :guilabel:`MO Cost` column. This happens if a different component quantity is
used than was listed on the |MO|, or if the duration of a work order is different than expected.
Once the |MO| has been completed by clicking :guilabel:`Produce All`, the values in the
:guilabel:`MO Cost` column update to match those displayed in the :guilabel:`Real Cost` column.
.. image:: mo_costs/overview.png
:align: center
:alt: The MO Overview page.
Average manufacturing cost
==========================
In addition to the cost of each individual |MO| for a product, Odoo also tracks the average cost of
manufacturing the product, taking into account the cost of every completed |MO|. To view this,
navigate to :menuselection:`Inventory app --> Products --> Products`, and select a product.
The manufacturing cost of the product is displayed per unit of measure in the :guilabel:`Cost`
field, located in the :guilabel:`General Information` tab. The value continues to update as the
costs of additional |MOs| are factored into the average cost.
To the right of the :guilabel:`Cost` field is a :guilabel:`Compute Price from BoM` button, which
only appears for products with at least one |BoM|. Click this button to reset the cost of the
product to the expected cost, which only takes into account the components and operations listed on
the |BoM|.
.. important::
Be aware that clicking :guilabel:`Compute Price from BoM` does not set the price permanently. The
cost continues to update based on the average of the |BoM| price and the real cost of any future
|MOs|.
.. admonition:: Example workflow: manufacturing cost
:class: alert alert-success
Golf product manufacturer *Fairway Fields* produces a variety of golf products, including an
indoor *putting green*. They have configured a |BoM| for the putting green, so Odoo automatically
calculates the manufacturing cost of each putting green |MO|.
The |BoM| lists two components:
- One unit of *green felt*, which costs $20.00.
- One unit of a *rubber pad*, which costs $30.00.
The |BoM| also lists four operations, all of which are carried out at *Assembly Station 1*, which
has an hourly operating cost of $30.00. Those operations are as follows:
- *Cut felt*: default duration of seven minutes, for a total cost of $3.50.
- *Cut rubber pad*: default duration of five minutes, for a total cost of $2.50.
- *Attach pad to felt*: default duration of 15 minutes, for a total cost of $7.50.
- *Cut holes*: default duration of three minutes, for a total cost of $1.50.
Altogether, the components required to produce one putting green cost $50.00, and the operations
required cost $15.00, for a total manufacturing cost of $65.00. This cost is reflected in the
:guilabel:`Cost` field on the putting green's product form.
Fairway Fields confirms an |MO| for one putting green. Before manufacturing starts, the |MO|
overview lists a cost of `$65.00` in both the :guilabel:`MO Cost` and :guilabel:`Real Cost`
fields.
.. image:: mo_costs/overview-before.png
:align: center
:alt: The MO Overview page for one putting green, before production starts.
Manufacturing begins, and the operations take ten minutes longer than expected, for a total
manufacturing time of 40 minutes. This deviation from the |BoM| is reflected on the |MO|
overview, which now lists a :guilabel:`Real Cost` of `$70.00`.
.. image:: mo_costs/overview-during.png
:align: center
:alt: The MO Overview page for one putting green, during production.
Once manufacturing is finished, and the |MO| is marked as *Done*, the |MO| overview updates
again, so the values in the :guilabel:`MO Cost` and :guilabel:`Real Cost` columns match, each
displaying a value of `$70.00`.
On the putting green's product page, the :guilabel:`Cost` field now displays a cost of `$67.50`,
the average of the original cost of $65.00 and the real cost of $70.00 from the |MO|.

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB