Merge branch 'chrisjrn/20161013'
This commit is contained in:
commit
6a5e4ff92d
4 changed files with 54 additions and 3 deletions
|
@ -357,8 +357,18 @@ class InvoiceController(ForId, object):
|
||||||
return cart.revision == self.invoice.cart_revision
|
return cart.revision == self.invoice.cart_revision
|
||||||
|
|
||||||
def update_validity(self):
|
def update_validity(self):
|
||||||
''' Voids this invoice if the cart it is attached to has updated. '''
|
''' Voids this invoice if the attached cart is no longer valid because
|
||||||
if not self._invoice_matches_cart():
|
the cart revision has changed, or the reservations have expired. '''
|
||||||
|
|
||||||
|
is_valid = self._invoice_matches_cart()
|
||||||
|
cart = self.invoice.cart
|
||||||
|
if self.invoice.is_unpaid and is_valid and cart:
|
||||||
|
try:
|
||||||
|
CartController(cart).validate_cart()
|
||||||
|
except ValidationError:
|
||||||
|
is_valid = False
|
||||||
|
|
||||||
|
if not is_valid:
|
||||||
if self.invoice.total_payments() > 0:
|
if self.invoice.total_payments() > 0:
|
||||||
# Free up the payments made to this invoice
|
# Free up the payments made to this invoice
|
||||||
self.refund()
|
self.refund()
|
||||||
|
|
|
@ -382,6 +382,21 @@ def credit_notes(request, form):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@report_view("Invoices")
|
||||||
|
def invoices(request,form):
|
||||||
|
''' Shows all of the invoices in the system. '''
|
||||||
|
|
||||||
|
invoices = commerce.Invoice.objects.all().order_by("status")
|
||||||
|
|
||||||
|
return QuerysetReport(
|
||||||
|
"Invoices",
|
||||||
|
["id", "recipient", "value", "get_status_display"],
|
||||||
|
invoices,
|
||||||
|
headings=["id", "Recipient", "Value", "Status"],
|
||||||
|
link_view=views.invoice,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class AttendeeListReport(ListReport):
|
class AttendeeListReport(ListReport):
|
||||||
|
|
||||||
def get_link(self, argument):
|
def get_link(self, argument):
|
||||||
|
|
|
@ -168,7 +168,7 @@ class InvoiceTestCase(TestHelperMixin, RegistrationCartTestCase):
|
||||||
|
|
||||||
self.assertTrue(invoice_1.invoice.is_paid)
|
self.assertTrue(invoice_1.invoice.is_paid)
|
||||||
|
|
||||||
def test_invoice_voids_self_if_cart_is_invalid(self):
|
def test_invoice_voids_self_if_cart_changes(self):
|
||||||
current_cart = TestingCartController.for_user(self.USER_1)
|
current_cart = TestingCartController.for_user(self.USER_1)
|
||||||
|
|
||||||
# Should be able to create an invoice after the product is added
|
# Should be able to create an invoice after the product is added
|
||||||
|
@ -190,6 +190,31 @@ class InvoiceTestCase(TestHelperMixin, RegistrationCartTestCase):
|
||||||
invoice_2_new = TestingInvoiceController(invoice_2.invoice)
|
invoice_2_new = TestingInvoiceController(invoice_2.invoice)
|
||||||
self.assertFalse(invoice_2_new.invoice.is_void)
|
self.assertFalse(invoice_2_new.invoice.is_void)
|
||||||
|
|
||||||
|
def test_invoice_voids_self_if_cart_becomes_invalid(self):
|
||||||
|
''' Invoices should be void if cart becomes invalid over time '''
|
||||||
|
|
||||||
|
self.make_ceiling("Limit ceiling", limit=1)
|
||||||
|
self.set_time(datetime.datetime(
|
||||||
|
year=2015, month=1, day=1, hour=0, minute=0, tzinfo=UTC,
|
||||||
|
))
|
||||||
|
|
||||||
|
cart1 = TestingCartController.for_user(self.USER_1)
|
||||||
|
cart2 = TestingCartController.for_user(self.USER_2)
|
||||||
|
|
||||||
|
# Create a valid invoice for USER_1
|
||||||
|
cart1.add_to_cart(self.PROD_1, 1)
|
||||||
|
inv1 = TestingInvoiceController.for_cart(cart1.cart)
|
||||||
|
|
||||||
|
# Expire the reservations, and have USER_2 take up PROD_1's ceiling
|
||||||
|
# generate an invoice
|
||||||
|
self.add_timedelta(self.RESERVATION * 2)
|
||||||
|
cart2.add_to_cart(self.PROD_2, 1)
|
||||||
|
inv2 = TestingInvoiceController.for_cart(cart2.cart)
|
||||||
|
|
||||||
|
# Re-get inv1's invoice; it should void itself on loading.
|
||||||
|
inv1 = TestingInvoiceController(inv1.invoice)
|
||||||
|
self.assertTrue(inv1.invoice.is_void)
|
||||||
|
|
||||||
def test_voiding_invoice_creates_new_invoice(self):
|
def test_voiding_invoice_creates_new_invoice(self):
|
||||||
invoice_1 = self._invoice_containing_prod_1(1)
|
invoice_1 = self._invoice_containing_prod_1(1)
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ reports = [
|
||||||
url(r"^attendee/([0-9]*)$", rv.attendee, name="attendee"),
|
url(r"^attendee/([0-9]*)$", rv.attendee, name="attendee"),
|
||||||
url(r"^credit_notes/?$", rv.credit_notes, name="credit_notes"),
|
url(r"^credit_notes/?$", rv.credit_notes, name="credit_notes"),
|
||||||
url(r"^discount_status/?$", rv.discount_status, name="discount_status"),
|
url(r"^discount_status/?$", rv.discount_status, name="discount_status"),
|
||||||
|
url(r"^invoices/?$", rv.invoices, name="invoices"),
|
||||||
url(
|
url(
|
||||||
r"^paid_invoices_by_date/?$",
|
r"^paid_invoices_by_date/?$",
|
||||||
rv.paid_invoices_by_date,
|
rv.paid_invoices_by_date,
|
||||||
|
|
Loading…
Reference in a new issue