diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py
index dcf30151d5..3265a258ac 100644
--- a/InvenTree/InvenTree/api_version.py
+++ b/InvenTree/InvenTree/api_version.py
@@ -2,10 +2,12 @@
# InvenTree API version
-INVENTREE_API_VERSION = 86
+INVENTREE_API_VERSION = 87
"""
Increment this API version number whenever there is a significant change to the API that any clients need to know about
+v87 -> 2023-01-04 : https://github.com/inventree/InvenTree/pull/4067
+ - Add API date filter for stock table on Expiry date
v86 -> 2022-12-22 : https://github.com/inventree/InvenTree/pull/4069
- Adds API endpoints for part stocktake
diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py
index 9778ceaebe..78bbf891d6 100644
--- a/InvenTree/stock/api.py
+++ b/InvenTree/stock/api.py
@@ -830,7 +830,22 @@ class StockList(APIDownloadMixin, ListCreateDestroyAPIView):
queryset = queryset.filter(StockItem.EXPIRED_FILTER)
else:
queryset = queryset.exclude(StockItem.EXPIRED_FILTER)
+ # Filter by 'expiry date'
+ expired_date_lte = params.get('expiry_date_lte', None)
+ if expired_date_lte is not None:
+ try:
+ date_lte = datetime.fromisoformat(expired_date_lte)
+ queryset = queryset.filter(expiry_date__lte=date_lte)
+ except (ValueError, TypeError):
+ pass
+ expiry_date_gte = params.get('expiry_date_gte', None)
+ if expiry_date_gte is not None:
+ try:
+ date_gte = datetime.fromisoformat(expiry_date_gte)
+ queryset = queryset.filter(expiry_date__gte=date_gte)
+ except (ValueError, TypeError):
+ pass
# Filter by 'stale' status
stale = params.get('stale', None)
diff --git a/InvenTree/templates/js/translated/filters.js b/InvenTree/templates/js/translated/filters.js
index d2edcaf5fe..78dd67043d 100644
--- a/InvenTree/templates/js/translated/filters.js
+++ b/InvenTree/templates/js/translated/filters.js
@@ -182,6 +182,8 @@ function getFilterOptionList(tableKey, filterKey) {
value: '{% trans "false" %}',
},
};
+ } else if (settings.type == 'date') {
+ return 'date';
} else if ('options' in settings) {
return settings.options;
}
@@ -233,6 +235,8 @@ function generateFilterInput(tableKey, filterKey) {
// A 'null' options list means that a simple text-input dialog should be used
if (options == null) {
html = ``;
+ } else if (options == 'date') {
+ html = ``;
} else {
// Return a 'select' input with the available values
html = `