From e4a955f3239cf285f8e7c62bef57f21d7fa531fd Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 23 May 2016 12:36:21 +0100 Subject: [PATCH 01/15] Reformat code to PEP8 --- RIGS/finance.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/RIGS/finance.py b/RIGS/finance.py index 73552f2e..d719c66f 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -1,20 +1,19 @@ import cStringIO as StringIO +import datetime +import re +from django.contrib import messages from django.core.urlresolvers import reverse_lazy -from django.db import connection from django.http import Http404, HttpResponseRedirect -from django.views import generic -from django.template import RequestContext -from django.template.loader import get_template from django.http import HttpResponse from django.shortcuts import get_object_or_404 -from django.contrib import messages -import datetime +from django.template import RequestContext +from django.template.loader import get_template +from django.views import generic from z3c.rml import rml2pdf from RIGS import models -import re class InvoiceIndex(generic.ListView): model = models.Invoice @@ -40,6 +39,7 @@ class InvoiceIndex(generic.ListView): class InvoiceDetail(generic.DetailView): model = models.Invoice + class InvoicePrint(generic.View): def get(self, request, pk): invoice = get_object_or_404(models.Invoice, pk=pk) @@ -54,8 +54,8 @@ class InvoicePrint(generic.View): 'bold': 'RIGS/static/fonts/OPENSANS-BOLD.TTF', } }, - 'invoice':invoice, - 'current_user':request.user, + 'invoice': invoice, + 'current_user': request.user, }) rml = template.render(context) @@ -72,6 +72,7 @@ class InvoicePrint(generic.View): response.write(pdfData) return response + class InvoiceVoid(generic.View): def get(self, *args, **kwargs): pk = kwargs.get('pk') @@ -119,7 +120,7 @@ class InvoiceEvent(generic.View): class PaymentCreate(generic.CreateView): model = models.Payment - fields = ['invoice','date','amount','method'] + fields = ['invoice', 'date', 'amount', 'method'] def get_initial(self): initial = super(generic.CreateView, self).get_initial() @@ -139,4 +140,4 @@ class PaymentDelete(generic.DeleteView): model = models.Payment def get_success_url(self): - return self.request.POST.get('next') \ No newline at end of file + return self.request.POST.get('next') From 60302889569679ad9d41be940b2b50953f4b1761 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 24 May 2016 17:17:52 +0100 Subject: [PATCH 02/15] Cheap and dirty active totals --- RIGS/finance.py | 14 ++- RIGS/models.py | 125 +++++++++++++------------- RIGS/templates/RIGS/invoice_list.html | 2 +- 3 files changed, 77 insertions(+), 64 deletions(-) diff --git a/RIGS/finance.py b/RIGS/finance.py index d719c66f..57721a9f 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -19,16 +19,24 @@ class InvoiceIndex(generic.ListView): model = models.Invoice template_name = 'RIGS/invoice_list.html' + def get_context_data(self, **kwargs): + context = super(InvoiceIndex, self).get_context_data(**kwargs) + total = 0 + for i in context['object_list']: + total += i.balance + context['total'] = total + 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 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\", " \ + "(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'" \ + "WHERE (cost - payments) <> 0.0 AND void = '0'" \ "ORDER BY invoice_date" query = self.model.objects.raw(sql) diff --git a/RIGS/models.py b/RIGS/models.py index fc06911f..535aa42c 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -1,31 +1,32 @@ +import datetime import hashlib -import datetime, pytz - -from django.db import models, connection -from django.contrib.auth.models import AbstractUser -from django.conf import settings -from django.utils.functional import cached_property -from django.utils.encoding import python_2_unicode_compatible -import reversion -import string +import pytz import random +import string from collections import Counter -from django.core.urlresolvers import reverse_lazy -from django.core.exceptions import ValidationError - from decimal import Decimal +import reversion +from django.conf import settings +from django.contrib.auth.models import AbstractUser +from django.core.exceptions import ValidationError +from django.core.urlresolvers import reverse_lazy +from django.db import models +from django.utils.encoding import python_2_unicode_compatible +from django.utils.functional import cached_property + + # Create your models here. @python_2_unicode_compatible class Profile(AbstractUser): initials = models.CharField(max_length=5, unique=True, null=True, blank=False) phone = models.CharField(max_length=13, null=True, blank=True) - api_key = models.CharField(max_length=40,blank=True,editable=False, null=True) + api_key = models.CharField(max_length=40, blank=True, editable=False, null=True) @classmethod def make_api_key(cls): - size=20 - chars=string.ascii_letters + string.digits + size = 20 + chars = string.ascii_letters + string.digits new_api_key = ''.join(random.choice(chars) for x in range(size)) return new_api_key; @@ -55,6 +56,7 @@ class Profile(AbstractUser): ('view_profile', 'Can view Profile'), ) + class RevisionMixin(object): @property def last_edited_at(self): @@ -79,10 +81,11 @@ class RevisionMixin(object): versions = reversion.get_for_object(self) if versions: version = reversion.get_for_object(self)[0] - return "V{0} | R{1}".format(version.pk,version.revision.pk) + return "V{0} | R{1}".format(version.pk, version.revision.pk) else: return None + @reversion.register @python_2_unicode_compatible class Person(models.Model, RevisionMixin): @@ -97,7 +100,7 @@ class Person(models.Model, RevisionMixin): def __str__(self): string = self.name if self.notes is not None: - if len(self.notes) > 0: + if len(self.notes) > 0: string += "*" return string @@ -108,7 +111,7 @@ class Person(models.Model, RevisionMixin): if e.organisation: o.append(e.organisation) - #Count up occurances and put them in descending order + # Count up occurances and put them in descending order c = Counter(o) stats = c.most_common() return stats @@ -141,7 +144,7 @@ class Organisation(models.Model, RevisionMixin): def __str__(self): string = self.name if self.notes is not None: - if len(self.notes) > 0: + if len(self.notes) > 0: string += "*" return string @@ -151,8 +154,8 @@ class Organisation(models.Model, RevisionMixin): for e in Event.objects.filter(organisation=self).select_related('person'): if e.person: p.append(e.person) - - #Count up occurances and put them in descending order + + # Count up occurances and put them in descending order c = Counter(p) stats = c.most_common() return stats @@ -238,12 +241,18 @@ class Venue(models.Model, RevisionMixin): class EventManager(models.Manager): def current_events(self): events = self.filter( - (models.Q(start_date__gte=datetime.date.today(), end_date__isnull=True, dry_hire=False) & ~models.Q(status=Event.CANCELLED)) | # Starts after with no end - (models.Q(end_date__gte=datetime.date.today(), dry_hire=False) & ~models.Q(status=Event.CANCELLED)) | # Ends after - (models.Q(dry_hire=True, start_date__gte=datetime.date.today()) & ~models.Q(status=Event.CANCELLED)) | # Active dry hire - (models.Q(dry_hire=True, checked_in_by__isnull=True) & (models.Q(status=Event.BOOKED) | models.Q(status=Event.CONFIRMED))) | # Active dry hire GT + (models.Q(start_date__gte=datetime.date.today(), end_date__isnull=True, dry_hire=False) & ~models.Q( + status=Event.CANCELLED)) | # Starts after with no end + (models.Q(end_date__gte=datetime.date.today(), dry_hire=False) & ~models.Q( + status=Event.CANCELLED)) | # Ends after + (models.Q(dry_hire=True, start_date__gte=datetime.date.today()) & ~models.Q( + status=Event.CANCELLED)) | # Active dry hire + (models.Q(dry_hire=True, checked_in_by__isnull=True) & ( + models.Q(status=Event.BOOKED) | models.Q(status=Event.CONFIRMED))) | # Active dry hire GT models.Q(status=Event.CANCELLED, start_date__gte=datetime.date.today()) # Canceled but not started - ).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', 'organisation', 'venue', 'mic') + ).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', + 'organisation', + 'venue', 'mic') return events def events_in_bounds(self, start, end): @@ -251,15 +260,17 @@ class EventManager(models.Manager): (models.Q(start_date__gte=start.date(), start_date__lte=end.date())) | # Start date in bounds (models.Q(end_date__gte=start.date(), end_date__lte=end.date())) | # End date in bounds (models.Q(access_at__gte=start, access_at__lte=end)) | # Access at in bounds - (models.Q(meet_at__gte=start, meet_at__lte=end)) | # Meet at in bounds + (models.Q(meet_at__gte=start, meet_at__lte=end)) | # Meet at in bounds - (models.Q(start_date__lte=start, end_date__gte=end)) | # Start before, end after - (models.Q(access_at__lte=start, start_date__gte=end)) | # Access before, start after - (models.Q(access_at__lte=start, end_date__gte=end)) | # Access before, end after - (models.Q(meet_at__lte=start, start_date__gte=end)) | # Meet before, start after - (models.Q(meet_at__lte=start, end_date__gte=end)) # Meet before, end after + (models.Q(start_date__lte=start, end_date__gte=end)) | # Start before, end after + (models.Q(access_at__lte=start, start_date__gte=end)) | # Access before, start after + (models.Q(access_at__lte=start, end_date__gte=end)) | # Access before, end after + (models.Q(meet_at__lte=start, start_date__gte=end)) | # Meet before, start after + (models.Q(meet_at__lte=start, end_date__gte=end)) # Meet before, end after - ).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', 'organisation', 'venue', 'mic') + ).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', + 'organisation', + 'venue', 'mic') return events def rig_count(self): @@ -301,7 +312,8 @@ class Event(models.Model, RevisionMixin): status = models.IntegerField(choices=EVENT_STATUS_CHOICES, default=PROVISIONAL) dry_hire = models.BooleanField(default=False) is_rig = models.BooleanField(default=True) - based_on = models.ForeignKey('Event', on_delete=models.SET_NULL, related_name='future_events', blank=True, null=True) + based_on = models.ForeignKey('Event', on_delete=models.SET_NULL, related_name='future_events', blank=True, + null=True) # Timing start_date = models.DateField() @@ -327,6 +339,7 @@ class Event(models.Model, RevisionMixin): """ EX Vat """ + @property def sum_total(self): # Manual querying is required for efficiency whilst maintaining floating point arithmetic @@ -334,14 +347,15 @@ class Event(models.Model, RevisionMixin): # sql = "SELECT SUM(quantity * cost) AS sum_total FROM \"RIGS_eventitem\" WHERE event_id=%i" % self.id # else: # sql = "SELECT id, SUM(quantity * cost) AS sum_total FROM RIGS_eventitem WHERE event_id=%i" % self.id - #total = self.items.raw(sql)[0] - #if total.sum_total: + # total = self.items.raw(sql)[0] + # if total.sum_total: # return total.sum_total - #total = 0.0 - #for item in self.items.filter(cost__gt=0).extra(select="SUM(cost * quantity) AS sum"): + # total = 0.0 + # for item in self.items.filter(cost__gt=0).extra(select="SUM(cost * quantity) AS sum"): # total += item.sum total = EventItem.objects.filter(event=self).aggregate( - sum_total=models.Sum(models.F('cost')*models.F('quantity'), output_field=models.DecimalField(max_digits=10, decimal_places=2)) + sum_total=models.Sum(models.F('cost') * models.F('quantity'), + output_field=models.DecimalField(max_digits=10, decimal_places=2)) )['sum_total'] if total: return total @@ -358,6 +372,7 @@ class Event(models.Model, RevisionMixin): """ Inc VAT """ + @property def total(self): return self.sum_total + self.vat @@ -382,7 +397,7 @@ class Event(models.Model, RevisionMixin): def earliest_time(self): """Finds the earliest time defined in the event - this function could return either a tzaware datetime, or a naiive date object""" - #Put all the datetimes in a list + # Put all the datetimes in a list datetime_list = [] if self.access_at: @@ -394,22 +409,22 @@ class Event(models.Model, RevisionMixin): # If there is no start time defined, pretend it's midnight startTimeFaked = False if self.has_start_time: - startDateTime = datetime.datetime.combine(self.start_date,self.start_time) + startDateTime = datetime.datetime.combine(self.start_date, self.start_time) else: - startDateTime = datetime.datetime.combine(self.start_date,datetime.time(00,00)) + startDateTime = datetime.datetime.combine(self.start_date, datetime.time(00, 00)) startTimeFaked = True - #timezoneIssues - apply the default timezone to the naiive datetime + # timezoneIssues - apply the default timezone to the naiive datetime tz = pytz.timezone(settings.TIME_ZONE) startDateTime = tz.localize(startDateTime) - datetime_list.append(startDateTime) # then add it to the list + datetime_list.append(startDateTime) # then add it to the list - earliest = min(datetime_list).astimezone(tz) #find the earliest datetime in the list + earliest = min(datetime_list).astimezone(tz) # find the earliest datetime in the list # if we faked it & it's the earliest, better own up - if startTimeFaked and earliest==startDateTime: + if startTimeFaked and earliest == startDateTime: return self.start_date - + return earliest @property @@ -421,7 +436,7 @@ class Event(models.Model, RevisionMixin): endDate = self.start_date if self.has_end_time: - endDateTime = datetime.datetime.combine(endDate,self.end_time) + endDateTime = datetime.datetime.combine(endDate, self.end_time) tz = pytz.timezone(settings.TIME_ZONE) endDateTime = tz.localize(endDateTime) @@ -430,7 +445,6 @@ class Event(models.Model, RevisionMixin): else: return endDate - objects = EventManager() def get_absolute_url(self): @@ -446,7 +460,7 @@ class Event(models.Model, RevisionMixin): startEndSameDay = not self.end_date or self.end_date == self.start_date hasStartAndEnd = self.has_start_time and self.has_end_time if startEndSameDay and hasStartAndEnd and self.start_time > self.end_time: - raise ValidationError('Unless you\'ve invented time travel, the event can\'t finish before it has started.') + raise ValidationError('Unless you\'ve invented time travel, the event can\'t finish before it has started.') def save(self, *args, **kwargs): """Call :meth:`full_clean` before saving.""" @@ -503,15 +517,6 @@ class Invoice(models.Model): @property def payment_total(self): - # Manual querying is required for efficiency whilst maintaining floating point arithmetic - #if connection.vendor == 'postgresql': - # sql = "SELECT SUM(amount) AS total FROM \"RIGS_payment\" WHERE invoice_id=%i" % self.id - #else: - # sql = "SELECT id, SUM(amount) AS total FROM RIGS_payment WHERE invoice_id=%i" % self.id - #total = self.payment_set.raw(sql)[0] - #if total.total: - # return total.total - #return 0.0 total = self.payment_set.aggregate(total=models.Sum('amount'))['total'] if total: return total @@ -552,4 +557,4 @@ class Payment(models.Model): method = models.CharField(max_length=2, choices=METHODS, null=True, blank=True) def __str__(self): - return "%s: %d" % (self.get_method_display(), self.amount) \ No newline at end of file + return "%s: %d" % (self.get_method_display(), self.amount) diff --git a/RIGS/templates/RIGS/invoice_list.html b/RIGS/templates/RIGS/invoice_list.html index bf9fe31f..018ca910 100644 --- a/RIGS/templates/RIGS/invoice_list.html +++ b/RIGS/templates/RIGS/invoice_list.html @@ -5,7 +5,7 @@ {% block content %}
-

