diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index ffc8d97a92..d76c0a4b51 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -90,6 +90,13 @@ class BuildList(generics.ListCreateAPIView): if part is not None: queryset = queryset.filter(part=part) + # 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 = Build.filterByDate(queryset, min_date, max_date) + return queryset def get_serializer(self, *args, **kwargs): diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index c3b399d820..10b3b00259 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -61,6 +61,37 @@ class Build(MPTTModel): verbose_name = _("Build Order") verbose_name_plural = _("Build Orders") + @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 + """ + + 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 + + # Order was completed within the specified range + completed = Q(status=BuildStatus.COMPLETE) & Q(completion_date__gte=min_date) & Q(completion_date__lte=max_date) + + # Order target date falls witin specified range + pending = Q(status__in=BuildStatus.ACTIVE_CODES) & ~Q(target_date=None) & Q(target_date__gte=min_date) & Q(target_date__lte=max_date) + + # TODO - Construct a queryset for "overdue" orders + + queryset = queryset.filter(completed | pending) + + return queryset + def __str__(self): prefix = getSetting("BUILDORDER_REFERENCE_PREFIX") diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html index 1124dd16c0..9ca3fff818 100644 --- a/InvenTree/build/templates/build/build_base.html +++ b/InvenTree/build/templates/build/build_base.html @@ -88,11 +88,20 @@ src="{% static 'img/blank_image.png' %}" {% trans "Status" %} {% build_status_label build.status %} + + + {% if build.target_date %} + + + {% trans "Target Date" %} + + {{ build.target_date }} {% if build.is_overdue %} {% trans "Overdue" %} {% endif %} + {% endif %} {% trans "Progress" %} diff --git a/InvenTree/build/templates/build/index.html b/InvenTree/build/templates/build/index.html index 562dc746fb..37993107a7 100644 --- a/InvenTree/build/templates/build/index.html +++ b/InvenTree/build/templates/build/index.html @@ -1,4 +1,6 @@ {% extends "base.html" %} + +{% load inventree_extras %} {% load static %} {% load i18n %} @@ -8,7 +10,6 @@ InvenTree | {% trans "Build Orders" %} {% block content %} -

{% trans "Build Orders" %}

@@ -21,8 +22,17 @@ InvenTree | {% trans "Build Orders" %}
+ {% if roles.build.add %} + {% trans "New Build Order" %} + + {% endif %} + +
@@ -33,11 +43,120 @@ InvenTree | {% trans "Build Orders" %}
+
+ +{% endblock %} + +{% block js_load %} +{{ block.super }} + + {% endblock %} {% block js_ready %} {{ block.super }} +$('#build-order-calendar').hide(); +$('#view-list').hide(); + +$('#view-calendar').click(function() { + // Hide the list view, show the calendar view + $("#build-table").hide(); + $("#view-calendar").hide(); + $(".fixed-table-pagination").hide(); + $(".columns-right").hide(); + $(".search").hide(); + + $("#build-order-calendar").show(); + $("#view-list").show(); +}); + +$("#view-list").click(function() { + // Hide the calendar view, show the list view + $("#build-order-calendar").hide(); + $("#view-list").hide(); + + $(".fixed-table-pagination").show(); + $(".columns-right").show(); + $(".search").show(); + $("#build-table").show(); + $("#view-calendar").show(); +}); + $("#collapse-item-active").collapse().show(); $("#new-build").click(function() { diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 08b88264ae..184452f24e 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -372,9 +372,7 @@ class SalesOrder(Order): # TODO: Construct a queryset for "overdue" orders within the range - flt = completed | pending - - queryset = queryset.filter(flt) + queryset = queryset.filter(completed | pending) return queryset diff --git a/InvenTree/order/templates/order/purchase_orders.html b/InvenTree/order/templates/order/purchase_orders.html index 53502376cb..d05e8fbf86 100644 --- a/InvenTree/order/templates/order/purchase_orders.html +++ b/InvenTree/order/templates/order/purchase_orders.html @@ -74,7 +74,15 @@ InvenTree | {% trans "Purchase Orders" %} var title = `${prefix}${order.reference} - ${order.supplier_detail.name}`; - var color = '#25c235'; + var color = '#4c68f5'; + + if (order.complete_date) { + color = '#25c235'; + } else if (order.overdue) { + color = '#c22525'; + } else { + color = '#4c68f5'; + } var event = { title: title, @@ -106,7 +114,7 @@ InvenTree | {% trans "Purchase Orders" %} }); calendar.render(); - }) + });