Repository
odoo/odoo · module folder
Module version
0.1.0
Category
Supply Chain/Inventory
Folder size
1.52 MB
License
LGPL-3
Application
No
Auto-installable
No
Website
None
Last tracking update
2026-08-11 04:11:20
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Arnold Moyaux, Julien Castiaux, Denis Roussel, William Henrotin, svs-odoo, Tiffany Chang (tic), Gorash, Djamel Touati, Pieter Claeys (clpi), Dylan Kiss (dyki), Paweł Fertyk, Quentin Wolfs, nihp-odoo, Stéphane Diez, djameltouati, Bastien PIERRE, chha-odoo, Krzysztof Magusiak (krma), agbr-odoo, Lulu Grimalkin (lugr), sawer, adip-odoo, Eliott Loop (oplo-odoo), assh-odoo, Eve Lin (evlin), Mathias Mathy
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
mrp_product_expiry, sale_stock_product_expiry
Description
Track different dates on products and production lots.
======================================================

Following dates can be tracked:
-------------------------------
    - end of life
    - best before date
    - removal date
    - alert date

Also implements the removal strategy First Expiry First Out (FEFO) widely used, for example, in food industries.

Code Analysis

Views touched (18)
XML IDNameModelTypeStatus
confirm_expiry_view Confirm expiry.picking.confirmation form New
label_lot_template_view_expiry label_lot_template_view_expiry ir.ui.view qweb Inherits stock.label_lot_template_view
quant_search_view_inherit_product_expiry stock.quant.search.inherit stock.quant search Inherits stock.quant_search_view
report_lot_label_expiry report_lot_label_expiry ir.ui.view qweb Inherits stock.report_lot_label
res_config_settings_view_form_stock res.config.settings.view.form.inherit.product.expiry.stock res.config.settings form Inherits stock.res_config_settings_view_form
search_product_lot_filter_inherit_product_expiry stock.production.lot.search.inherit stock.lot search Inherits stock.search_product_lot_filter
stock_report_delivery_document_inherit_product_expiry stock_report_delivery_document_inherit_product_expiry ir.ui.view qweb Inherits stock.report_delivery_document
stock_report_delivery_has_serial_move_line_inherit_product_expiry stock_report_delivery_has_serial_move_line_inherit_product_expiry ir.ui.view qweb Inherits stock.stock_report_delivery_has_serial_move_line
view_move_form_expiry stock.production.lot.inherit.form stock.lot form Inherits stock.view_production_lot_form
view_product_form_expiry product.template.inherit.form product.template form Inherits stock.view_template_property_form
view_production_lot_view_kanban stock.production.lot.kanban.inherit.product.expiry stock.lot kanban Inherits stock.view_production_lot_kanban
view_production_lot_view_tree stock.production.lot.list.inherit.product.expiry stock.lot list Inherits stock.view_production_lot_tree
view_stock_move_line_detailed_operation_tree_expiry stock.move.line.operations.inherit.list stock.move.line list Inherits stock.view_stock_move_line_detailed_operation_tree
view_stock_move_line_operation_tree_expiry stock.move.line.inherit.list stock.move.line list Inherits stock.view_stock_move_line_operation_tree
view_stock_move_operations_expiry stock.move.operations.inherit.form stock.move form Inherits stock.view_stock_move_operations
view_stock_quant_tree stock.quant.list.inherit.expiry_date stock.quant list Inherits stock.view_stock_quant_tree
view_stock_quant_tree_editable stock.quant.list.editable.inherit.expiry_date stock.quant list Inherits stock.view_stock_quant_tree_editable
view_stock_quant_tree_inventory_editable stock.quant.inventory.list.editable.inherit.expiry_date stock.quant list Inherits stock.view_stock_quant_tree_inventory_editable
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (12)

New fields (4)
  • description Char
    compute='_compute_descriptive_fields' args: 'Description'
  • lot_ids Many2many → stock.lot
    readonly=True required=True args: 'stock.lot'
  • picking_ids Many2many → stock.picking
    readonly=True args: 'stock.picking'
  • show_lots Boolean
    compute='_compute_descriptive_fields' args: 'Show Lots'
