[IMP] inventory: fwport removal strategy
closes odoo/documentation#6448
X-original-commit: ba34f754ce
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
@ -1,257 +1,376 @@
|
||||
================================================================
|
||||
What is a Removal Strategy (FIFO, LIFO, FEFO, Closest location)?
|
||||
================================================================
|
||||
=====================================
|
||||
Removal strategies (FIFO, LIFO, FEFO)
|
||||
=====================================
|
||||
|
||||
.. _inventory/routes/strategies/removal:
|
||||
|
||||
For companies with warehouses, **removal strategies** determine which products are taken from the
|
||||
warehouse, and when. Removal strategies are typically defined for specific picking operations. This
|
||||
helps companies to select the best products, optimize the distance workers need to travel when
|
||||
picking items for orders, and account for quality control, such as moving products with expiration
|
||||
dates.
|
||||
|
||||
Usually, *Removal Strategies* are defined in picking operations to select the best products to
|
||||
optimize the distance for the worker, for quality control purposes, or to first move the products
|
||||
with the closest expiration date.
|
||||
|
||||
When a product movement needs to be done, Odoo finds available products that can be assigned to
|
||||
the transfer. The way Odoo assigns these products depends on the *Removal Strategy* defined in
|
||||
the *Product Category* or on the *Location*.
|
||||
When a product needs to be moved, Odoo finds available products that can be assigned to the
|
||||
transfer. The way Odoo assigns these products depends on the :guilabel:`Removal Strategy` defined in
|
||||
either the :guilabel:`Product Category` or the :guilabel:`Location` dashboards.
|
||||
|
||||
To change the :guilabel:`Removal Strategy`, go to :menuselection:`Inventory app --> Configuration
|
||||
--> Locations` or :menuselection:`Product Categories`. Click on a :guilabel:`Location` or
|
||||
:guilabel:`Product Category`, and then click :guilabel:`Edit`. Change the product category
|
||||
:guilabel:`Force Removal Strategy` or the location :guilabel:`Removal Strategy` by clicking on the
|
||||
drop-down menu and selecting the desired removal strategy. After selecting the new removal strategy,
|
||||
click :guilabel:`Save`.
|
||||
|
||||
.. image:: removal/product-category-location.png
|
||||
:align: center
|
||||
:alt: Change the Force Removal Strategy for either the Product Categories or Locations.
|
||||
|
||||
What happens inside the warehouse?
|
||||
==================================
|
||||
|
||||
Imagine a generic warehouse plan, with receiving docks and areas, storage locations, picking and
|
||||
packing areas, and shipping docks. All products go through all these locations, but some rules,
|
||||
such as removal strategies, can have an effect on which products are taken for the pickings.
|
||||
Most warehouses share the same important areas: receiving docks and sorting areas, storage
|
||||
locations, picking and packing areas, and shipping/loading docks. While all products entering or
|
||||
leaving the warehouse might go through each of these locations at some point, removal strategies can
|
||||
have an effect on which products are taken, from where, and when.
|
||||
|
||||
.. image:: removal/empty-dock.png
|
||||
:align: center
|
||||
:alt: Empty stock waiting for deliveries at the docks.
|
||||
In this example below, vendor trucks unload pallets of goods at the receiving docks. Then, operators
|
||||
scan the products in the receiving area, with the reception date and expiration date. After that,
|
||||
products are stored in their respective storage locations.
|
||||
|
||||
Here, vendor trucks unload pallets of goods at the docks. Then, operators scan the products in the
|
||||
receiving area with the reception date and, if the product has an expiration date, the expiration
|
||||
date. After that, products are stored in their respective locations.
|
||||
.. note::
|
||||
Not all products have expiration dates, but in this example, expiration dates apply.
|
||||
|
||||
.. image:: removal/entering-stocks.png
|
||||
:align: center
|
||||
:alt: Products entering stock via the receiving area.
|
||||
|
||||
Next, several orders for the same product are made, but in this example, the goods weren't received
|
||||
on the same day and they don't have the same expiration date. In that situation, logically, sending
|
||||
those with the closest date first is preferred. Depending on the chosen removal strategy, Odoo
|
||||
generates a transfer with the products that fit the settings the best.
|
||||
In Odoo, receive products by navigating to the :menuselection:`Inventory` application, and in the
|
||||
kanban view, click on either the :guilabel:`Receipts` heading or :guilabel:`# TO PROCESS` button.
|
||||
On the :guilabel:`Receipts` dashboard, find and click on the individual receipt which will open the
|
||||
warehouse intake form. Click :guilabel:`Edit`, and then enter the received quantity in the
|
||||
:guilabel:`Done` column. To finish, :guilabel:`Validate` to receive the products and register them
|
||||
in the Odoo database.
|
||||
|
||||
.. tip::
|
||||
Receiving products can also be done within the Odoo *Barcode* application. If using the
|
||||
*Barcode* app, scan the product(s), update the quantity, and finally, click :guilabel:`Validate`.
|
||||
After products are received in Odoo, the products can then be moved to their respective storage
|
||||
locations.
|
||||
|
||||
Continuing with the same example, below, imagine several sales orders are made for the products
|
||||
received earlier, that use expiration dates. In this example, the products weren't received on the
|
||||
same day, and they don't have the same expiration date. In this situation, logically, sending
|
||||
products with the closest expiration date is preferred, instead of products received first or last.
|
||||
Using the chosen removal strategy configured for those products (in this example, :ref:`FEFO
|
||||
<routes/FEFO>`), Odoo generates a transfer for the products with the soonest expiration date to the
|
||||
picking area, then the packing area, and finally, to the shipping docks for delivery to the
|
||||
customer.
|
||||
|
||||
.. image:: removal/packing-products.png
|
||||
:align: center
|
||||
:alt: :alt: Products being packed at the packing area for delivery, taking expiration dates into
|
||||
:alt: Products being packed at the packing area for delivery, taking the expiration dates into
|
||||
account.
|
||||
|
||||
.. note::
|
||||
To pick for delivery, the product's lot/serial number can be found on the transfer form.
|
||||
To pick for delivery, the product's lot/serial number can be found on the transfer form. To learn
|
||||
more about picking and shipping, refer to either the :ref:`Two-step delivery
|
||||
<inventory/receipts_delivery_two_steps>` or :ref:`Three-step delivery
|
||||
<inventory/delivery_three_steps>` documentation.
|
||||
|
||||
How does it work?
|
||||
=================
|
||||
How each removal strategy works
|
||||
===============================
|
||||
|
||||
Removal strategies determine which products are taken from the warehouse when orders are confirmed.
|
||||
|
||||
First In, First Out (FIFO)
|
||||
--------------------------
|
||||
|
||||
When using a *First In, First Out* (FIFO) strategy, a demand for some products triggers a removal
|
||||
rule, which requests a transfer for the lot/serial number that has entered the stock first.
|
||||
When using a :guilabel:`First In, First Out (FIFO)` strategy, demand for a product triggers a
|
||||
removal rule, which requests a transfer for the lot/serial number that entered the stock first (and
|
||||
therefore, has been in stock for the longest time).
|
||||
|
||||
For example, imagine there are three lots of nails in the warehouse. Those three have the following
|
||||
lot numbers: :guilabel:`00001`, :guilabel:`00002`, :guilabel:`00003`, each with five boxes of nails
|
||||
in it.
|
||||
For example, imagine there are three lots of nails in the warehouse, and have the corresponding lot
|
||||
numbers: `00001`, `00002`, `00003`. Each lot has five boxes of nails in it.
|
||||
|
||||
:guilabel:`00001` entered the stock on the 23rd of May, :guilabel:`00002` on the 25th of
|
||||
May, and :guilabel:`00003` on the 1st of June. A customer orders six boxes on the 11th of June.
|
||||
With the :abbr:`FIFO (First In, First Out)` removal strategy selected, a transfer is requested for
|
||||
the five boxes of :guilabel:`00001` and one of the boxes in :guilabel:`00002`, because
|
||||
:guilabel:`00001` entered the stock before the others. The box from :guilabel:`00002` is taken next
|
||||
because it has the oldest reception date after :guilabel:`00001`.
|
||||
Lot `00001` entered the stock on May 23, lot `00002` on May 25, and lot `00003` on June 1. A
|
||||
customer orders six boxes on June 11.
|
||||
|
||||
So, for every order of a product with the :abbr:`FIFO (First In, First Out)` strategy selected,
|
||||
Odoo requests a transfer for the products that have been in the stock for the longest period.
|
||||
Using the :abbr:`FIFO (First In, First Out)` removal strategy, a transfer request will pick the five
|
||||
boxes from lot `00001` first, and then from the boxes in lot `00002`, since lot `00001` entered the
|
||||
stock first. The box from lot `00002` is taken next because it has the oldest receipt date after lot
|
||||
`00001`.
|
||||
|
||||
.. image:: removal/fifo-nails-picking.png
|
||||
:align: center
|
||||
:alt: The detailed operations for the transfer shows the nail lots to be removed.
|
||||
|
||||
Last In, First Out (LIFO)
|
||||
-------------------------
|
||||
|
||||
Similar to :abbr:`FIFO (First In, First Out)`, the *Last In, First Out* (LIFO) strategy moves
|
||||
products based on the date they entered the stock. Here, a demand for some products triggers a
|
||||
removal rule that requests a transfer for the lot/serial number that has entered the stock most
|
||||
recently.
|
||||
Similar to the :abbr:`FIFO (First In, First Out)` method, the :guilabel:`Last In, First Out (LIFO)`
|
||||
removal strategy moves products based on the date they entered a warehouse's stock. Instead of
|
||||
removing the oldest stock on-hand, however, it targets the **newest** stock on-hand for removal.
|
||||
|
||||
For example, imagine there are three lots of screws in the warehouse. Those three have the following
|
||||
numbers: :guilabel:`10001`, :guilabel:`10002`, and :guilabel:`10003`, each with 10 boxes of screws
|
||||
in it.
|
||||
Every time an order for products with the :abbr:`LIFO (Last In, First Out)` method is placed, a
|
||||
transfer is created for the lot/serial number that has most recently entered the stock (the **last**
|
||||
lot/serial number that entered the warehouse's inventory).
|
||||
|
||||
:guilabel:`10001` entered the stock on the 1st of June, :guilabel:`10002` on the 3rd of June, and
|
||||
:guilabel:`10003` on the 6th of June. A customer orders seven boxes on the 8th of June. With the
|
||||
:abbr:`LIFO (Last In, First Out)` removal strategy selected, a transfer is requested for seven
|
||||
boxes of :guilabel:`10003` because that lot is the last one to have entered the stock.
|
||||
.. warning::
|
||||
In many countries, the :abbr:`LIFO (Last In, First Out)` removal strategy in banned, since it can
|
||||
potentially result in old, expired, or obsolete products being delivered to customers.
|
||||
|
||||
Basically, for every order of a product with the :abbr:`LIFO (Last In, First Out)` strategy used,
|
||||
a transfer for the last lot to have entered the stock is requested.
|
||||
For example, imagine there are three lots of boxes of screws in the warehouse, and have the
|
||||
corresponding lot numbers: `10001`, `10002`, and `10003`, each with 10 boxes of screws per lot.
|
||||
|
||||
Lot `10001` entered the stock on June 1, lot `10002` on June 3, and lot `10003` on June 6. A
|
||||
customer orders seven boxes on June 8.
|
||||
|
||||
Using the :abbr:`LIFO (Last In, First Out)` removal strategy, a transfer is requested for seven
|
||||
boxes of screws from lot `10003` because that lot is the last one to have entered the stock.
|
||||
|
||||
.. image:: removal/lifo-nails.png
|
||||
:align: center
|
||||
:alt: The detailed operations shows which lots are being selected for the picking.
|
||||
|
||||
First Expired, First Out (FEFO)
|
||||
-------------------------------
|
||||
|
||||
While the :abbr:`FIFO (First In, First Out)` and :abbr:`LIFO (Last In, First Out)` methods target
|
||||
products for removal based on date of entry into the warehouse, the :guilabel:`First Expired, First
|
||||
Out (FEFO)` method targets products for removal based on their assigned expiration dates.
|
||||
|
||||
Using the :abbr:`FEFO (First Expired, First Out)` removal strategy, every sales order that includes
|
||||
products with this removal strategy assigned ensures that transfers are requested for products with
|
||||
the expiration date soonest to the order date.
|
||||
|
||||
As an example, imagine there are three lots of six-egg boxes. Those three lots have the following
|
||||
lot numbers: `20001`, `20002`, and `20003`, each with five boxes in it.
|
||||
|
||||
Lot `20001` entered the stock on July 1 and expires on July 15, lot `20002` entered on July 2 and
|
||||
expires on July 14, and lot `20003` entered on July 3 and expires on July 21. A customer orders six
|
||||
boxes on July 5.
|
||||
|
||||
Using the :abbr:`FEFO (First Expired, First Out)` method, a transfer is requested for the five boxes
|
||||
from lot `20002` and one from lot `20001`. All the boxes in lot `20002` are transferred because they
|
||||
have the earliest expiration date. The transfer also requests one box from lot `20001` because it
|
||||
has the next closest expiration date after lot `20002`.
|
||||
|
||||
.. image:: removal/egg-lots-removal.png
|
||||
:align: center
|
||||
:alt: The detailed operations for the transfer shows the lots to be removed.
|
||||
|
||||
Using removal strategies
|
||||
========================
|
||||
|
||||
To differentiate some units of products from others, the units need to be tracked, either by
|
||||
:guilabel:`Lot` or by :guilabel:`Serial Number`. To do so, go to :menuselection:`Inventory -->
|
||||
Configuration --> Settings`. Then, activate the :guilabel:`Storage Locations`, :guilabel:`Multi-Step
|
||||
Routes`, and :guilabel:`Lots & Serial Numbers` settings. Click :guilabel:`Save` to save changes.
|
||||
|
||||
.. image:: removal/traceability.png
|
||||
:align: center
|
||||
:alt: :alt: Traceability settings.
|
||||
|
||||
.. image:: removal/warehouse-settings.png
|
||||
:align: center
|
||||
:alt: :alt: Warehouse settings.
|
||||
|
||||
.. note::
|
||||
The :abbr:`LIFO (Last In, First Out)` strategy is banned in many countries and can lead to only
|
||||
having old or obsolete products in the stock.
|
||||
To use the :abbr:`FEFO (First Expired, First Out)` removal strategy, the :guilabel:`Expiration
|
||||
Dates` setting needs to be activated as well. To enable this, go to :menuselection:`Inventory app
|
||||
--> Configuration --> Settings`, scroll down to the :guilabel:`Traceability` section, and click
|
||||
the checkbox next to :guilabel:`Expiration Dates`. Remember to click :guilabel:`Save` to save all
|
||||
changes.
|
||||
|
||||
First Expire, First Out (FEFO)
|
||||
------------------------------
|
||||
Now, specific removal strategies can be defined on product categories. To do this, go to
|
||||
:menuselection:`Inventory app --> Configuration --> Product Categories`, and choose a product
|
||||
category to define the removal strategy on. In the :guilabel:`Force Removal Strategy` field, choose
|
||||
a removal strategy.
|
||||
|
||||
The *First Expired, First Out* (FEFO) strategy is a bit different from the other two removal
|
||||
strategies. For :abbr:`FEFO (First Expired, First Out)`, the expiration date is important, not the
|
||||
date the product entered the stock.
|
||||
|
||||
For example, imagine there are three lots of six-egg boxes (in this specific case, don't forget to
|
||||
use :doc:`units of measure <../../management/products/uom>`). Those three lots have the following
|
||||
numbers: :guilabel:`20001`, :guilabel:`20002`, and :guilabel:`20003`, each with five boxes in it.
|
||||
|
||||
:guilabel:`20001` entered the stock on the 1st of July and expires on the 15th of July,
|
||||
:guilabel:`20002` entered on the 2nd and expires on the 14th of July, and :guilabel:`20003` entered
|
||||
on the 4th and expires on the 21st of July. A customer orders six boxes on the 5th of July. With
|
||||
the :abbr:`FEFO (First Expired, First Out)` strategy selected, a transfer is requested for the five
|
||||
boxes of :guilabel:`20002` and one from :guilabel:`20001`. The transfer for all the boxes in lot
|
||||
:guilabel:`20002` is because they have the closest expiration date. The transfer also requests one
|
||||
box from :guilabel:`20001` because has the next closest expiration date after lot
|
||||
:guilabel:`20002`.
|
||||
|
||||
Basically, for every sales order of a product with the :abbr:`FEFO (First Expired, First Out)`
|
||||
strategy, a transfer is requested for the product that has the nearest expiration date from the
|
||||
order date.
|
||||
|
||||
Closest Location
|
||||
----------------
|
||||
|
||||
The *Closest Location* strategy is completely different from the other removal strategies. It is
|
||||
not related to the date of entry in the warehouse, but rather the location of the product. It is
|
||||
commonly used for products that do not deteriorate with time.
|
||||
|
||||
The aim is to avoid making the warehouse worker take a long journey to the bottom of the stock when
|
||||
the product is also located at a near location. This method is only available if the
|
||||
:guilabel:`Storage Locations` setting is on. The closest location is actually the one that comes
|
||||
first in the alphabetic order.
|
||||
|
||||
Use removal strategies
|
||||
======================
|
||||
|
||||
To differentiate some units from others, the units need to be tracked, either by *lot* or by
|
||||
*serial number*. To do so, go to :menuselection:`Inventory --> Configuration --> Settings`. Then,
|
||||
activate the :guilabel:`Storage Location`, :guilabel:`Multi-Step Routes`, and :guilabel:`Lots &
|
||||
Serial Numbers` settings.
|
||||
|
||||
.. image:: removal/enabled-features.png
|
||||
.. image:: removal/product-category-removal.png
|
||||
:align: center
|
||||
:alt: Features to enable in order to properly use removal strategies.
|
||||
:alt: :alt: Removal strategy on a product category.
|
||||
|
||||
.. note::
|
||||
To work with the :abbr:`FEFO (First Expired, First Out)` strategy, also activate the
|
||||
:guilabel:`Expiration Dates` feature.
|
||||
To view all products with lots/serial numbers assigned to them, navigate to
|
||||
:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. This reveals a page with
|
||||
drop-down menus of all products assigned lots or serial numbers, filtered by *product* by default.
|
||||
To change the category these products are filtered by, click :guilabel:`Product` (in the search bar,
|
||||
in the top right of the page) to remove the default filter, and select a new filter if desired.
|
||||
|
||||
Next, go to :menuselection:`Inventory --> Configuration --> Product Categories` to define the
|
||||
removal strategy on a product category.
|
||||
|
||||
.. image:: removal/first-in-first-out.png
|
||||
.. image:: removal/lot-serial.png
|
||||
:align: center
|
||||
:alt: Force removal strategy set up as first in first out.
|
||||
:alt: Click on Products, then Lots/Serial Numbers to display all the products with lots or serial
|
||||
numbers.
|
||||
|
||||
To view the serial numbers being selected for a sales order, go to the :guilabel:`Sales app` and
|
||||
select the sales order in question. In the sales order, click the :guilabel:`Delivery` smart button
|
||||
in the top right. In the :guilabel:`Operations` tab, click the :guilabel:`⦙≣ (Detailed Operations)`
|
||||
icon in the far right for the product in question. The :guilabel:`Detailed Operations` window
|
||||
appears, and displays the lot or serial numbers selected for that specific product for the delivery
|
||||
order.
|
||||
|
||||
FIFO (First In, First Out)
|
||||
--------------------------
|
||||
|
||||
As explained, a :abbr:`FIFO (First In, First Out)` removal strategy implies that products stocked
|
||||
first move out first. Companies should use this method if they are selling products with short
|
||||
demand cycles, such as clothes, and to ensure they are not stuck with outdated styles in stock.
|
||||
The :abbr:`FIFO (First In, First Out)` removal strategy implies that products which enter a
|
||||
warehouse's stock first are removed first. Companies should use this method if they are selling
|
||||
products with short demand cycles, such as clothes, to ensure they are not stuck with outdated
|
||||
styles in stock.
|
||||
|
||||
In this example, there are three lots of white shirts. The shirts are from the
|
||||
:guilabel:`All/Clothes` category, where *FIFO* is set as the removal strategy. In the stock
|
||||
location (:guilabel:`WH/Stock`), the user can find the three lots available.
|
||||
In this example, there are three lots of white shirts. The shirts are from the *All/Clothes*
|
||||
category, where *FIFO* is set as the removal strategy. In the :guilabel:`Inventory Valuation
|
||||
Report`, the three different receipts are listed with the amounts.
|
||||
|
||||
.. image:: removal/inventory-valuation.png
|
||||
:align: center
|
||||
:alt: View of the white shirt lots inventory valuation.
|
||||
:alt: View of the lots of white shirts in the inventory valuation report.
|
||||
|
||||
Lot :guilabel:`000001` contains five shirts, :guilabel:`000002` contains three shirts, and
|
||||
:guilabel:`000003` contains two shirts.
|
||||
Lot `000001` contains five shirts, lot `000002` contains three shirts, and lot `000003` contains two
|
||||
shirts.
|
||||
|
||||
As seen above, :guilabel:`000001` entered the stock first. Now, create a sales order of six white
|
||||
shirts to check that those products from lot :guilabel:`000001` are the first ones to move out.
|
||||
To see the removal strategy in action, go to the :menuselection:`Sales app` and click
|
||||
:guilabel:`Create` to create a sales order. Next, select a :guilabel:`Customer` from the drop-down
|
||||
menu. Then click :guilabel:`Add a product` in the :guilabel:`Order Lines` tab. Select a product (for
|
||||
this example, the :guilabel:`White Shirt`) from the drop-down menu, or type in the name of the
|
||||
product in the field. Enter a quantity (for this example, `6.00`) in the :guilabel:`Quantity` field,
|
||||
then click :guilabel:`Save`, then click :guilabel:`Confirm`.
|
||||
|
||||
On the delivery order linked to the picking, the oldest lot numbers should have been reserved
|
||||
thanks to the :abbr:`FIFO (First In, First Out)` strategy.
|
||||
Once the sales order is confirmed, the delivery order will be created and linked to the picking, and
|
||||
the oldest lot numbers will be reserved thanks to the :abbr:`FIFO (First In, First Out)` strategy.
|
||||
All five shirts from lot `000001` and one shirt from lot `000002` will be selected to be sent to the
|
||||
customer.
|
||||
|
||||
.. image:: removal/reserved-lots-FIFO.png
|
||||
.. image:: removal/reserved-lots-fifo-strategy.png
|
||||
:align: center
|
||||
:alt: Two lots being reserved for a sales order with the FIFO strategy.
|
||||
|
||||
LIFO (Last In, First Out)
|
||||
-------------------------
|
||||
|
||||
With a *LIFO* strategy, that's quite the opposite. In fact, the products that are received last
|
||||
move out first. :abbr:`LIFO (Last In, First Out)` is mostly used for products without a shelf life.
|
||||
The :abbr:`LIFO (Last In, First Out)` removal strategy works in the **opposite** manner from the
|
||||
:abbr:`FIFO (First In, First Out)` strategy. With this method, the products that are received
|
||||
**last** are moved out first. This method is mostly used for products without a shelf life, and no
|
||||
time-sensitive factors, such as expiration dates.
|
||||
|
||||
In this example, let's use the white shirts again to test the :abbr:`LIFO (Last In, First Out)`
|
||||
strategy. First, open the product category via :menuselection:`Inventory --> Configuration -->
|
||||
Product Categories` and change the removal strategy to :abbr:`LIFO (Last In, First Out)`.
|
||||
In this example, there are three lots of cinder blocks. The blocks are from the *All/Building
|
||||
Materials* category, where *FIFO* is set as the removal strategy. In the :guilabel:`Inventory
|
||||
Valuation Report`, the three different receipts are listed with the amounts.
|
||||
|
||||
.. image:: removal/inventory-valuation-bricks.png
|
||||
:align: center
|
||||
:alt: View of the lots of cinder blocks in the inventory valuation report.
|
||||
|
||||
Lot `000020` contains three cinder blocks, lot `000030` contains five cinder blocks, and lot
|
||||
`0000400` contains four cinder blocks.
|
||||
|
||||
To see how the :abbr:`LIFO (Last In, First Out)` strategy works, first navigate to
|
||||
:menuselection:`Inventory app --> Configuration --> Product Categories`, and select a product
|
||||
category (for this example, the :guilabel:`All/Building Materials` category) to edit. This reveals a
|
||||
product category form.
|
||||
|
||||
Once on the product category form, under the :guilabel:`Logistics` section, change the
|
||||
:guilabel:`Force Removal Strategy` to :guilabel:`Last In First Out (LIFO)`.
|
||||
|
||||
.. image:: removal/last-in-first-out.png
|
||||
:align: center
|
||||
:alt: Last in first out strategy set up as forced removal strategy.
|
||||
:alt: Last in first out (LIFO) strategy set up as forced removal strategy.
|
||||
|
||||
Then, create a sales order for four white shirts and check that the reserved products are from lots
|
||||
:guilabel:`000003` and :guilabel:`000002`.
|
||||
To see the removal strategy in action, go to the :menuselection:`Sales app` and click
|
||||
:guilabel:`Create` to create a sales order. Next, select a :guilabel:`Customer` from the drop-down
|
||||
menu. Then click :guilabel:`Add a product` in the :guilabel:`Order Lines` tab. Select a product (for
|
||||
this example, the :guilabel:`Cinder Block`) from the drop-down menu, or type in the name of the
|
||||
product in the field. Enter a quantity (for this example, `5.00`) in the :guilabel:`Quantity` field,
|
||||
then click :guilabel:`Save`, then click :guilabel:`Confirm`.
|
||||
|
||||
.. image:: removal/reserved-lots-LIFO.png
|
||||
Once the sales order is confirmed, the delivery order will be created and linked to the picking, and
|
||||
the newest lot numbers will be reserved thanks to the :abbr:`LIFO (Last In, First Out)` strategy.
|
||||
All four cinder blocks from lot `0000400` and one cinder block from lot `000030` will be selected to
|
||||
be sent to the customer.
|
||||
|
||||
.. image:: removal/reserved-lots-lifo-strategy.png
|
||||
:align: center
|
||||
:alt: Two lots being reserved for sale with the LIFO strategy.
|
||||
|
||||
.. important::
|
||||
Don't forget that the :abbr:`LIFO (Last In, First Out)` strategy is banned in many countries!
|
||||
.. _routes/FEFO:
|
||||
|
||||
FEFO (First Expired, First Out)
|
||||
-------------------------------
|
||||
|
||||
With the :abbr:`FEFO (First Expired, First Out)` removal strategy, the way products are picked is
|
||||
not based on the reception date. In this particular case, they are dispatched according to their
|
||||
expiration date.
|
||||
The :abbr:`FEFO (First Expired, First Out)` removal strategy differs from the :abbr:`FIFO (First In,
|
||||
First Out)` and :abbr:`LIFO (Last In, First Out)` strategies, because it targets products for
|
||||
removal based on **expiration dates** instead of their warehouse receipt dates. With this method,
|
||||
the products that are going to expire first are moved out first. This method is used for perishable
|
||||
products, such as medicine, food, and beauty products.
|
||||
|
||||
Lots are picked based on their **removal date** from earliest to latest. Removal dates indicate how
|
||||
many days *before* the expiration date the product needs to be removed from stock. The removal date
|
||||
is set on the product form. Lots without a removal date defined are picked after lots with removal
|
||||
dates.
|
||||
|
||||
.. warning::
|
||||
If products are not removed from stock when they should be, lots that are past the expiration
|
||||
date may still be picked for delivery orders!
|
||||
|
||||
.. note::
|
||||
For have more information about expiration dates, please have a look at :doc:`the related doc
|
||||
<../../management/lots_serial_numbers/expiration_dates>`.
|
||||
For more information about expiration dates, reference the :doc:`Expiration dates
|
||||
</applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates>`
|
||||
document.
|
||||
|
||||
By activating the :guilabel:`Expiration Dates` feature, it becomes possible to define different
|
||||
expiration dates on the serial/lot numbers that will be used in :abbr:`FEFO (First Expired, First
|
||||
Out)`. These expiration dates can be set by going to :menuselection:`Inventory --> Products -->
|
||||
Lots/Serial Numbers`.
|
||||
First, go to :menuselection:`Inventory app --> Configuration --> Settings` and ensure
|
||||
:guilabel:`Expiration Dates` is enabled. Once the :guilabel:`Expiration Dates` setting is enabled,
|
||||
it's possible to define different expiration dates for individual serialized products, as well as
|
||||
for lot numbers containing many products.
|
||||
|
||||
In this example, there are three lots of hand cream. The creams are from the *All/Health & Beauty*
|
||||
category, where *FEFO* is set as the removal strategy. In the :guilabel:`Inventory Valuation
|
||||
Report`, the three different receipts are listed with the amounts.
|
||||
|
||||
Lot `0000001` contains twenty tubes of hand cream, expiring on Sept 30, lot `0000002` contains ten
|
||||
tubes of hand cream, expiring on November 30, and lot `0000003` contains ten tubes of hand cream,
|
||||
expiring on October 31.
|
||||
|
||||
.. image:: removal/hand-cream-lots.png
|
||||
:align: center
|
||||
:alt: View the hand cream lot numbers and expiration dates in the inventory report.
|
||||
|
||||
Expiration dates can be entered when validating the received products, or set on products by going
|
||||
to :menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. Click :guilabel:`Create`,
|
||||
enter the serial number, and select the product from the drop-down menu. Next, select the expiration
|
||||
date in the :guilabel:`Dates` tab. Finally, click :guilabel:`Save`.
|
||||
|
||||
.. image:: removal/removal-date.png
|
||||
:align: center
|
||||
:alt: View of the removal date for 0000001.
|
||||
|
||||
Lots are picked based on their removal date, from earliest to latest. Lots without a removal date
|
||||
defined are picked after lots with removal dates.
|
||||
To see how the :abbr:`FEFO (First Expired, First Out)` strategy works, first navigate to
|
||||
:menuselection:`Inventory app --> Configuration --> Product Categories`, and select a product
|
||||
category (in this example, the :guilabel:`All/Health & Beauty` category) to edit. This reveals a
|
||||
product category form.
|
||||
|
||||
.. note::
|
||||
Other dates are for informational and reporting purposes only. If not removed from the stock,
|
||||
lots that are past the expiration dates may still be picked for delivery orders!
|
||||
Once on the product category form, under the :guilabel:`Logistics` section, change the
|
||||
:guilabel:`Force Removal Strategy` to :abbr:`FEFO (First Expired, First Out)`.
|
||||
|
||||
To use the :abbr:`FEFO (First Expired, First Out)` strategy, go to :menuselection:`Inventory -->
|
||||
Configuration --> Product Categories` and set :abbr:`FEFO (First Expired, First Out)` in the
|
||||
:guilabel:`Force Removal Strategy` field.
|
||||
|
||||
.. image:: removal/first-expiry-first-out.png
|
||||
.. image:: removal/fefo.png
|
||||
:align: center
|
||||
:alt: View of the FEFO strategy being set up as forced removal strategy.
|
||||
:alt: FEFO forced removal strategy set on the product category.
|
||||
|
||||
For this particular case, the stock has hand cream. There are three lots of them.
|
||||
Next, go to the :menuselection:`Sales app` and click :guilabel:`Create` to create a sales order.
|
||||
Next, select a :guilabel:`Customer` from the drop-down menu. Then click :guilabel:`Add a product` in
|
||||
the :guilabel:`Order Lines` tab. Select a product (for this example, the :guilabel:`Hand Cream`)
|
||||
from the drop-down menu, or type in the name of the product in the field. Enter a quantity (in this
|
||||
example, `25.00`) in the :guilabel:`Quantity` field, then click :guilabel:`Save`, then click
|
||||
:guilabel:`Confirm`.
|
||||
|
||||
+-----------------------+---------------+-----------------------+
|
||||
| **Lot / Serial No** | **Product** | **Expiration Date** |
|
||||
+=======================+===============+=======================+
|
||||
| 0000001 | Hand Cream | 09/30/2019 |
|
||||
+-----------------------+---------------+-----------------------+
|
||||
| 0000002 | Hand Cream | 11/30/2019 |
|
||||
+-----------------------+---------------+-----------------------+
|
||||
| 0000003 | Hand Cream | 10/31/2019 |
|
||||
+-----------------------+---------------+-----------------------+
|
||||
Once the sales order is confirmed, the delivery order will be created and linked to the picking, and
|
||||
the lot numbers expiring first will be reserved thanks to the :abbr:`FEFO (First Expired, First
|
||||
Out)` strategy. All twenty tubes of hand cream from lot `0000001` and five from lot `0000003` will
|
||||
be selected to be sent to the customer, detailed in the :guilabel:`Detailed Operations` tab in the
|
||||
sales order.
|
||||
|
||||
When a sales order for 25 units of Hand Cream is created, Odoo automatically reserves the lots with
|
||||
the closest expiration date, :guilabel:`0000001` and :guilabel:`0000003`.
|
||||
|
||||
.. image:: removal/reserved-hand-cream.png
|
||||
.. image:: removal/pick-hand-cream.png
|
||||
:align: center
|
||||
:alt: Two hand cream lots reserved for sell with the FEFO strategy.
|
||||
:alt: Hand cream lot numbers selected for the sales order.
|
||||
|
After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 9.8 KiB |
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 24 KiB |