Merge branch 'chrisjrn/fix_64'
This commit is contained in:
		
						commit
						e128179629
					
				
					 2 changed files with 54 additions and 4 deletions
				
			
		|  | @ -43,16 +43,16 @@ class InvoiceController(ForId, object): | ||||||
|             cart_controller = CartController(cart) |             cart_controller = CartController(cart) | ||||||
|             cart_controller.validate_cart()  # Raises ValidationError on fail. |             cart_controller.validate_cart()  # Raises ValidationError on fail. | ||||||
| 
 | 
 | ||||||
|             cls.void_all_invoices(cart) |             cls.update_old_invoices(cart) | ||||||
|             invoice = cls._generate(cart) |             invoice = cls._generate(cart) | ||||||
| 
 | 
 | ||||||
|         return cls(invoice) |         return cls(invoice) | ||||||
| 
 | 
 | ||||||
|     @classmethod |     @classmethod | ||||||
|     def void_all_invoices(cls, cart): |     def update_old_invoices(cls, cart): | ||||||
|         invoices = commerce.Invoice.objects.filter(cart=cart).all() |         invoices = commerce.Invoice.objects.filter(cart=cart).all() | ||||||
|         for invoice in invoices: |         for invoice in invoices: | ||||||
|             cls(invoice).void() |             cls(invoice).update_status() | ||||||
| 
 | 
 | ||||||
|     @classmethod |     @classmethod | ||||||
|     def resolve_discount_value(cls, item): |     def resolve_discount_value(cls, item): | ||||||
|  | @ -299,7 +299,11 @@ class InvoiceController(ForId, object): | ||||||
|     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 cart it is attached to has updated. ''' | ||||||
|         if not self._invoice_matches_cart(): |         if not self._invoice_matches_cart(): | ||||||
|             self.void() |             if self.total_payments() > 0: | ||||||
|  |                 # Free up the payments made to this invoice | ||||||
|  |                 self.refund() | ||||||
|  |             else: | ||||||
|  |                 self.void() | ||||||
| 
 | 
 | ||||||
|     def void(self): |     def void(self): | ||||||
|         ''' Voids the invoice if it is valid to do so. ''' |         ''' Voids the invoice if it is valid to do so. ''' | ||||||
|  |  | ||||||
|  | @ -534,6 +534,52 @@ class InvoiceTestCase(RegistrationCartTestCase): | ||||||
|         with self.assertRaises(ValidationError): |         with self.assertRaises(ValidationError): | ||||||
|             invoice = TestingInvoiceController.for_cart(cart.cart) |             invoice = TestingInvoiceController.for_cart(cart.cart) | ||||||
| 
 | 
 | ||||||
|  |     def test_invoice_with_credit_note_applied_is_refunded(self): | ||||||
|  |         ''' Invoices with partial payments should void when cart is updated. | ||||||
|  | 
 | ||||||
|  |         Test for issue #64 -- applying a credit note to an invoice | ||||||
|  |         means that invoice cannot be voided, and new invoices cannot be | ||||||
|  |         created. ''' | ||||||
|  | 
 | ||||||
|  |         cart = TestingCartController.for_user(self.USER_1) | ||||||
|  | 
 | ||||||
|  |         cart.add_to_cart(self.PROD_1, 1) | ||||||
|  |         invoice = TestingInvoiceController.for_cart(cart.cart) | ||||||
|  | 
 | ||||||
|  |         # Now get a credit note | ||||||
|  |         invoice.pay("Lol", invoice.invoice.value) | ||||||
|  |         invoice.refund() | ||||||
|  |         cn = self._credit_note_for_invoice(invoice.invoice) | ||||||
|  | 
 | ||||||
|  |         # Create a cart of higher value than the credit note | ||||||
|  |         cart = TestingCartController.for_user(self.USER_1) | ||||||
|  |         cart.add_to_cart(self.PROD_1, 2) | ||||||
|  | 
 | ||||||
|  |         # Create a current invoice, and apply partial payments | ||||||
|  |         invoice = TestingInvoiceController.for_cart(cart.cart) | ||||||
|  |         cn.apply_to_invoice(invoice.invoice) | ||||||
|  | 
 | ||||||
|  |         # Adding to cart will mean that the old invoice for this cart | ||||||
|  |         # will be invalidated. A new invoice should be generated. | ||||||
|  |         cart.add_to_cart(self.PROD_1, 1) | ||||||
|  |         invoice = TestingInvoiceController.for_id(invoice.invoice.id) | ||||||
|  |         invoice2 = TestingInvoiceController.for_cart(cart.cart) | ||||||
|  |         cn2 = self._credit_note_for_invoice(invoice.invoice) | ||||||
|  | 
 | ||||||
|  |         invoice._refresh() | ||||||
|  | 
 | ||||||
|  |         # The first invoice should be refunded | ||||||
|  |         self.assertEquals( | ||||||
|  |             commerce.Invoice.STATUS_VOID, | ||||||
|  |             invoice.invoice.status, | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         # Both credit notes should be for the same amount | ||||||
|  |         self.assertEquals( | ||||||
|  |             cn.credit_note.value, | ||||||
|  |             cn2.credit_note.value, | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|     def test_sends_email_on_invoice_creation(self): |     def test_sends_email_on_invoice_creation(self): | ||||||
|         invoice = self._invoice_containing_prod_1(1) |         invoice = self._invoice_containing_prod_1(1) | ||||||
|         self.assertEquals(1, len(self.emails)) |         self.assertEquals(1, len(self.emails)) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Christopher Neugebauer
						Christopher Neugebauer