def update_status(self): ''' Updates the status of this invoice based upon the total payments.''' old_status = self.invoice.status total_paid = self.total_payments() num_payments = commerce.PaymentBase.objects.filter( invoice=self.invoice, ).count() remainder = self.invoice.value - total_paid if old_status == commerce.Invoice.STATUS_UNPAID: # Invoice had an amount owing if remainder <= 0: # Invoice no longer has amount owing self._mark_paid() if remainder < 0: CreditNoteController.generate_from_invoice( self.invoice, 0 - remainder, ) elif total_paid == 0 and num_payments > 0: # Invoice has multiple payments totalling zero self._mark_void() elif old_status == commerce.Invoice.STATUS_PAID: if remainder > 0: # Invoice went from having a remainder of zero or less # to having a positive remainder -- must be a refund self._mark_refunded() elif old_status == commerce.Invoice.STATUS_REFUNDED: # Should not ever change from here pass elif old_status == commerce.Invoice.STATUS_VOID: # Should not ever change from here pass
def update_status(self): ''' Updates the status of this invoice based upon the total payments.''' old_status = self.invoice.status total_paid = self.total_payments() num_payments = commerce.PaymentBase.objects.filter( invoice=self.invoice, ).count() remainder = self.invoice.value - total_paid if old_status == commerce.Invoice.STATUS_UNPAID: # Invoice had an amount owing if remainder <= 0: # Invoice no longer has amount owing self._mark_paid() elif total_paid == 0 and num_payments > 0: # Invoice has multiple payments totalling zero self._mark_void() elif old_status == commerce.Invoice.STATUS_PAID: if remainder > 0: # Invoice went from having a remainder of zero or less # to having a positive remainder -- must be a refund self._mark_refunded() elif old_status == commerce.Invoice.STATUS_REFUNDED: # Should not ever change from here pass elif old_status == commerce.Invoice.STATUS_VOID: # Should not ever change from here pass # Generate credit notes from residual payments residual = 0 if self.invoice.is_paid: if remainder < 0: residual = 0 - remainder elif self.invoice.is_void or self.invoice.is_refunded: residual = total_paid if residual != 0: CreditNoteController.generate_from_invoice(self.invoice, residual)
def refund(self): ''' Refunds the invoice by generating a CreditNote for the value of all of the payments against the cart. The invoice is marked as refunded, and the underlying cart is marked as released. ''' if self.invoice.is_void: raise ValidationError("Void invoices cannot be refunded") # Raises a credit note fot the value of the invoice. amount = self.total_payments() if amount == 0: self.void() return CreditNoteController.generate_from_invoice(self.invoice, amount) self.update_status()