diff --git a/RIGS/finance.py b/RIGS/finance.py index 113099a5..dfad3c2a 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -33,20 +33,7 @@ class InvoiceIndex(generic.ListView): return context def get_queryset(self): - # Manual query is the only way I have found to do this efficiently. Not ideal but needs must - sql = "SELECT * FROM " \ - "(SELECT " \ - "(SELECT COUNT(p.amount) FROM \"RIGS_payment\" AS p WHERE p.invoice_id=\"RIGS_invoice\".id) AS \"payment_count\", " \ - "(SELECT SUM(ei.cost * ei.quantity) FROM \"RIGS_eventitem\" AS ei WHERE ei.event_id=\"RIGS_invoice\".event_id) AS \"cost\", " \ - "(SELECT SUM(p.amount) FROM \"RIGS_payment\" AS p WHERE p.invoice_id=\"RIGS_invoice\".id) AS \"payments\", " \ - "\"RIGS_invoice\".\"id\", \"RIGS_invoice\".\"event_id\", \"RIGS_invoice\".\"invoice_date\", \"RIGS_invoice\".\"void\" FROM \"RIGS_invoice\") " \ - "AS sub " \ - "WHERE (((cost > 0.0) AND (payment_count=0)) OR (cost - payments) <> 0.0) AND void = '0'" \ - "ORDER BY invoice_date" - - query = self.model.objects.raw(sql) - - return query + return self.model.objects.outstanding_invoices() class InvoiceDetail(generic.DetailView): diff --git a/RIGS/models.py b/RIGS/models.py index 95a75bf2..55800808 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -539,6 +539,23 @@ class EventAuthorisation(models.Model, RevisionMixin): return "{} (requested by {})".format(self.event.display_id, self.sent_by.initials) +class InvoiceManager(models.Manager): + def outstanding_invoices(self): + # Manual query is the only way I have found to do this efficiently. Not ideal but needs must + sql = "SELECT * FROM " \ + "(SELECT " \ + "(SELECT COUNT(p.amount) FROM \"RIGS_payment\" AS p WHERE p.invoice_id=\"RIGS_invoice\".id) AS \"payment_count\", " \ + "(SELECT SUM(ei.cost * ei.quantity) FROM \"RIGS_eventitem\" AS ei WHERE ei.event_id=\"RIGS_invoice\".event_id) AS \"cost\", " \ + "(SELECT SUM(p.amount) FROM \"RIGS_payment\" AS p WHERE p.invoice_id=\"RIGS_invoice\".id) AS \"payments\", " \ + "\"RIGS_invoice\".\"id\", \"RIGS_invoice\".\"event_id\", \"RIGS_invoice\".\"invoice_date\", \"RIGS_invoice\".\"void\" FROM \"RIGS_invoice\") " \ + "AS sub " \ + "WHERE (((cost > 0.0) AND (payment_count=0)) OR (cost - payments) <> 0.0) AND void = '0'" \ + "ORDER BY invoice_date" + + query = self.raw(sql) + return query + + @reversion.register(follow=['payment_set']) class Invoice(models.Model, RevisionMixin): event = models.OneToOneField('Event', on_delete=models.CASCADE) @@ -547,6 +564,8 @@ class Invoice(models.Model, RevisionMixin): reversion_perm = 'RIGS.view_invoice' + objects = InvoiceManager() + @property def sum_total(self): return self.event.sum_total diff --git a/RIGS/templates/base_rigs.html b/RIGS/templates/base_rigs.html index 296da0d1..0ae1a62f 100644 --- a/RIGS/templates/base_rigs.html +++ b/RIGS/templates/base_rigs.html @@ -2,6 +2,8 @@ {% load static %} {% load invoices_waiting from filters %} +{% load invoices_outstanding from filters %} +{% load total_invoices_todo from filters %} {% block titleheader %} RIGS @@ -45,14 +47,17 @@ {% endif %} {% if perms.RIGS.view_invoice %} diff --git a/RIGS/templatetags/filters.py b/RIGS/templatetags/filters.py index fb722a9d..5a4348aa 100644 --- a/RIGS/templatetags/filters.py +++ b/RIGS/templatetags/filters.py @@ -222,3 +222,13 @@ def button(type, url=None, pk=None, clazz="", icon=None, text="", id=None, style @register.simple_tag def invoices_waiting(): return len(models.Event.objects.waiting_invoices()) + + +@register.simple_tag +def invoices_outstanding(): + return len(models.Invoice.objects.outstanding_invoices()) + + +@register.simple_tag +def total_invoices_todo(): + return len(models.Event.objects.waiting_invoices()) + len(models.Invoice.objects.outstanding_invoices())