Invoices

+

Invoices (£ {{ total|floatformat:2 }})

{% if is_paginated %}
{% paginator %} From 7ccc8faf20a308cfae943aad60a8b77918b459db Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 24 May 2016 17:32:58 +0100 Subject: [PATCH 03/15] Add total for waiting events --- RIGS/finance.py | 8 ++++++++ RIGS/templates/RIGS/event_invoice.html | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/RIGS/finance.py b/RIGS/finance.py index 57721a9f..9025e15b 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -103,6 +103,14 @@ class InvoiceWaiting(generic.ListView): paginate_by = 25 template_name = 'RIGS/event_invoice.html' + def get_context_data(self, **kwargs): + context = super(InvoiceWaiting, self).get_context_data(**kwargs) + total = 0 + for obj in context['object_list']: + total += obj.sum_total + context['total'] = total + return context + def get_queryset(self): # @todo find a way to select items events = self.model.objects.filter(is_rig=True, end_date__lt=datetime.date.today(), diff --git a/RIGS/templates/RIGS/event_invoice.html b/RIGS/templates/RIGS/event_invoice.html index 805eb3d9..29c56f42 100644 --- a/RIGS/templates/RIGS/event_invoice.html +++ b/RIGS/templates/RIGS/event_invoice.html @@ -5,7 +5,7 @@ {% block content %}
-

