Skip to content

Commit 49c54fd

Browse files
committed
Added paid button quick link and paid date to invoice, closes #13
1 parent 8202a1d commit 49c54fd

5 files changed

Lines changed: 49 additions & 3 deletions

File tree

PyInvoice/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
url(r'^api/get_company_for_form/$', api.get_company_for_form, name='get_company_for_form'),
6060
url(r'^api/invoice_logo_upload/$', api.invoice_photo_upload, name='invoice_photo_upload'),
6161
url(r'^api/mark_sent', api.mark_invoice_sent, name='mark_invoice_sent'),
62+
url(r'^api/mark_paid', api.mark_invoice_paid, name='mark_invoice_paid'),
6263
url(r'^api/get_expense_items_for_modal/$', api.get_expense_items_for_modal, name='get_expense_items_for_modal'),
6364
url(r'^api/get_items_for_delete_modal/$', api.get_items_for_delete_modal, name='get_items_for_delete_modal'),
6465
url(r'^api/delete_item', api.delete_item, name='delete_item'),

invoice/api.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,22 @@ def mark_invoice_sent(request):
107107
return HttpResponse(std_json.dumps(context, cls=DjangoJSONEncoder), content_type='application/json')
108108

109109

110+
@login_required()
111+
def mark_invoice_paid(request):
112+
context = dict()
113+
if request.method == 'POST' and request.is_ajax():
114+
invoice_pk = request.POST.get('invoice_pk', '0')
115+
116+
invoice = models.Invoice.objects.update_or_create(pk=invoice_pk, defaults={
117+
'paid_date': timezone.now(),
118+
'paid': True,
119+
})
120+
# context['paid_date'] = invoice[0].paid_date
121+
context['paid_date'] = datetime.strftime(invoice[0].paid_date.date(), '%d %b %Y')
122+
123+
return HttpResponse(std_json.dumps(context, cls=DjangoJSONEncoder), content_type='application/json')
124+
125+
110126
@login_required()
111127
def get_items_for_delete_modal(request):
112128
context = dict()

invoice/static/js/ajax_form_post.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ function markInvoiceSent(invoice_pk) {
3131
});
3232
}
3333

34+
function markInvoicePaid(invoice_pk) {
35+
$.ajax({
36+
url : "/api/mark_paid", // the endpoint
37+
type : "POST", // http method
38+
data : {
39+
invoice_pk: invoice_pk
40+
},
41+
traditional: true,
42+
43+
success : function(data) {
44+
// console.log(data);
45+
$('#invoice-paid-date').text(data['paid_date']);
46+
$('#mark_paid_button').addClass('scale-out-button')
47+
}
48+
});
49+
}
50+
3451
function updateItem() {
3552
$.ajax({
3653
url : "/invoice/item/update/", // the endpoint

invoice/templates/invoice_form.html

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ <h4>
119119

120120
<br>
121121
<dt>Paid</dt>
122-
<dd>{{ invoice.paid }}</dd>
122+
<dd id="invoice-paid-date">{{ invoice.paid_date.date|default:'-' }}</dd>
123123

124124
{% if invoice.utr or invoice.utr != invoice.company.require_utr %}
125125
<dt>UTR</dt>
@@ -220,10 +220,13 @@ <h4>
220220
<!-- Reverse Order -->
221221
{% if not edit %}
222222
{% if not invoice.sent_date %}
223-
<li><a onclick="markInvoiceSent({{ invoice.id }})" id="mark_sent_button" class="btn-floating green lighten-1 tooltipped" data-position="top" data-tooltip="Mark Sent"><i class="material-icons">done</i></a></li>
223+
<li><a onclick="markInvoiceSent({{ invoice.id }})" id="mark_sent_button" class="btn-floating green lighten-1 tooltipped" data-position="top" data-tooltip="Mark Sent"><i class="material-icons">reply</i></a></li>
224+
{% endif %}
225+
{% if not invoice.paid_date %}
226+
<li><a onclick="markInvoicePaid({{ invoice.id }})" id="mark_paid_button" class="btn-floating orange lighten-1 tooltipped" data-position="top" data-tooltip="Mark Paid"><i class="material-icons">attach_money</i></a></li>
224227
{% endif %}
225228
<li><a href="/invoice/{{ invoice.id }}/print" target="_blank" class="btn-floating purple lighten-1 tooltipped" data-position="top" data-tooltip="Print"><i class="material-icons">print</i></a></li>
226-
<li><a href="edit/" class="btn-floating"><i class="material-icons tooltipped" data-position="top" data-tooltip="Edit">edit</i></a></li>
229+
<li><a href="edit/" class="btn-floating orange lighten-1"><i class="material-icons tooltipped" data-position="top" data-tooltip="Edit">edit</i></a></li>
227230
{% else %}
228231
<li><a class="btn-floating pink lighten-1" onclick="showDeleteModal('{{ invoice }}', {{ invoice.pk }}, 'Invoice')"><i class="material-icons tooltipped" data-position="top" data-tooltip="Delete">delete</i></a></li>
229232
<li><button name="action" type="submit" class="btn-floating light-blue lighten-1"><i class="material-icons tooltipped" data-position="top" data-tooltip="Save">save</i></button></li>

invoice/views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.urls import reverse_lazy
77
from django.contrib.auth.decorators import login_required
88
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
9+
from django.utils import timezone
910
from dateutil import parser
1011
from django.urls import reverse
1112
from django.db.models import Q
@@ -112,11 +113,19 @@ def invoice_update(request):
112113
defaults['paid'] = bool(defaults.pop('paid', None))
113114
defaults['is_quote'] = bool(defaults.pop('is_quote', None))
114115

116+
if defaults['paid']:
117+
defaults['paid_date'] = timezone.now()
118+
else:
119+
defaults['paid_date'] = None
120+
115121
if not defaults['sent_date'] == '':
116122
defaults['sent_date'] = parser.parse(defaults.pop('sent_date', None))
117123
else:
118124
defaults['sent_date'] = None
119125

126+
if defaults['paid']:
127+
defaults['sent_date'] = timezone.now()
128+
120129
if invoice_pk == 0:
121130
invoice = models.Invoice.objects.create(**defaults)
122131
context['url'] = reverse('invoice_edit', args=[invoice.pk])

0 commit comments

Comments
 (0)