diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst index cb0624988..6d8558e76 100644 --- a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst +++ b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst @@ -1,65 +1,267 @@ ================ -Expiration Dates +Expiration dates ================ -In many companies, products have expiration dates and they should be managed based on those dates. -In the food industry, for example, tracking and managing product stock based on expiration dates is -mandatory to avoid selling expired products to customers. +In Odoo, *expiration dates* can be used to manage and track the lifecycles of perishable products, +from purchase to sale. Using expiration dates reduces product loss due to unexpected expiry, and +helps to avoid sending expired products to customers. -With Odoo, you can track and manage your products based on their expiration dates, even if they are -already tracked by lots or serial numbers. +In Odoo, only products that are tracked using *lots* and *serial numbers* can be assigned expiration +information. Once a lot or serial number has been assigned, an expiration date can be set. This is +especially helpful for companies (such as food manufacturers) that consistently, or exclusively, buy +and sell perishable products. -Configuration -============= +.. seealso:: + - :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots` + - :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers` -Application configuration -------------------------- +Enable expiration dates +======================= -To use expiration date tracking, open the *Inventory* application and go to -:menuselection:`Configuration --> Settings` and activate the *Lots & Serial Numbers* and *Expiration -Dates* features. +To enable the use of *expiration dates*, go to :menuselection:`Inventory app --> Configuration --> +Settings`, and scroll down to the :guilabel:`Traceability` section. Then, click the checkbox to +enable the :guilabel:`Lots & Serial Numbers` feature. -.. image:: expiration_dates/expiration_dates_01.png +Once that feature is activated, a new option will appear to enable :guilabel:`Expiration Dates`. +Click that checkbox to enable the feature, and be sure to :guilabel:`Save` changes. + +.. image:: expiration_dates/expiration-dates-enabled-settings.png :align: center + :alt: Enabled lots and serial numbers and expiration dates settings. -Product configuration ---------------------- +.. tip:: + Once the :guilabel:`Lots & Serial Numbers` feature is activated, additional features appear to + :guilabel:`Display Lots & Serial Numbers on Delivery Slips`; to :guilabel:`Display Lots & Serial + Numbers on Invoices`; and to :guilabel:`Display Expiration Dates on Delivery Slips`. Activating + these features helps with end-to-end traceability, making it easier to manage product recalls, + identify "bad" batches of products, and more. -Now, you can define different dates in the *inventory tab* of the product form: - -- Product Use Time: the number of days before the goods start deteriorating, without being - dangerous. This is used to calculate the Best before date on each lot/serial number received. -- Product Life Time: the number of days before the goods may become dangerous and must not be - consumed. This is used to calculate the Expiration date on each lot/serial number received. -- Product Removal Time: shows the number of days before the goods should be removed from the stock. - This is used to calculate the Removal date on each lot/serial number received. -- Product Alert Time: refers to the number of days before an alert should be raised on the - lot/serial number. This is used to calculate the Alert date on each lot/serial number received. - Once the Alert date is reached, an Activity is assigned on the relevant lot/serial number to the - Responsible user defined on the Product. - -.. image:: expiration_dates/expiration_dates_02.png - :align: center - -Expiration Date on Lots/Serial Numbers +Configure expiration dates on products ====================================== -When receiving a product into inventory, the dates will automatically be updated on the -corresponding lot/serial number. These updates will be based on the receipt date of the product and -the days set on the product form. +Once the :guilabel:`Lots & Serial Numbers` and :guilabel:`Expiration Dates` features have been +enabled in the settings of the *Inventory* app, expiration information can be configured on +individual products. -.. image:: expiration_dates/expiration_dates_03.png +To do so, go to :menuselection:`Inventory app --> Products --> Products`, and select a product to +edit. Selecting a product reveals the product form for that particular item. Once on the product +form, click :guilabel:`Edit` in the upper-left corner to make changes. + +.. important:: + To be tracked using lots or serial numbers, or to configure expiration information, products + *must* have their :guilabel:`Product Type` set as :guilabel:`Storable Product` under the + :guilabel:`General Information` tab. + +Then, click the :guilabel:`Inventory` tab, and scroll down to the :guilabel:`Traceability` section. +From here, make sure that either :guilabel:`By Unique Serial Number` or :guilabel:`By Lots` is +checked. + +Once it is, a new :guilabel:`Expiration Date` checkbox appears that must also be clicked. When both +are enabled, a new :guilabel:`Dates` field appears to the right. + +.. note:: + If a product has stock on-hand prior to activating tracking by lots or serial numbers, an + inventory adjustment might need to be performed in order to assign lot numbers to the existing + stock. + +.. tip:: + For processing large quantities of products on receipts or deliveries, it is recommended to track + using lots, so multiple products can be traced back to the same lot, if any issues arise. + +.. image:: expiration_dates/expiration-dates-product-configuration.png :align: center + :alt: Expiration dates configuration on the product form. -.. image:: expiration_dates/expiration_dates_04.png +Under the :guilabel:`Dates` field, there are four categories of expiration information to configure +for the product: + +- :guilabel:`Expiration Time`: the number of days after receiving products (either from a vendor or + in stock after production) in which goods may become dangerous and should not be used or consumed. +- :guilabel:`Best Before Time`: the number of days before the expiration date in which the goods + start deteriorating, **without** necessarily being dangerous yet. +- :guilabel:`Removal Time`: the number of days before the expiration date in which the goods should + be removed from stock. +- :guilabel:`Alert Time`: the number of days before the expiration date in which an alert should be + raised on goods in a particular lot or containing a particular serial number. + +.. note:: + The values entered into these fields automatically compute the expiration date for goods entered + into stock, whether purchased from a vendor or manufactured in-house. + +Once all the expiration information has been configured, click :guilabel:`Save` to save all changes. + +.. tip:: + If the :guilabel:`Dates` field is not populated with any values for expiration information, dates + (and lots) can be manually assigned upon receipts and deliveries in and out of the warehouse. + Even when assigned, they can still be overwritten and changed manually if needed, as well. + +Set expiration dates on receipts with lots & serial numbers +=========================================================== + +Generating expiration dates for **incoming** goods can be done directly from the purchase order. To +create a purchase order, go to the :menuselection:`Purchase` app and click :guilabel:`Create` to +create a new request for quotation (RFQ). + +Then, fill out the information by adding a :guilabel:`Vendor`, and add products to the +:guilabel:`Product` lines by clicking :guilabel:`Add a product`. + +Choose the desired quantity to order by changing the number in the :guilabel:`Quantity` column, and +click :guilabel:`Confirm Order`. This converts the :abbr:`RFQ (request for quotation)` into a +purchase order. + +Click the :guilabel:`Receipt` smart button at the top of the purchase order to be taken to the +warehouse receipt form. + +.. note:: + Clicking :guilabel:`Validate` before assigning a serial number to the ordered product quantities + causes a :guilabel:`User Error` popup to appear. The popup requires entry of a lot or serial + number for the ordered products. The :abbr:`RFQ (request for quotation)` cannot be validated + without an assigned lot or serial number. + + .. image:: expiration_dates/expiration-dates-user-error-popup.png + :align: center + :alt: User error popup when validating an order with no lot number. + +From here, click the :guilabel:`Additional Options` menu (hamburger) icon located on the far-right +of the product line. When clicked, a :guilabel:`Detailed Operations` pop-up will appear. + +In this pop-up, click :guilabel:`Add a line`, and assign a lot or serial number under the +:guilabel:`Lot/Serial Number Name` field. + +An expiration date automatically populates, based on the configuration on the product form (if +previously configured). + +.. tip:: + If the :guilabel:`Dates` field on the product form has not been configured, this date can be + manually entered. + +After the expiration date has been established, mark the :guilabel:`Done` quantities, and click +:guilabel:`Confirm` to close the pop-up. Finally, click :guilabel:`Validate`. + +.. image:: expiration_dates/expiration-dates-detailed-operations-popup.png :align: center + :alt: Detailed operations popup showing expiration dates for ordered products. -Expiration Alerts -================= +A :guilabel:`Traceability` smart button will appear upon validating the receipt. Click the +:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which +includes: a :guilabel:`Reference` document; the :guilabel:`Product` being traced; the +:guilabel:`Lot/Serial #`; and more. -You can access expiration alerts from the *inventory* app. To do so, go to :menuselection:`Master -Data --> Lots/Serial Numbers`. There, you can use the pre-existing filter to show all the -lots/serial numbers that have exceeded their respective alert dates. +Set expiration dates on manufactured products +============================================= -.. image:: expiration_dates/expiration_dates_05.png +Expiration dates can also be generated for products manufactured in-house. To assign expiration +dates to manufactured products, a manufacturing order (MO) needs to be completed. + +To create a :abbr:`MO (manufacturing order)`, go to :menuselection:`Manufacturing app --> Operations +--> Manufacturing Orders`, and click :guilabel:`Create`. Choose a product to manufacture from the +:guilabel:`Product` field drop-down menu, then select the :guilabel:`Quantity` to produce. + +.. image:: expiration_dates/expiration-dates-manufacturing-order.png :align: center + :alt: Manufacturing order for product with expiration date. + +.. note:: + To manufacture a product, there must be materials to consume in the lines in the + :guilabel:`Product` column. This can be achieved either by creating a :guilabel:`Bill of + Material` for the :guilabel:`Product`, or manually adding materials to consume by clicking + :guilabel:`Add a line`. + +Once ready, click :guilabel:`Confirm`. + +Next to :guilabel:`Lot/Serial Number`, either select an existing lot number from the drop-down menu, +or click the green :guilabel:`+` sign to automatically assign a new lot number. + +Then, select a number of units for the :guilabel:`Quantity` field, and click :guilabel:`Mark as +Done`. + +Click on the :guilabel:`External Link` icon in the assigned :guilabel:`Lot/Serial Number` field. A +pop-up appears, revealing a detail form for that specific number. + +On that pop-up, under the :guilabel:`Dates` tab, all expiration information that was previously +configured for the product is displayed. That same information is also available on the detail form +for that specific product, or by going to :menuselection:`Inventory app --> Products --> Lots/Serial +Numbers`. + +.. image:: expiration_dates/expiration-dates-dates-tab-lot-number.png + :align: center + :alt: Dates tab with expiration information for specific lot number. + +Sell products with expiration dates +=================================== + +Selling perishable products with expiration dates is done the same as any other type of product. The +first step in selling perishable products is to create a sales order. + +To do that, go to :menuselection:`Sales app --> Create` to create a new quotation, and fill out the +information on the sales order form. + +Add a :guilabel:`Customer`, click :guilabel:`Add a product` to add the desired products to the +:guilabel:`Product` lines, and set a :guilabel:`Quantity` for the products. + +Then, click the :guilabel:`Other Info` tab. Under the :guilabel:`Delivery` section, change the +:guilabel:`Delivery Date` to a date after the expected date, and click the :guilabel:`green +checkmark` icon to confirm the date. Finally, click :guilabel:`Confirm` to confirm the sales order. + +Next, click the :guilabel:`Delivery` smart button at the top of the sales order to see the warehouse +receipt form. + +On the warehouse receipt form, click :guilabel:`Validate`, and then :guilabel:`Apply` in the +accompanying pop-up window, to automatically process all :guilabel:`Done` quantities, and deliver +the products to the customer. + +If the products are delivered before the :guilabel:`Alert Date` set on the product form, then no +alerts will be created. + +.. important:: + To sell perishable products with expiration dates, the :guilabel:`Removal Strategy` for the + :guilabel:`Location` the products are stored in must be set to :abbr:`FEFO (First Expiry, First + Out)`. If there is not enough stock of perishable products in one lot, Odoo will automatically + take the remaining quantity required from a second lot with the next-soonest expiration date. + Removal strategies can also be set on :guilabel:`Product Categories`. + +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/routes/strategies/removal` + +View expiration dates for lots & serial numbers +=============================================== + +To view (and/or group) all products with expiration dates by lot number, go to +:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. + +Once there, remove any default search filters from the :guilabel:`Search...` bar. Then, click +:guilabel:`Group By`, choose :guilabel:`Add Custom Group`, and select the :guilabel:`Expiration +Date` parameter from the drop-down menu. Finally, click :guilabel:`Apply` to apply the filter. + +Doing so breaks down all perishable products, their expiration dates, and the assigned lot number. + +.. image:: expiration_dates/expiration-dates-group-by-dates.png + :align: center + :alt: Group by expiration dates on lots and serial numbers page. + +Expiration alerts +----------------- + +To see expiration alerts, go to :menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. + +Then, click into a :guilabel:`Lot/Serial Number` with perishable products. Doing so reveals the +serial number detail form. On the serial number detail form, click the :guilabel:`Dates` tab to see +all expiration information related to the products. + +To edit the form, click :guilabel:`Edit` in the upper-left corner of the form, then change the +:guilabel:`Expiration Date` to today's date (or earlier), and click :guilabel:`Save` to save +changes. + +After saving, the lot number form displays a red :guilabel:`Expiration Alert` at the top of the form +to indicate that the products in this lot are either expired or expiring soon. From here, click back +to the :guilabel:`Lots/Serial Numbers` page (via the breadcrumbs). + +To see the new expiration alert, or any expiration alerts for products that are expired (or will +expire soon), remove all of the search filters from the :guilabel:`Search...` bar on the +:guilabel:`Lots/Serial Numbers` dashboard. + +Then, click :guilabel:`Filters`, and choose :guilabel:`Expiration Alerts`. + +.. image:: expiration_dates/expiration-dates-expiration-alert.png + :align: center + :alt: Expiration alert for product past the expiration date. diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-dates-tab-lot-number.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-dates-tab-lot-number.png new file mode 100644 index 000000000..37e04a06e Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-dates-tab-lot-number.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-detailed-operations-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-detailed-operations-popup.png new file mode 100644 index 000000000..e73eaa942 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-detailed-operations-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-enabled-settings.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-enabled-settings.png new file mode 100644 index 000000000..0ad0fcb9f Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-enabled-settings.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-expiration-alert.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-expiration-alert.png new file mode 100644 index 000000000..0bded14d3 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-expiration-alert.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-group-by-dates.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-group-by-dates.png new file mode 100644 index 000000000..c71509d88 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-group-by-dates.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-manufacturing-order.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-manufacturing-order.png new file mode 100644 index 000000000..2953644e2 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-manufacturing-order.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-product-configuration.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-product-configuration.png new file mode 100644 index 000000000..00d7f9ab9 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-product-configuration.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-user-error-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-user-error-popup.png new file mode 100644 index 000000000..cca7023b4 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_01.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_01.png deleted file mode 100644 index e3e9be31b..000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_02.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_02.png deleted file mode 100644 index 6c77dfa5c..000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_03.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_03.png deleted file mode 100644 index bb454605d..000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_04.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_04.png deleted file mode 100644 index de9bc2d80..000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_05.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_05.png deleted file mode 100644 index 0e41dc9e7..000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_05.png and /dev/null differ