Events for Invoice

+

Events for Invoice (£ {{ total|floatformat:2 }})

{% if is_paginated %}
{% paginator %} From 6b77393414682c930b3d091361ec76ea7f3fa0cf Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 24 May 2016 17:49:44 +0100 Subject: [PATCH 04/15] Fix for incorrect selection of active invoices. Make sure waiting shows total across all pages. --- RIGS/finance.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/RIGS/finance.py b/RIGS/finance.py index 9025e15b..69eaa513 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -36,7 +36,7 @@ class InvoiceIndex(generic.ListView): "(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 - payments) <> 0.0 AND void = '0'" \ + "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) @@ -106,19 +106,24 @@ class InvoiceWaiting(generic.ListView): def get_context_data(self, **kwargs): context = super(InvoiceWaiting, self).get_context_data(**kwargs) total = 0 - for obj in context['object_list']: + for obj in self.get_objects(): total += obj.sum_total context['total'] = total return context def get_queryset(self): + return self.get_objects() + + def get_objects(self): # @todo find a way to select items events = self.model.objects.filter(is_rig=True, end_date__lt=datetime.date.today(), invoice__isnull=True) \ .order_by('start_date') \ .select_related('person', 'organisation', - 'venue', 'mic') + 'venue', 'mic') \ + .prefetch_related('items') + return events From cc2450ff871467a45920a05051268ebe374e2662 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 24 May 2016 17:50:48 +0100 Subject: [PATCH 05/15] Make total conditional if defined --- RIGS/templates/RIGS/invoice_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RIGS/templates/RIGS/invoice_list.html b/RIGS/templates/RIGS/invoice_list.html index 018ca910..32abdcec 100644 --- a/RIGS/templates/RIGS/invoice_list.html +++ b/RIGS/templates/RIGS/invoice_list.html @@ -5,7 +5,7 @@ {% block content %}
-