Public methods (2)
  • process(self)
  • process_no_expired(self)
    Remove the expired mls and confirm the picking.

New fields (2)
  • free_qty Float
    help="Available quantity (computed as Quantity On Hand - reserved quantity - quantity to remove)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type."
  • virtual_available Float
    help="Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming - Quantity to Remove)\nIn a context with a single Stock Location, this includes goods stored in this location, or any of its children.\nIn a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\nOtherwise, this includes goods stored in any Stock Location with 'internal' type."
Public methods (0)

No public methods.

New fields (5)
  • alert_time Integer
    help='Number of days before the Expiration Date after which an alert should be raised on the lot/serial number. It will be computed on the lot/serial number.' string='Alert Date'
  • expiration_time Integer
    help='Number of days after the receipt of the products (from the vendor or in stock after production) after which the goods may become dangerous and must not be consumed. It will be computed on the lot/serial number.' string='Expiration Date'
  • removal_time Integer
    help='Number of days before the Expiration Date after which the goods should be removed from the stock and not be counted in the Fresh On Hand Stock anymore.It will be computed on the lot/serial number.' string='Removal Date'
  • use_expiration_date Boolean
    help='When this box is ticked, you have the possibility to specify dates to manage product expiration, on the product and on the corresponding lot/serial numbers' string='Use Expiration Date'
  • use_time Integer
    help='Number of days before the Expiration Date after which the goods starts deteriorating, without being dangerous yet. It will be computed on the lot/serial number.' string='Best Before Date'
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • group_expiry_date_on_delivery_slip Boolean
    implied_group='product_expiry.group_expiry_date_on_delivery_slip' args: 'Display Expiration Dates on Delivery Slips'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • alert_date Datetime
    compute='_compute_dates' help='Date to determine the expired lots and serial numbers using the filter "Expiration Alerts".' readonly=False store=True string='Alert Date'
  • expiration_date Datetime
    compute='_compute_expiration_date' help='This is the date on which the goods with this Serial Number may become dangerous and must not be consumed.' readonly=False store=True string='Expiration Date'
  • product_expiry_alert Boolean
    compute='_compute_product_expiry_alert' help='The Expiration Date has been reached.'
  • product_expiry_reminded Boolean
    string='Expiry has been reminded'
  • removal_date Datetime
    compute='_compute_dates' help='This is the date on which the goods with this Serial Number should be removed from the stock and not be counted in the Fresh On Hand Stock anymore. This date will be used in FEFO removal strategy.' readonly=False store=True string='Removal Date'
  • use_date Datetime
    compute='_compute_dates' help='This is the date on which the goods with this Serial Number start deteriorating, without being dangerous yet.' readonly=False store=True string='Best before Date'
  • use_expiration_date Boolean
    related='product_id.use_expiration_date' string='Use Expiration Date'
Public methods (0)

No public methods.

New fields (1)
  • use_expiration_date Boolean
    related='product_id.use_expiration_date' string='Use Expiration Date'
Public methods (1)
  • action_generate_lot_line_vals(self, context_data, mode, first_lot, count, lot_text)
    @api.model

New fields (4)
  • expiration_date Datetime
    compute='_compute_expiration_date' help='This is the date on which the goods with this Serial Number may become dangerous and must not be consumed.' store=True string='Expiration Date'
  • is_expired Boolean
    related='lot_id.product_expiry_alert'
  • removal_date Datetime
    compute='_compute_removal_date' readonly=False store=True string='Removal Date'
  • use_expiration_date Boolean
    related='product_id.use_expiration_date' string='Use Expiration Date'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • available_quantity Float
    help="On hand quantity which hasn't been reserved on a transfer and is still fresh, in the default unit of measure of the product"
  • expiration_date Datetime
    related='lot_id.expiration_date' store=True
  • removal_date Datetime
    related='lot_id.removal_date' store=True
  • use_expiration_date Boolean
    related='product_id.use_expiration_date'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…