diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 944c6432b5..79c662182e 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -93,6 +93,7 @@ dynamic_javascript_urls = [ url(r'^barcode.js', DynamicJsView.as_view(template_name='js/barcode.js'), name='barcode.js'), url(r'^bom.js', DynamicJsView.as_view(template_name='js/bom.js'), name='bom.js'), url(r'^build.js', DynamicJsView.as_view(template_name='js/build.js'), name='build.js'), + url(r'^calendar.js', DynamicJsView.as_view(template_name='js/calendar.js'), name='calendar.js'), url(r'^company.js', DynamicJsView.as_view(template_name='js/company.js'), name='company.js'), url(r'^order.js', DynamicJsView.as_view(template_name='js/order.js'), name='order.js'), url(r'^part.js', DynamicJsView.as_view(template_name='js/part.js'), name='part.js'), diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index e240c69861..972ff16f9c 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -107,6 +107,13 @@ class POList(generics.ListCreateAPIView): except (ValueError, SupplierPart.DoesNotExist): pass + # Filter by 'date range' + min_date = params.get('min_date', None) + max_date = params.get('max_date', None) + + if min_date is not None and max_date is not None: + queryset = PurchaseOrder.filterByDate(queryset, min_date, max_date) + return queryset filter_backends = [ @@ -298,7 +305,7 @@ class SOList(generics.ListCreateAPIView): max_date = params.get('max_date', None) if min_date is not None and max_date is not None: - queryset = SalesOrder.filter_interesting_orders(queryset, min_date, max_date) + queryset = SalesOrder.filterByDate(queryset, min_date, max_date) return queryset diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 27bcd4acca..08b88264ae 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -121,6 +121,44 @@ class PurchaseOrder(Order): received_by: User that received the goods """ + @staticmethod + def filterByDate(queryset, min_date, max_date): + """ + Filter by 'minimum and maximum date range' + + - Specified as min_date, max_date + - Both must be specified for filter to be applied + - Determine which "interesting" orders exist bewteen these dates + + To be "interesting": + - A "received" order where the received date lies within the date range + - TODO: A "pending" order where the target date lies within the date range + - TODO: An "overdue" order where the target date is in the past + """ + + date_fmt = '%Y-%m-%d' # ISO format date string + + # Ensure that both dates are valid + try: + min_date = datetime.strptime(str(min_date), date_fmt).date() + max_date = datetime.strptime(str(max_date), date_fmt).date() + except (ValueError, TypeError): + # Date processing error, return queryset unchanged + return queryset + + # Construct a queryset for "received" orders within the range + received = Q(status=PurchaseOrderStatus.COMPLETE) & Q(complete_date__gte=min_date) & Q(complete_date__lte=max_date) + + # TODO - Construct a queryset for "pending" orders within the range + + # TODO - Construct a queryset for "overdue" orders within the range + + flt = received + + queryset = queryset.filter(flt) + + return queryset + def __str__(self): prefix = getSetting('PURCHASEORDER_REFERENCE_PREFIX') @@ -302,7 +340,7 @@ class SalesOrder(Order): OVERDUE_FILTER = Q(status__in=SalesOrderStatus.OPEN) & ~Q(target_date=None) & Q(target_date__lte=datetime.now().date()) @staticmethod - def filter_interesting_orders(queryset, min_date, max_date): + def filterByDate(queryset, min_date, max_date): """ Filter by "minimum and maximum date range" @@ -332,7 +370,8 @@ class SalesOrder(Order): # Construct a queryset for "pending" orders within the range pending = Q(status__in=SalesOrderStatus.OPEN) & ~Q(target_date=None) & Q(target_date__gte=min_date) & Q(target_date__lte=max_date) - # Construct a queryset for "overdue" orders within the range + # TODO: Construct a queryset for "overdue" orders within the range + flt = completed | pending queryset = queryset.filter(flt) diff --git a/InvenTree/order/templates/order/purchase_orders.html b/InvenTree/order/templates/order/purchase_orders.html index 347033a888..53502376cb 100644 --- a/InvenTree/order/templates/order/purchase_orders.html +++ b/InvenTree/order/templates/order/purchase_orders.html @@ -1,5 +1,6 @@ {% extends "base.html" %} +{% load inventree_extras %} {% load static %} {% load i18n %} @@ -18,6 +19,12 @@ InvenTree | {% trans "Purchase Orders" %} {% endif %} + +