Invoices (£ {{ total|floatformat:2 }})

+

Invoices {% if total %}(£ {{ total|floatformat:2 }}){% endif %}

{% if is_paginated %}
{% paginator %} From 83302c44399ccf45d1d5431c6ef68520b07ccdc1 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 29 May 2016 21:30:05 +0100 Subject: [PATCH 06/15] Invoice UI improvements. Renamed pages, added description, and added total number of events --- RIGS/finance.py | 3 ++- RIGS/templates/RIGS/event_invoice.html | 3 ++- RIGS/templates/RIGS/invoice_list.html | 3 ++- RIGS/templates/RIGS/invoice_list_active.html | 13 +++++++++++++ RIGS/templates/RIGS/invoice_list_archive.html | 13 +++++++++++++ templates/base.html | 2 +- 6 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 RIGS/templates/RIGS/invoice_list_active.html create mode 100644 RIGS/templates/RIGS/invoice_list_archive.html diff --git a/RIGS/finance.py b/RIGS/finance.py index 69eaa513..d604cd57 100644 --- a/RIGS/finance.py +++ b/RIGS/finance.py @@ -17,7 +17,7 @@ from RIGS import models class InvoiceIndex(generic.ListView): model = models.Invoice - template_name = 'RIGS/invoice_list.html' + template_name = 'RIGS/invoice_list_active.html' def get_context_data(self, **kwargs): context = super(InvoiceIndex, self).get_context_data(**kwargs) @@ -95,6 +95,7 @@ class InvoiceVoid(generic.View): class InvoiceArchive(generic.ListView): model = models.Invoice + template_name = 'RIGS/invoice_list_archive.html' paginate_by = 25 diff --git a/RIGS/templates/RIGS/event_invoice.html b/RIGS/templates/RIGS/event_invoice.html index 29c56f42..3324911a 100644 --- a/RIGS/templates/RIGS/event_invoice.html +++ b/RIGS/templates/RIGS/event_invoice.html @@ -5,7 +5,8 @@ {% block content %}
-

