feat: implement reconciliation jar summary.
This commit is contained in:
		
							
								
								
									
										23
									
								
								tienda_ilusion/don_confiao/migrations/0012_payment.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								tienda_ilusion/don_confiao/migrations/0012_payment.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# Generated by Django 5.0.6 on 2024-07-13 14:50
 | 
			
		||||
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('don_confiao', '0011_alter_product_name'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='Payment',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
			
		||||
                ('date_time', models.DateTimeField()),
 | 
			
		||||
                ('type_payment', models.CharField(choices=[('CASH', 'Cash'), ('CONFIAR', 'Confiar'), ('BANCOLOMBIA', 'Bancolombia')], default='CASH', max_length=30)),
 | 
			
		||||
                ('mount', models.DecimalField(decimal_places=2, max_digits=9)),
 | 
			
		||||
                ('description', models.CharField(blank=True, max_length=255, null=True)),
 | 
			
		||||
            ],
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
# Generated by Django 5.0.6 on 2024-07-13 15:56
 | 
			
		||||
 | 
			
		||||
from django.db import migrations
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('don_confiao', '0012_payment'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.RenameField(
 | 
			
		||||
            model_name='payment',
 | 
			
		||||
            old_name='mount',
 | 
			
		||||
            new_name='amount',
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
# Generated by Django 5.0.6 on 2024-07-13 16:35
 | 
			
		||||
 | 
			
		||||
import django.db.models.deletion
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('don_confiao', '0013_rename_mount_payment_amount'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='ReconciliationJar',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
			
		||||
                ('date_time', models.DateTimeField()),
 | 
			
		||||
                ('description', models.CharField(blank=True, max_length=255, null=True)),
 | 
			
		||||
            ],
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='payment',
 | 
			
		||||
            name='reconciliation_jar',
 | 
			
		||||
            field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.RESTRICT, to='don_confiao.reconciliationjar'),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
# Generated by Django 5.0.6 on 2024-07-13 16:36
 | 
			
		||||
 | 
			
		||||
import django.db.models.deletion
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('don_confiao', '0014_reconciliationjar_payment_reconciliation_jar'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='payment',
 | 
			
		||||
            name='reconciliation_jar',
 | 
			
		||||
            field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.RESTRICT, to='don_confiao.reconciliationjar'),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -44,3 +44,55 @@ class Product(models.Model):
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name
 | 
			
		||||
 | 
			
		||||
class PyamentMethods(models.TextChoices):
 | 
			
		||||
    CASH = 'CASH', _('Cash')
 | 
			
		||||
    CONFIAR = 'CONFIAR', _('Confiar')
 | 
			
		||||
    BANCOLOMBIA = 'BANCOLOMBIA', _('Bancolombia')
 | 
			
		||||
 | 
			
		||||
class ReconciliationJarSummary():
 | 
			
		||||
    def __init__(self, payments):
 | 
			
		||||
        self._validate_payments(payments)
 | 
			
		||||
        self._payments = payments
 | 
			
		||||
 | 
			
		||||
    def _validate_payments(self, payments):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def total(self):
 | 
			
		||||
        return sum([p.amount for p in self.payments])
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def payments(self):
 | 
			
		||||
        return self._payments
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ReconciliationJar(models.Model):
 | 
			
		||||
    date_time = models.DateTimeField()
 | 
			
		||||
    description = models.CharField(max_length=255, null=True, blank=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Payment(models.Model):
 | 
			
		||||
    date_time = models.DateTimeField()
 | 
			
		||||
    type_payment = models.CharField(
 | 
			
		||||
        max_length=30,
 | 
			
		||||
        choices=PyamentMethods.choices,
 | 
			
		||||
        default=PyamentMethods.CASH
 | 
			
		||||
    )
 | 
			
		||||
    amount = models.DecimalField(max_digits=9, decimal_places=2)
 | 
			
		||||
    reconciliation_jar = models.ForeignKey(
 | 
			
		||||
        ReconciliationJar,
 | 
			
		||||
        null=True,
 | 
			
		||||
        default=None,
 | 
			
		||||
        on_delete=models.RESTRICT
 | 
			
		||||
    )
 | 
			
		||||
    description = models.CharField(max_length=255, null=True, blank=True)
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def get_reconciliation_jar_summary(cls):
 | 
			
		||||
        return ReconciliationJarSummary(
 | 
			
		||||
            cls.objects.filter(
 | 
			
		||||
                type_payment=PyamentMethods.CASH,
 | 
			
		||||
                reconciliation_jar=None
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								tienda_ilusion/don_confiao/test_billing.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								tienda_ilusion/don_confiao/test_billing.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
from django.test import Client, TestCase
 | 
			
		||||
from .models import Payment
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestBilling(TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_reconciliation_jar_summary(self):
 | 
			
		||||
        cash_payment1 = Payment()
 | 
			
		||||
        cash_payment1.date_time = '2024-07-07 12:00:00'
 | 
			
		||||
        cash_payment1.type_payment = 'CASH'
 | 
			
		||||
        cash_payment1.amount = 132000
 | 
			
		||||
        cash_payment1.description = 'Saldo en compra'
 | 
			
		||||
        cash_payment1.save()
 | 
			
		||||
 | 
			
		||||
        cash_payment2 = Payment()
 | 
			
		||||
        cash_payment2.date_time = '2024-07-07 13:05:00'
 | 
			
		||||
        cash_payment2.type_payment = 'CASH'
 | 
			
		||||
        cash_payment2.amount = 32000
 | 
			
		||||
        cash_payment2.save()
 | 
			
		||||
 | 
			
		||||
        confiar_payment = Payment()
 | 
			
		||||
        confiar_payment.date_time = '2024-07-07 16:00:00'
 | 
			
		||||
        confiar_payment.type_payment = 'CONFIAR'
 | 
			
		||||
        confiar_payment.amount = 85000
 | 
			
		||||
        confiar_payment.save()
 | 
			
		||||
 | 
			
		||||
        bancolombia_payment = Payment()
 | 
			
		||||
        bancolombia_payment.date_time = '2024-07-07 12:30:00'
 | 
			
		||||
        bancolombia_payment.type_payment = 'BANCOLOMBIA'
 | 
			
		||||
        bancolombia_payment.amount = 12000
 | 
			
		||||
        bancolombia_payment.save()
 | 
			
		||||
 | 
			
		||||
        jar_summary = Payment.get_reconciliation_jar_summary()
 | 
			
		||||
        self.assertEqual(164000, jar_summary.total)
 | 
			
		||||
        self.assertSetEqual(
 | 
			
		||||
            {cash_payment1, cash_payment2},
 | 
			
		||||
            set(jar_summary.payments)
 | 
			
		||||
        )
 | 
			
		||||
		Reference in New Issue
	
	Block a user