fix: ReconciliationJar.
This commit is contained in:
		@@ -2,6 +2,7 @@ from django.db import models
 | 
				
			|||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
from django.core.exceptions import ValidationError
 | 
					from django.core.exceptions import ValidationError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from decimal import Decimal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Sale(models.Model):
 | 
					class Sale(models.Model):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -82,16 +83,27 @@ class ReconciliationJar(models.Model):
 | 
				
			|||||||
    cash_taken = models.DecimalField(max_digits=9, decimal_places=2)
 | 
					    cash_taken = models.DecimalField(max_digits=9, decimal_places=2)
 | 
				
			||||||
    cash_discrepancy = models.DecimalField(max_digits=9, decimal_places=2)
 | 
					    cash_discrepancy = models.DecimalField(max_digits=9, decimal_places=2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def manual_clean(self):
 | 
					    def clean(self):
 | 
				
			||||||
        payments_amount = sum([p.amount for p in self.payment_set.all()])
 | 
					        if not self.is_valid:
 | 
				
			||||||
        reconciliation_ammount = sum([
 | 
					            payments = Payment.get_reconciliation_jar_summary().payments
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            payments = self.payment_set.all()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        payments_amount = Decimal(sum([p.amount for p in payments]))
 | 
				
			||||||
 | 
					        reconciliation_ammount = Decimal(sum([
 | 
				
			||||||
            self.cash_taken,
 | 
					            self.cash_taken,
 | 
				
			||||||
            self.cash_discrepancy,
 | 
					            self.cash_discrepancy,
 | 
				
			||||||
        ])
 | 
					        ]))
 | 
				
			||||||
        if reconciliation_ammount != payments_amount:
 | 
					
 | 
				
			||||||
 | 
					        equal_ammounts = reconciliation_ammount.compare(payments_amount) == Decimal('0')
 | 
				
			||||||
 | 
					        if not equal_ammounts:
 | 
				
			||||||
            raise ValidationError(
 | 
					            raise ValidationError(
 | 
				
			||||||
                {"cash_take": _("The taken ammount has discrepancy.")}
 | 
					                {"cash_taken": _("The taken ammount has discrepancy.")}
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add_payments(self, payments):
 | 
				
			||||||
 | 
					        for payment in payments:
 | 
				
			||||||
 | 
					            self.payment_set.add(payment)
 | 
				
			||||||
        self.is_valid = True
 | 
					        self.is_valid = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Payment(models.Model):
 | 
					class Payment(models.Model):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
from django.test import Client, TestCase
 | 
					from django.test import TestCase
 | 
				
			||||||
from django.core.exceptions import ValidationError
 | 
					from django.core.exceptions import ValidationError
 | 
				
			||||||
from .models import Payment, ReconciliationJar
 | 
					from .models import Payment, ReconciliationJar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,10 +50,10 @@ class TestBilling(TestCase):
 | 
				
			|||||||
        reconciliation_jar.cash_discrepancy = 0
 | 
					        reconciliation_jar.cash_discrepancy = 0
 | 
				
			||||||
        reconciliation_jar.save()
 | 
					        reconciliation_jar.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for payment in jar_summary.payments:
 | 
					        reconciliation_jar.add_payments(jar_summary.payments)
 | 
				
			||||||
            reconciliation_jar.payment_set.add(payment)
 | 
					
 | 
				
			||||||
        with self.assertRaises(ValidationError):
 | 
					        with self.assertRaises(ValidationError):
 | 
				
			||||||
            reconciliation_jar.manual_clean()
 | 
					            reconciliation_jar.clean()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_validate_reconciliation_jar_with_cash_float(self):
 | 
					    def test_validate_reconciliation_jar_with_cash_float(self):
 | 
				
			||||||
        cash_payment1, cash_payment2 = self._create_two_cash_payments()
 | 
					        cash_payment1, cash_payment2 = self._create_two_cash_payments()
 | 
				
			||||||
@@ -63,16 +63,13 @@ class TestBilling(TestCase):
 | 
				
			|||||||
        reconciliation_jar.date_time = '2024-07-13 13:02:00'
 | 
					        reconciliation_jar.date_time = '2024-07-13 13:02:00'
 | 
				
			||||||
        reconciliation_jar.description = "test reconcialiation jar"
 | 
					        reconciliation_jar.description = "test reconcialiation jar"
 | 
				
			||||||
        reconciliation_jar.reconcilier = 'Jorge'
 | 
					        reconciliation_jar.reconcilier = 'Jorge'
 | 
				
			||||||
        reconciliation_jar.cash_float = 10000
 | 
					 | 
				
			||||||
        reconciliation_jar.cash_taken = jar_summary.total
 | 
					        reconciliation_jar.cash_taken = jar_summary.total
 | 
				
			||||||
        reconciliation_jar.cash_discrepancy = 0
 | 
					        reconciliation_jar.cash_discrepancy = 0
 | 
				
			||||||
        reconciliation_jar.save()
 | 
					        reconciliation_jar.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for payment in jar_summary.payments:
 | 
					        reconciliation_jar.add_payments(jar_summary.payments)
 | 
				
			||||||
            reconciliation_jar.payment_set.add(payment)
 | 
					 | 
				
			||||||
        reconciliation_jar.clean()
 | 
					        reconciliation_jar.clean()
 | 
				
			||||||
        reconciliation_jar.save()
 | 
					        reconciliation_jar.save()
 | 
				
			||||||
        reconciliation_jar.manual_clean()
 | 
					 | 
				
			||||||
        self.assertTrue(reconciliation_jar.is_valid)
 | 
					        self.assertTrue(reconciliation_jar.is_valid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _create_two_cash_payments(self):
 | 
					    def _create_two_cash_payments(self):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,17 +75,12 @@ def reconciliate_jar(request):
 | 
				
			|||||||
    summary = Payment.get_reconciliation_jar_summary()
 | 
					    summary = Payment.get_reconciliation_jar_summary()
 | 
				
			||||||
    if request.method == 'POST':
 | 
					    if request.method == 'POST':
 | 
				
			||||||
        form = ReconciliationJarForm(request.POST)
 | 
					        form = ReconciliationJarForm(request.POST)
 | 
				
			||||||
        reconciliation = form.save()
 | 
					        if form.is_valid():
 | 
				
			||||||
        try:
 | 
					            reconciliation = form.save()
 | 
				
			||||||
            if form.is_valid():
 | 
					            reconciliation.add_payments(summary.payments)
 | 
				
			||||||
                reconciliation.payment_set.set(summary.payments)
 | 
					            reconciliation.clean()
 | 
				
			||||||
                reconciliation.manual_clean()
 | 
					            reconciliation.save()
 | 
				
			||||||
                form.save()
 | 
					            return HttpResponseRedirect('cuadres')
 | 
				
			||||||
                return HttpResponseRedirect('cuadres')
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            reconciliation.payment_set.set({})
 | 
					 | 
				
			||||||
            reconciliation.delete()
 | 
					 | 
				
			||||||
            raise e
 | 
					 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        form = ReconciliationJarForm()
 | 
					        form = ReconciliationJarForm()
 | 
				
			||||||
    return render(
 | 
					    return render(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user