Events for Invoice (£ {{ total|floatformat:2 }})

+

Events for Invoice ({{object_list|length}} Events, £ {{ total|floatformat:2 }})

+

These events have happened, but paperwork has not yet been sent to treasury

{% if is_paginated %}
{% paginator %} diff --git a/RIGS/templates/RIGS/invoice_list.html b/RIGS/templates/RIGS/invoice_list.html index 32abdcec..26ddeb12 100644 --- a/RIGS/templates/RIGS/invoice_list.html +++ b/RIGS/templates/RIGS/invoice_list.html @@ -5,7 +5,8 @@ {% block content %}
-

Invoices {% if total %}(£ {{ total|floatformat:2 }}){% endif %}

+

{% block heading %}Invoices{% endblock %}

+ {% block description %}{% endblock %} {% if is_paginated %}
{% paginator %} diff --git a/RIGS/templates/RIGS/invoice_list_active.html b/RIGS/templates/RIGS/invoice_list_active.html new file mode 100644 index 00000000..24cea673 --- /dev/null +++ b/RIGS/templates/RIGS/invoice_list_active.html @@ -0,0 +1,13 @@ +{% extends 'RIGS/invoice_list.html' %} + +{% block title %} +Outstanding Invoices +{% endblock %} + +{% block heading %} +Outstanding Invoices ({{object_list|length}} Events, £ {{ total|floatformat:2 }}) +{% endblock %} + +{% block description %} +

