diff --git a/tienda_ilusion/don_confiao/forms.py b/tienda_ilusion/don_confiao/forms.py index 1c739f1..809e877 100644 --- a/tienda_ilusion/don_confiao/forms.py +++ b/tienda_ilusion/don_confiao/forms.py @@ -1,8 +1,11 @@ from django import forms +from django.forms.models import inlineformset_factory + from django.forms.widgets import DateInput, DateTimeInput -from .models import Sale, SaleLine, ReconciliationJar +from .models import Sale, SaleLine, ReconciliationJar, PaymentMethods +readonly_number_widget = forms.NumberInput(attrs={'readonly': 'readonly'}) class ImportProductsForm(forms.Form): csv_file = forms.FileField() @@ -33,7 +36,24 @@ class PurchaseLineForm(forms.ModelForm): ] -LineaFormSet = forms.models.inlineformset_factory( +class PurchaseSummaryForm(forms.Form): + quantity_lines = forms.IntegerField( + widget=readonly_number_widget + ) + quantity_products = forms.IntegerField( + widget=readonly_number_widget + ) + ammount = forms.DecimalField( + max_digits=10, + decimal_places=2, + widget=readonly_number_widget + ) + payment_method = forms.ChoiceField( + choices=PaymentMethods.choices, + widget=forms.Select(attrs={'disabled': 'disabled'}) + ) + +LineaFormSet = inlineformset_factory( Sale, SaleLine, extra=1, diff --git a/tienda_ilusion/don_confiao/models.py b/tienda_ilusion/don_confiao/models.py index 9de8188..ba69ea1 100644 --- a/tienda_ilusion/don_confiao/models.py +++ b/tienda_ilusion/don_confiao/models.py @@ -54,7 +54,7 @@ class Product(models.Model): return self.name -class PyamentMethods(models.TextChoices): +class PaymentMethods(models.TextChoices): CASH = 'CASH', _('Cash') CONFIAR = 'CONFIAR', _('Confiar') BANCOLOMBIA = 'BANCOLOMBIA', _('Bancolombia') @@ -112,8 +112,8 @@ class Payment(models.Model): date_time = models.DateTimeField() type_payment = models.CharField( max_length=30, - choices=PyamentMethods.choices, - default=PyamentMethods.CASH + choices=PaymentMethods.choices, + default=PaymentMethods.CASH ) amount = models.DecimalField(max_digits=9, decimal_places=2) reconciliation_jar = models.ForeignKey( @@ -129,7 +129,7 @@ class Payment(models.Model): def get_reconciliation_jar_summary(cls): return ReconciliationJarSummary( cls.objects.filter( - type_payment=PyamentMethods.CASH, + type_payment=PaymentMethods.CASH, reconciliation_jar=None ) ) diff --git a/tienda_ilusion/don_confiao/static/js/sale_summary.js b/tienda_ilusion/don_confiao/static/js/sale_summary.js new file mode 100644 index 0000000..5545163 --- /dev/null +++ b/tienda_ilusion/don_confiao/static/js/sale_summary.js @@ -0,0 +1,37 @@ +const complete_form = document.getElementById('complete_form_purchase') +const quantityLines = document.getElementById('id_quantity_lines'); +const quantityProducts = document.getElementById('id_quantity_products'); +const ammountInput = document.getElementById('id_ammount'); +const idPrefix = 'id_saleline_set-'; +const quantitySuffix = '-quantity'; +const priceSuffix = '-unit_price'; +const quantityRegexSelector = `[id^="${idPrefix}"][id$="${quantitySuffix}"]`; +const priceRegexSelector = `[id^="${idPrefix}"][id$="${priceSuffix}"]`; + +complete_form.addEventListener('change', function(event){ + if (event.target.matches(quantityRegexSelector)) { + calculateSummary(); + } + if (event.target.matches(priceRegexSelector)) { + calculateSummary(); + } +}); + + +function calculateSummary() { + let quantity = 0; + let ammount = 0; + const quantityInputs = document.querySelectorAll(quantityRegexSelector); + const ids = Array.prototype.map.call(quantityInputs, function(input) { + return input.id.match(/\d+/)[0]; + }); + ids.forEach(function(id) { + let lineQuantity = document.getElementById(`${idPrefix}${id}${quantitySuffix}`) + let linePrice = document.getElementById(`${idPrefix}${id}${priceSuffix}`) + quantity += parseFloat(lineQuantity.value); + ammount += parseFloat(linePrice.value) * parseFloat(lineQuantity.value); + }); + quantityProducts.value = quantity; + quantityLines.value = quantityInputs.length; + ammountInput.value = ammount; +} diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html index d174357..2095a43 100644 --- a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html +++ b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html @@ -1,8 +1,8 @@ {% load static %} -
+ {% csrf_token %} - {{ sale_form}} + {{ sale_form }} {{ linea_formset.management_form }}
{% for form in linea_formset %} @@ -14,6 +14,8 @@ {% endfor %}
+ {{ summary_form }}
+
diff --git a/tienda_ilusion/don_confiao/test_billing.py b/tienda_ilusion/don_confiao/tests/test_billing.py similarity index 98% rename from tienda_ilusion/don_confiao/test_billing.py rename to tienda_ilusion/don_confiao/tests/test_billing.py index 89a5a43..69f6047 100644 --- a/tienda_ilusion/don_confiao/test_billing.py +++ b/tienda_ilusion/don_confiao/tests/test_billing.py @@ -1,6 +1,6 @@ from django.test import TestCase from django.core.exceptions import ValidationError -from .models import Payment, ReconciliationJar +from ..models import Payment, ReconciliationJar class TestBilling(TestCase): diff --git a/tienda_ilusion/don_confiao/tests/test_purchase_with_payment.py b/tienda_ilusion/don_confiao/tests/test_purchase_with_payment.py new file mode 100644 index 0000000..e9d6d36 --- /dev/null +++ b/tienda_ilusion/don_confiao/tests/test_purchase_with_payment.py @@ -0,0 +1,36 @@ +from django.test import Client, TestCase + +from ..models import Payment, Sale + +class TestPurchaseWithPayment(TestCase): + def setUp(self): + self.client = Client() + + # def test_generate_payment_when_it_has_payment(self): + # quantity = 2 + # unit_price = 2500 + # total = 5000 + # response = self.client.post( + # '/don_confiao/comprar', + # { + # "customer": "Noelba Lopez", + # "date": "2024-07-27", + # "phone": "3010101000", + # "description": "Venta de contado", + # "saleline_set-TOTAL_FORMS": "1", + # "saleline_set-INITIAL_FORMS": "0", + # "saleline_set-MIN_NUM_FORMS": "0", + # "saleline_set-MAX_NUM_FORMS": "1000", + # "saleline_set-0-product": "Papayita", + # "saleline_set-0-quantity": str(quantity), + # "saleline_set-0-unit_price": str(unit_price), + # "saleline_set-0-description": "Linea de Venta", + # "saleline_set-0-sale": "", + # "saleline_set-0-id": "", + # } + # ) + # purchases = Sale.objects.all() + # self.assertEqual(1, len(purchases)) + # payments = Payment.objects.all() + # self.assertEqual(1, len(payments)) + # self.assertEqual(total, payments[0].ammount) diff --git a/tienda_ilusion/don_confiao/test_reconciliation_jar_client.py b/tienda_ilusion/don_confiao/tests/test_reconciliation_jar_client.py similarity index 93% rename from tienda_ilusion/don_confiao/test_reconciliation_jar_client.py rename to tienda_ilusion/don_confiao/tests/test_reconciliation_jar_client.py index ad58d0e..ae9ba90 100644 --- a/tienda_ilusion/don_confiao/test_reconciliation_jar_client.py +++ b/tienda_ilusion/don_confiao/tests/test_reconciliation_jar_client.py @@ -1,9 +1,7 @@ from django.test import Client, TestCase from django.contrib.auth.models import AnonymousUser, User -#from django.conf import settings -#from .views import import_products, products -from .models import Payment +from ..models import Payment class TestReconciliationJarClient(TestCase): diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index efa121d..eabd664 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -5,7 +5,7 @@ from django.core.exceptions import ValidationError from django.views.generic import ListView from .models import Sale, Product, ProductCategory, Payment -from .forms import ImportProductsForm, PurchaseForm, LineaFormSet, ReconciliationJarForm +from .forms import ImportProductsForm, PurchaseForm, LineaFormSet, ReconciliationJarForm, PurchaseSummaryForm import csv import io @@ -19,6 +19,7 @@ def buy(request): if request.method == "POST": sale_form = PurchaseForm(request.POST) sale_linea_form = LineaFormSet(request.POST) + sale_summary_form = PurchaseSummaryForm(request.POST) if sale_form.is_valid() and sale_linea_form.is_valid(): sale = sale_form.save() lines = sale_linea_form.save(commit=False) @@ -29,12 +30,14 @@ def buy(request): else: sale_form = PurchaseForm() sale_linea_form = LineaFormSet() + sale_summary_form = PurchaseSummaryForm() return render( request, 'don_confiao/purchase.html', { 'sale_form': sale_form, - 'linea_formset': sale_linea_form + 'linea_formset': sale_linea_form, + 'summary_form': sale_summary_form, } )