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): |     def __str__(self): | ||||||
|         return self.name |         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