From 5dff7565f4fc27cbe75d61f2ff93ce71584a1465 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Tue, 31 Dec 2024 13:09:16 -0500 Subject: [PATCH 1/5] #84 refactor(paymentMethods): move to apiview. --- tienda_ilusion/don_confiao/api_views.py | 10 ++++++++-- tienda_ilusion/don_confiao/serializers.py | 10 ++++++++++ tienda_ilusion/don_confiao/urls.py | 2 +- tienda_ilusion/don_confiao/views.py | 8 -------- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/tienda_ilusion/don_confiao/api_views.py b/tienda_ilusion/don_confiao/api_views.py index bfb85bc..6b5b8ca 100644 --- a/tienda_ilusion/don_confiao/api_views.py +++ b/tienda_ilusion/don_confiao/api_views.py @@ -3,8 +3,8 @@ from rest_framework.response import Response from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.views import APIView -from .models import Sale, SaleLine, Customer, Product, ReconciliationJar -from .serializers import SaleSerializer, ProductSerializer, CustomerSerializer, ReconciliationJarSerializer +from .models import Sale, SaleLine, Customer, Product, ReconciliationJar, PaymentMethods +from .serializers import SaleSerializer, ProductSerializer, CustomerSerializer, ReconciliationJarSerializer, PaymentMethodSerializer from decimal import Decimal import json @@ -100,3 +100,9 @@ class ReconciliateJarView(APIView): purchase.reconciliation = reconciliation purchase.clean() purchase.save() + + +class PaymentMethodView(APIView): + def get(self, request): + serializer = PaymentMethodSerializer(PaymentMethods.choices, many=True) + return Response(serializer.data) diff --git a/tienda_ilusion/don_confiao/serializers.py b/tienda_ilusion/don_confiao/serializers.py index eb9db60..10e1a95 100644 --- a/tienda_ilusion/don_confiao/serializers.py +++ b/tienda_ilusion/don_confiao/serializers.py @@ -38,3 +38,13 @@ class ReconciliationJarSerializer(serializers.ModelSerializer): 'cash_discrepancy', 'total_cash_purchases', ] + +class PaymentMethodSerializer(serializers.Serializer): + text = serializers.CharField() + value = serializers.CharField() + + def to_representation(self, instance): + return { + 'text': instance[1], + 'value': instance[0], + } diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index 18388f8..f6bcd46 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -25,7 +25,7 @@ urlpatterns = [ name="exportar_ventas_para_tryton"), path("resumen_compra/", views.purchase_summary, name="purchase_summary"), path("resumen_compra_json/", views.purchase_json_summary, name="purchase_json_summary"), - path("payment_methods/all/select_format", views.payment_methods_to_select, name="payment_methods_to_select"), + path("payment_methods/all/select_format", api_views.PaymentMethodView.as_view(), name="payment_methods_to_select"), path('purchases/for_reconciliation', views.sales_for_reconciliation, name='sales_for_reconciliation'), path('reconciliate_jar', api_views.ReconciliateJarView.as_view()), path('api/', include(router.urls)), diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index a7f543b..039759d 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -152,14 +152,6 @@ def purchase_json_summary(request, id): return JsonResponse(to_response, safe=False) -def payment_methods_to_select(request): - methods = [ - {'text': choice[1], 'value': choice[0]} - for choice in PaymentMethods.choices - ] - return JsonResponse(methods, safe=False) - - def sales_for_reconciliation(request): sales = Sale.objects.filter(reconciliation=None) grouped_sales = {} From 8b7c2efcb34a771214919165078bbf318d3bbbc2 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Tue, 31 Dec 2024 13:26:47 -0500 Subject: [PATCH 2/5] #84 refactor(SalesForReconciliation): move to apiview. --- tienda_ilusion/don_confiao/api_views.py | 16 +++++++++++++++- tienda_ilusion/don_confiao/serializers.py | 16 ++++++++++++++++ tienda_ilusion/don_confiao/urls.py | 2 +- tienda_ilusion/don_confiao/views.py | 18 ------------------ 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/tienda_ilusion/don_confiao/api_views.py b/tienda_ilusion/don_confiao/api_views.py index 6b5b8ca..b9b0549 100644 --- a/tienda_ilusion/don_confiao/api_views.py +++ b/tienda_ilusion/don_confiao/api_views.py @@ -4,7 +4,7 @@ from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.views import APIView from .models import Sale, SaleLine, Customer, Product, ReconciliationJar, PaymentMethods -from .serializers import SaleSerializer, ProductSerializer, CustomerSerializer, ReconciliationJarSerializer, PaymentMethodSerializer +from .serializers import SaleSerializer, ProductSerializer, CustomerSerializer, ReconciliationJarSerializer, PaymentMethodSerializer, SaleForRenconciliationSerializer from decimal import Decimal import json @@ -106,3 +106,17 @@ class PaymentMethodView(APIView): def get(self, request): serializer = PaymentMethodSerializer(PaymentMethods.choices, many=True) return Response(serializer.data) + + +class SalesForReconciliationView(APIView): + def get(self, request): + sales = Sale.objects.filter(reconciliation=None) + grouped_sales = {} + + for sale in sales: + if sale.payment_method not in grouped_sales.keys(): + grouped_sales[sale.payment_method] = [] + serializer = SaleForRenconciliationSerializer(sale) + grouped_sales[sale.payment_method].append(serializer.data) + + return Response(grouped_sales) diff --git a/tienda_ilusion/don_confiao/serializers.py b/tienda_ilusion/don_confiao/serializers.py index 10e1a95..f8fc72e 100644 --- a/tienda_ilusion/don_confiao/serializers.py +++ b/tienda_ilusion/don_confiao/serializers.py @@ -48,3 +48,19 @@ class PaymentMethodSerializer(serializers.Serializer): 'text': instance[1], 'value': instance[0], } + +class SaleForRenconciliationSerializer(serializers.Serializer): + id = serializers.IntegerField() + date = serializers.DateTimeField() + payment_method = serializers.CharField() + customer = serializers.SerializerMethodField() + total = serializers.SerializerMethodField() + + def get_customer(self, sale): + return { + 'id': sale.customer.id, + 'name': sale.customer.name, + } + + def get_total(self, sale): + return sale.get_total() diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index f6bcd46..c322a0a 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -26,7 +26,7 @@ urlpatterns = [ path("resumen_compra/", views.purchase_summary, name="purchase_summary"), path("resumen_compra_json/", views.purchase_json_summary, name="purchase_json_summary"), path("payment_methods/all/select_format", api_views.PaymentMethodView.as_view(), name="payment_methods_to_select"), - path('purchases/for_reconciliation', views.sales_for_reconciliation, name='sales_for_reconciliation'), + path('purchases/for_reconciliation', api_views.SalesForReconciliationView.as_view(), name='sales_for_reconciliation'), path('reconciliate_jar', api_views.ReconciliateJarView.as_view()), path('api/', include(router.urls)), ] diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index 039759d..73b2dc1 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -152,24 +152,6 @@ def purchase_json_summary(request, id): return JsonResponse(to_response, safe=False) -def sales_for_reconciliation(request): - sales = Sale.objects.filter(reconciliation=None) - grouped_sales = {} - for sale in sales: - if sale.payment_method not in grouped_sales.keys(): - grouped_sales[sale.payment_method] = [] - grouped_sales[sale.payment_method].append({ - 'id': sale.id, - 'date': sale.date, - 'payment_method': sale.payment_method, - 'customer': { - 'id': sale.customer.id, - 'name': sale.customer.name, - }, - 'total': sale.get_total(), - }) - return JsonResponse(grouped_sales, safe=False) - def _mask_phone(phone): digits = str(phone)[-3:] if phone else " " * 3 return "X" * 7 + digits From 69d8b1d2ad462d47da3705b741d9cdc9e9479a06 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Tue, 31 Dec 2024 13:51:11 -0500 Subject: [PATCH 3/5] #84 refactor(SaleSummary): move to apiview. --- tienda_ilusion/don_confiao/api_views.py | 8 +++++- tienda_ilusion/don_confiao/serializers.py | 29 ++++++++++++++++++++ tienda_ilusion/don_confiao/urls.py | 2 +- tienda_ilusion/don_confiao/views.py | 32 ----------------------- 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/tienda_ilusion/don_confiao/api_views.py b/tienda_ilusion/don_confiao/api_views.py index b9b0549..1f5581f 100644 --- a/tienda_ilusion/don_confiao/api_views.py +++ b/tienda_ilusion/don_confiao/api_views.py @@ -4,7 +4,7 @@ from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.views import APIView from .models import Sale, SaleLine, Customer, Product, ReconciliationJar, PaymentMethods -from .serializers import SaleSerializer, ProductSerializer, CustomerSerializer, ReconciliationJarSerializer, PaymentMethodSerializer, SaleForRenconciliationSerializer +from .serializers import SaleSerializer, ProductSerializer, CustomerSerializer, ReconciliationJarSerializer, PaymentMethodSerializer, SaleForRenconciliationSerializer, SaleSummarySerializer from decimal import Decimal import json @@ -120,3 +120,9 @@ class SalesForReconciliationView(APIView): grouped_sales[sale.payment_method].append(serializer.data) return Response(grouped_sales) + +class SaleSummary(APIView): + def get(self, request, id): + sale = Sale.objects.get(pk=id) + serializer = SaleSummarySerializer(sale) + return Response(serializer.data) diff --git a/tienda_ilusion/don_confiao/serializers.py b/tienda_ilusion/don_confiao/serializers.py index f8fc72e..9c1d483 100644 --- a/tienda_ilusion/don_confiao/serializers.py +++ b/tienda_ilusion/don_confiao/serializers.py @@ -64,3 +64,32 @@ class SaleForRenconciliationSerializer(serializers.Serializer): def get_total(self, sale): return sale.get_total() + + +class ListCustomerSerializer(serializers.ModelSerializer): + class Meta: + model = Customer + fields = ['id', 'name'] + + +class ListProductSerializer(serializers.ModelSerializer): + class Meta: + model = Product + fields = ['id', 'name'] + + +class SummarySaleLineSerializer(serializers.ModelSerializer): + product = ListProductSerializer() + + class Meta: + model = SaleLine + fields = ['product', 'quantity', 'unit_price', 'description'] + + +class SaleSummarySerializer(serializers.ModelSerializer): + customer = ListCustomerSerializer() + saleline_set = SummarySaleLineSerializer(many=True) + + class Meta: + model = Sale + fields = ['id', 'date', 'customer', 'payment_method', 'saleline_set'] diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index c322a0a..fb8659b 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -24,7 +24,7 @@ urlpatterns = [ views.exportar_ventas_para_tryton, name="exportar_ventas_para_tryton"), path("resumen_compra/", views.purchase_summary, name="purchase_summary"), - path("resumen_compra_json/", views.purchase_json_summary, name="purchase_json_summary"), + path("resumen_compra_json/", api_views.SaleSummary.as_view(), name="purchase_json_summary"), path("payment_methods/all/select_format", api_views.PaymentMethodView.as_view(), name="payment_methods_to_select"), path('purchases/for_reconciliation', api_views.SalesForReconciliationView.as_view(), name='sales_for_reconciliation'), path('reconciliate_jar', api_views.ReconciliateJarView.as_view()), diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index 73b2dc1..ff14a23 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -125,38 +125,6 @@ def purchase_summary(request, id): ) -def purchase_json_summary(request, id): - purchase = Sale.objects.get(pk=id) - lines = [] - for line in purchase.saleline_set.all(): - lines.append({ - 'product': { - 'id': line.product.id, - 'name': line.product.name, - }, - 'quantity': line.quantity, - 'unit_price': line.unit_price, - 'description': line.description, - }) - to_response = { - 'id': purchase.id, - 'date': purchase.date, - 'customer': { - 'id': purchase.customer.id, - 'name': purchase.customer.name, - # 'phone': _mask_phone(purchase.customer.phone) - }, - 'payment_method': purchase.payment_method, - 'set_lines': lines, - } - return JsonResponse(to_response, safe=False) - - -def _mask_phone(phone): - digits = str(phone)[-3:] if phone else " " * 3 - return "X" * 7 + digits - - def _categories_from_csv_string(categories_string, separator="&"): categories = categories_string.split(separator) clean_categories = [c.strip() for c in categories] From 432b7dad743e46f96d21507b8b5ba9e1b7eefc18 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Tue, 31 Dec 2024 14:30:20 -0500 Subject: [PATCH 4/5] #84 refactor(SaleSummary): rename saleline_set to lines at serializer. --- .../src/components/SummaryPurchase.vue | 4 ++-- tienda_ilusion/don_confiao/serializers.py | 4 ++-- .../tests/test_summary_view_purchase.py | 16 +++++++++------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/SummaryPurchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/SummaryPurchase.vue index cf187af..14d14f7 100644 --- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/SummaryPurchase.vue +++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/SummaryPurchase.vue @@ -32,13 +32,13 @@ Total: - {{ currencyFormat(calculateTotal(purchase.set_lines)) }} + {{ currencyFormat(calculateTotal(purchase.lines)) }}