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…
	
	Add table
		
		Reference in a new issue
	
	 Christopher Neugebauer
						Christopher Neugebauer