diff --git a/RIGS/admin.py b/RIGS/admin.py index bdec5cdd..37f35a8b 100644 --- a/RIGS/admin.py +++ b/RIGS/admin.py @@ -9,4 +9,6 @@ admin.site.register(models.Organisation, reversion.VersionAdmin) admin.site.register(models.VatRate, reversion.VersionAdmin) admin.site.register(models.Venue, reversion.VersionAdmin) admin.site.register(models.Event, reversion.VersionAdmin) -admin.site.register(models.EventItem, reversion.VersionAdmin) \ No newline at end of file +admin.site.register(models.EventItem, reversion.VersionAdmin) +admin.site.register(models.Invoice) +admin.site.register(models.Payment) \ No newline at end of file diff --git a/RIGS/finanace.py b/RIGS/finanace.py deleted file mode 100644 index e69de29b..00000000 diff --git a/RIGS/finance.py b/RIGS/finance.py new file mode 100644 index 00000000..72439d95 --- /dev/null +++ b/RIGS/finance.py @@ -0,0 +1,60 @@ +from django.core.urlresolvers import reverse_lazy +from django.http import Http404, HttpResponseRedirect +from django.views import generic +from django.shortcuts import get_object_or_404 +from django.contrib import messages + +from RIGS import models + + +class InvoiceIndex(generic.ListView): + model = models.Invoice + template_name = 'RIGS/invoice_list.html' + + def get_queryset(self): + active = self.model.objects.filter(void=False).select_related('payment_set') + set = [] + for invoice in active: + if invoice.balance != 0: + set.append(invoice) + return set + + +class InvoiceDetail(generic.DetailView): + model = models.Invoice + + +class InvoiceVoid(generic.View): + def get(self, request, *args, **kwargs): + pk = kwargs.get('pk') + object = get_object_or_404(models.Invoice, pk=pk) + object.void = not object.void + object.save() + + if object.void: + return HttpResponseRedirect(reverse_lazy('invoice_list')) + return HttpResponseRedirect(reverse_lazy('invoice_detail', kwargs={'pk': object.pk})) + + +class PaymentCreate(generic.CreateView): + model = models.Payment + + def get_initial(self): + initial = super(generic.CreateView, self).get_initial() + invoicepk = self.request.GET.get('invoice', self.request.POST.get('invoice', None)) + if invoicepk == None: + raise Http404() + invoice = get_object_or_404(models.Invoice, pk=invoicepk) + initial.update({'invoice': invoice}) + return initial + + def get_success_url(self): + messages.info(self.request, "location.reload()") + return reverse_lazy('closemodal') + + +class PaymentDelete(generic.DeleteView): + model = models.Payment + + def get_success_url(self): + return self.request.POST.get('next') \ No newline at end of file diff --git a/RIGS/migrations/0017_auto_20150129_2041.py b/RIGS/migrations/0017_auto_20150129_2041.py new file mode 100644 index 00000000..e90491a6 --- /dev/null +++ b/RIGS/migrations/0017_auto_20150129_2041.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + dependencies = [ + ('RIGS', '0016_auto_20150127_1905'), + ] + + operations = [ + migrations.AlterModelOptions( + name='invoice', + options={'permissions': (('view_invoice', 'Can view Invoices'),)}, + ), + ] diff --git a/RIGS/models.py b/RIGS/models.py index aba43043..f264066d 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -242,6 +242,9 @@ class Event(models.Model, RevisionMixin): collector = models.CharField(max_length=255, blank=True, null=True) # Calculated values + """ + EX Vat + """ @property def sum_total(self): total = 0 @@ -257,6 +260,9 @@ class Event(models.Model, RevisionMixin): def vat(self): return self.sum_total * self.vat_rate.rate + """ + Inc VAT + """ @property def total(self): return self.sum_total + self.vat @@ -313,19 +319,44 @@ class Invoice(models.Model): invoice_date = models.DateField(auto_now_add=True) void = models.BooleanField() + @property + def sum_total(self): + return self.event.sum_total + + @property + def total(self): + return self.event.total + + @property + def payment_total(self): + total = 0 + for payment in self.payment_set.all(): + total += payment.amount + return total + + @property + def balance(self): + return self.sum_total - self.payment_total + + def __str__(self): + return "%i: %s (%.2f)" % (self.pk, self.event, self.balance) + + class Meta: + permissions = ( + ('view_invoice', 'Can view Invoices'), + ) + class Payment(models.Model): CASH = 'C' INTERNAL = 'I' EXTERNAL = 'E' SUCORE = 'SU' - MEMBERS = 'M' METHODS = ( (CASH, 'Cash'), (INTERNAL, 'Internal'), (EXTERNAL, 'External'), (SUCORE, 'SU Core'), - (MEMBERS, 'Members'), ) invoice = models.ForeignKey('Invoice') diff --git a/RIGS/templates/RIGS/invoice_detail.html b/RIGS/templates/RIGS/invoice_detail.html new file mode 100644 index 00000000..9ce5a667 --- /dev/null +++ b/RIGS/templates/RIGS/invoice_detail.html @@ -0,0 +1,108 @@ +{% extends 'base.html' %} + +{% block title %}Invoice {{ object.pk }}{% endblock %} + +{% block content %} +
| # | +Event | +Invoice Date | +Balance | ++ |
|---|---|---|---|---|
| {{ object.pk }} | +{{ object.event }} | +{{ object.invoice_date }} | +{{ object.balance|floatformat:2 }} | ++ + + + | +
Are you sure you wish to delete a payment for £{{ object.amount|floatformat:2 }} + ({{ object.get_method_display }}) + from {{ object.date }} on invoice {{ object.invoice.pk }}.
+ +This action cannot be undone!
+ +