Updates the treasurer’s reconciliation view to be MUCH more comprehensive.
This commit is contained in:
		
							parent
							
								
									4a50d69936
								
							
						
					
					
						commit
						7e74a2e0da
					
				
					 2 changed files with 74 additions and 25 deletions
				
			
		|  | @ -307,6 +307,10 @@ class CreditNote(PaymentBase): | |||
|             creditnoterefund=None, | ||||
|         ) | ||||
| 
 | ||||
|     @classmethod | ||||
|     def refunded(cls): | ||||
|         return cls.objects.exclude(creditnoterefund=None) | ||||
| 
 | ||||
|     @property | ||||
|     def status(self): | ||||
|         if self.is_unclaimed: | ||||
|  |  | |||
|  | @ -48,20 +48,27 @@ def reports_list(request): | |||
| 
 | ||||
| # Report functions | ||||
| 
 | ||||
| @report_view("Reconcilitation") | ||||
| def reconciliation(request, form): | ||||
|     ''' Shows the summary of sales, and the full history of payments and | ||||
|     refunds into the system. ''' | ||||
| 
 | ||||
| @report_view("Paid items", form_type=forms.ProductAndCategoryForm) | ||||
| def items_sold(request, form): | ||||
|     return [ | ||||
|         sales_payment_summary(), | ||||
|         items_sold(), | ||||
|         payments(), | ||||
|         credit_note_refunds(), | ||||
|     ] | ||||
| 
 | ||||
| 
 | ||||
| def items_sold(): | ||||
|     ''' Summarises the items sold and discounts granted for a given set of | ||||
|     products, or products from categories. ''' | ||||
| 
 | ||||
|     data = None | ||||
|     headings = None | ||||
| 
 | ||||
|     products = form.cleaned_data["product"] | ||||
|     categories = form.cleaned_data["category"] | ||||
| 
 | ||||
|     line_items = commerce.LineItem.objects.filter( | ||||
|         Q(product__in=products) | Q(product__category__in=categories), | ||||
|         invoice__status=commerce.Invoice.STATUS_PAID, | ||||
|     ).select_related("invoice") | ||||
| 
 | ||||
|  | @ -95,14 +102,20 @@ def items_sold(request, form): | |||
|     return ListReport("Paid items", headings, data) | ||||
| 
 | ||||
| 
 | ||||
| @report_view("Reconcilitation") | ||||
| def reconciliation(request, form): | ||||
|     ''' Reconciles all sales in the system with the payments in the | ||||
|     system. ''' | ||||
| def sales_payment_summary(): | ||||
|     ''' Summarises paid items and payments. ''' | ||||
| 
 | ||||
|     headings = ["Thing", "Total"] | ||||
|     def value_or_zero(aggregate, key): | ||||
|         return aggregate[key] or 0 | ||||
| 
 | ||||
|     def sum_amount(payment_set): | ||||
|         a = payment_set.values("amount").aggregate(total=Sum("amount")) | ||||
|         return value_or_zero(a, "total") | ||||
| 
 | ||||
|     headings = ["Category", "Total"] | ||||
|     data = [] | ||||
| 
 | ||||
|     # Summarise all sales made (= income.) | ||||
|     sales = commerce.LineItem.objects.filter( | ||||
|         invoice__status=commerce.Invoice.STATUS_PAID, | ||||
|     ).values( | ||||
|  | @ -110,27 +123,59 @@ def reconciliation(request, form): | |||
|     ).aggregate( | ||||
|         total=Sum(F("price") * F("quantity"), output_field=CURRENCY()), | ||||
|     ) | ||||
|     sales = value_or_zero(sales, "total") | ||||
| 
 | ||||
|     data.append(["Paid items", sales["total"]]) | ||||
|     all_payments = sum_amount(commerce.PaymentBase.objects.all()) | ||||
| 
 | ||||
|     payments = commerce.PaymentBase.objects.values( | ||||
|         "amount", | ||||
|     ).aggregate(total=Sum("amount")) | ||||
|     # Manual payments | ||||
|     # Credit notes generated (total) | ||||
|     # Payments made by credit note | ||||
|     # Claimed credit notes | ||||
| 
 | ||||
|     data.append(["Payments", payments["total"]]) | ||||
| 
 | ||||
|     ucn = commerce.CreditNote.unclaimed().values( | ||||
|         "amount" | ||||
|     ).aggregate(total=Sum("amount")) | ||||
| 
 | ||||
|     data.append(["Unclaimed credit notes", 0 - ucn["total"]]) | ||||
|     all_credit_notes = 0 - sum_amount(commerce.CreditNote.objects.all()) | ||||
|     unclaimed_credit_notes = 0 - sum_amount(commerce.CreditNote.unclaimed()) | ||||
|     claimed_credit_notes = sum_amount( | ||||
|         commerce.CreditNoteApplication.objects.all() | ||||
|     ) | ||||
|     refunded_credit_notes = 0 - sum_amount(commerce.CreditNote.refunded()) | ||||
| 
 | ||||
|     data.append(["Items on paid invoices", sales]) | ||||
|     data.append(["All payments", all_payments]) | ||||
|     data.append(["Sales - Payments ", sales - all_payments]) | ||||
|     data.append(["All credit notes", all_credit_notes]) | ||||
|     data.append(["Credit notes paid on invoices", claimed_credit_notes]) | ||||
|     data.append(["Credit notes refunded", refunded_credit_notes]) | ||||
|     data.append(["Unclaimed credit notes", unclaimed_credit_notes]) | ||||
|     data.append([ | ||||
|         "(Money not on invoices)", | ||||
|         sales["total"] - payments["total"] - ucn["total"], | ||||
|         "Credit notes - claimed credit notes - unclaimed credit notes", | ||||
|         all_credit_notes - claimed_credit_notes - | ||||
|             refunded_credit_notes - unclaimed_credit_notes, | ||||
|     ]) | ||||
| 
 | ||||
|     return ListReport("Sales and Payments", headings, data) | ||||
|     return ListReport("Sales and Payments Summary", headings, data) | ||||
| 
 | ||||
| 
 | ||||
| def payments(): | ||||
|     ''' Shows the history of payments into the system ''' | ||||
| 
 | ||||
|     payments = commerce.PaymentBase.objects.all() | ||||
|     return QuerysetReport( | ||||
|         "Payments", | ||||
|         ["invoice__id", "id", "reference", "amount"], | ||||
|         payments, | ||||
|         link_view=views.invoice, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| def credit_note_refunds(): | ||||
|     ''' Shows all of the credit notes that have been generated. ''' | ||||
|     notes_refunded = commerce.CreditNote.refunded() | ||||
|     return QuerysetReport( | ||||
|         "Credit note refunds", | ||||
|         ["id", "creditnoterefund__reference", "amount"], | ||||
|         notes_refunded, | ||||
|         link_view=views.credit_note, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @report_view("Product status", form_type=forms.ProductAndCategoryForm) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Christopher Neugebauer
						Christopher Neugebauer