Paperwork for these events has been sent to treasury, but the full balance has not yet appeared on a ledger

+{% endblock %} \ No newline at end of file diff --git a/RIGS/templates/RIGS/invoice_list_archive.html b/RIGS/templates/RIGS/invoice_list_archive.html new file mode 100644 index 00000000..77bab204 --- /dev/null +++ b/RIGS/templates/RIGS/invoice_list_archive.html @@ -0,0 +1,13 @@ +{% extends 'RIGS/invoice_list.html' %} + +{% block title %} +Invoice Archive +{% endblock %} + +{% block heading %} +All Invoices +{% endblock %} + +{% block description %} +

This page displays all invoices: outstanding, paid, and void

+{% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 3cde5acd..299be06e 100644 --- a/templates/base.html +++ b/templates/base.html @@ -74,7 +74,7 @@
+ {% endif %}
From 3ccbdff737cca2c7390bf511ee990cfed9efbbce Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 29 May 2016 22:51:41 +0100 Subject: [PATCH 12/15] Added balance to invoice page - closes #235 --- RIGS/templates/RIGS/invoice_detail.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/RIGS/templates/RIGS/invoice_detail.html b/RIGS/templates/RIGS/invoice_detail.html index eccec0a3..e5b14a7f 100644 --- a/RIGS/templates/RIGS/invoice_detail.html +++ b/RIGS/templates/RIGS/invoice_detail.html @@ -111,6 +111,11 @@ {% endfor %} + + Balance: + {{ object.balance|floatformat:2 }} + +
From a48afb91573d9bb59c03c8323786a462f3982d22 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 29 May 2016 22:56:58 +0100 Subject: [PATCH 13/15] Added internal/external indicators to invoice lists --- RIGS/templates/RIGS/event_invoice.html | 5 +++++ RIGS/templates/RIGS/invoice_list.html | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/RIGS/templates/RIGS/event_invoice.html b/RIGS/templates/RIGS/event_invoice.html index 94d84f04..79098853 100644 --- a/RIGS/templates/RIGS/event_invoice.html +++ b/RIGS/templates/RIGS/event_invoice.html @@ -57,9 +57,14 @@ {% if object.organisation %} {{ object.organisation.name }} +
+ {{ object.organisation.union_account|yesno:'Internal,External' }} {% else %} {{ object.person.name }} +
+ External {% endif %} + {{ object.sum_total|floatformat:2 }} diff --git a/RIGS/templates/RIGS/invoice_list.html b/RIGS/templates/RIGS/invoice_list.html index cb63b7f5..f7d23fcf 100644 --- a/RIGS/templates/RIGS/invoice_list.html +++ b/RIGS/templates/RIGS/invoice_list.html @@ -33,9 +33,14 @@ {% if object.organisation %} {{ object.event.organisation.name }} +
+ {{ object.organisation.union_account|yesno:'Internal,External' }} {% else %} {{ object.event.person.name }} - {% endif %} +
+ External + {% endif %} + {{ object.event.start_date }} {{ object.invoice_date }} {{ object.balance|floatformat:2 }} From 5cc69cbb413ac1adbc615f324cfed28f27ea5f31 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 29 May 2016 23:03:41 +0100 Subject: [PATCH 14/15] Stopped things opening in a new window, because it's really annoying. If you want to do this, use the appropriate keyboard shortcut or mouse button --- RIGS/templates/RIGS/event_invoice.html | 4 ++-- RIGS/templates/RIGS/invoice_list.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/RIGS/templates/RIGS/event_invoice.html b/RIGS/templates/RIGS/event_invoice.html index 79098853..0e56158f 100644 --- a/RIGS/templates/RIGS/event_invoice.html +++ b/RIGS/templates/RIGS/event_invoice.html @@ -50,7 +50,7 @@ danger {% endif %} "> - N{{ object.pk|stringformat:"05d" }}
+ N{{ object.pk|stringformat:"05d" }}
{{ object.get_status_display }} {{ object.start_date }} {{ object.name }} @@ -76,7 +76,7 @@ {% endif %} - + diff --git a/RIGS/templates/RIGS/invoice_list.html b/RIGS/templates/RIGS/invoice_list.html index f7d23fcf..f833b89a 100644 --- a/RIGS/templates/RIGS/invoice_list.html +++ b/RIGS/templates/RIGS/invoice_list.html @@ -28,7 +28,7 @@ {% for object in object_list %} {{ object.pk }} - N{{ object.event.pk|stringformat:"05d" }}: {{ object.event.name }}
+ N{{ object.event.pk|stringformat:"05d" }}: {{ object.event.name }}
{{ object.event.get_status_display }} {% if object.organisation %} From 68b35c2d249763f9d5e60a717f9629ebabe6b226 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 29 May 2016 23:47:56 +0100 Subject: [PATCH 15/15] Removed print button conditions following discussion --- RIGS/templates/RIGS/invoice_detail.html | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/RIGS/templates/RIGS/invoice_detail.html b/RIGS/templates/RIGS/invoice_detail.html index e5b14a7f..ad177ba4 100644 --- a/RIGS/templates/RIGS/invoice_detail.html +++ b/RIGS/templates/RIGS/invoice_detail.html @@ -15,12 +15,10 @@ - {% if not object.event.organisation.union_account %} - -
- {% endif %} + +