From d4a61b83400cd020cada8fb316193cb87864e4ec Mon Sep 17 00:00:00 2001 From: aserrador Date: Sat, 30 May 2026 20:32:20 -0500 Subject: [PATCH] Add catalog sale purchase summary endpoint - Add CatalogSaleSummarySerializer and CatalogSummarySaleLineSerializer - Add CatalogSaleSummary API view for GET requests - Register endpoint at /don_confiao/resumen_compra_catalogo_json/ - Add comprehensive test for catalog sale summary - Include nested customer and product details in response - Endpoint returns id, date, customer, and lines with products --- tienda_ilusion/don_confiao/api/__init__.py | 2 + tienda_ilusion/don_confiao/api/sales.py | 8 ++++ .../don_confiao/serializers/__init__.py | 4 ++ .../don_confiao/serializers/sales.py | 17 ++++++++ tienda_ilusion/don_confiao/tests/test_api.py | 43 +++++++++++++++++++ tienda_ilusion/don_confiao/urls.py | 6 +++ 6 files changed, 80 insertions(+) diff --git a/tienda_ilusion/don_confiao/api/__init__.py b/tienda_ilusion/don_confiao/api/__init__.py index 18c0308..dc71190 100644 --- a/tienda_ilusion/don_confiao/api/__init__.py +++ b/tienda_ilusion/don_confiao/api/__init__.py @@ -4,6 +4,7 @@ from .sales import ( SaleView, CatalogSaleView, SaleSummary, + CatalogSaleSummary, SalesForTrytonView, SalesToTrytonView, ) @@ -27,6 +28,7 @@ __all__ = [ "SaleView", "CatalogSaleView", "SaleSummary", + "CatalogSaleSummary", "SalesForTrytonView", "SalesToTrytonView", # Payments diff --git a/tienda_ilusion/don_confiao/api/sales.py b/tienda_ilusion/don_confiao/api/sales.py index e51db95..fc0400e 100644 --- a/tienda_ilusion/don_confiao/api/sales.py +++ b/tienda_ilusion/don_confiao/api/sales.py @@ -12,6 +12,7 @@ from ..serializers import ( SaleSerializer, CatalogSaleSerializer, SaleSummarySerializer, + CatalogSaleSummarySerializer, ) from ..permissions import IsAdministrator from ..services.tryton.sales import SaleTrytonService @@ -66,6 +67,13 @@ class SaleSummary(APIView): return Response(serializer.data) +class CatalogSaleSummary(APIView): + def get(self, request, id): + catalog_sale = CatalogSale.objects.get(pk=id) + serializer = CatalogSaleSummarySerializer(catalog_sale) + return Response(serializer.data) + + class SalesForTrytonView(APIView): permission_classes = [IsAuthenticated, IsAdministrator] diff --git a/tienda_ilusion/don_confiao/serializers/__init__.py b/tienda_ilusion/don_confiao/serializers/__init__.py index cc3ba6e..6edf74f 100644 --- a/tienda_ilusion/don_confiao/serializers/__init__.py +++ b/tienda_ilusion/don_confiao/serializers/__init__.py @@ -7,6 +7,8 @@ from .sales import ( CatalogSaleLineSerializer, SummarySaleLineSerializer, SaleSummarySerializer, + CatalogSummarySaleLineSerializer, + CatalogSaleSummarySerializer, SaleForRenconciliationSerializer, ) from .payments import ( @@ -28,6 +30,8 @@ __all__ = [ "CatalogSaleLineSerializer", "SummarySaleLineSerializer", "SaleSummarySerializer", + "CatalogSummarySaleLineSerializer", + "CatalogSaleSummarySerializer", "SaleForRenconciliationSerializer", # Payments "ReconciliationJarSerializer", diff --git a/tienda_ilusion/don_confiao/serializers/sales.py b/tienda_ilusion/don_confiao/serializers/sales.py index f3ca25b..7d66f0f 100644 --- a/tienda_ilusion/don_confiao/serializers/sales.py +++ b/tienda_ilusion/don_confiao/serializers/sales.py @@ -87,6 +87,23 @@ class SaleSummarySerializer(serializers.ModelSerializer): fields = ["id", "date", "customer", "payment_method", "lines"] +class CatalogSummarySaleLineSerializer(serializers.ModelSerializer): + product = ListProductSerializer() + + class Meta: + model = CatalogSaleLine + fields = ["product", "quantity", "unit_price", "description"] + + +class CatalogSaleSummarySerializer(serializers.ModelSerializer): + customer = ListCustomerSerializer() + lines = CatalogSummarySaleLineSerializer(many=True, source="catalogsaleline_set") + + class Meta: + model = CatalogSale + fields = ["id", "date", "customer", "lines"] + + class SaleForRenconciliationSerializer(serializers.Serializer): id = serializers.IntegerField() date = serializers.DateTimeField() diff --git a/tienda_ilusion/don_confiao/tests/test_api.py b/tienda_ilusion/don_confiao/tests/test_api.py index a49815d..1aba605 100644 --- a/tienda_ilusion/don_confiao/tests/test_api.py +++ b/tienda_ilusion/don_confiao/tests/test_api.py @@ -86,6 +86,49 @@ class TestAPI(APITestCase, LoginMixin): self.assertIn("csv", json_response) self.assertGreater(len(json_response["csv"]), 0) + def test_catalog_sale_summary(self): + # Create a catalog sale + response = self._create_catalog_sale() + content = json.loads(response.content.decode("utf-8")) + catalog_sale_id = content["id"] + + # Get the summary + url = f"/don_confiao/resumen_compra_catalogo_json/{catalog_sale_id}" + response = self.client.get(url) + + # Verify response + self.assertEqual(response.status_code, status.HTTP_200_OK) + json_response = json.loads(response.content.decode("utf-8")) + + # Verify structure + self.assertIn("id", json_response) + self.assertIn("date", json_response) + self.assertIn("customer", json_response) + self.assertIn("lines", json_response) + + # Verify customer details + self.assertEqual(json_response["customer"]["id"], self.customer.id) + self.assertEqual(json_response["customer"]["name"], self.customer.name) + + # Verify lines + self.assertEqual(len(json_response["lines"]), 2) + + # Verify first line + line1 = json_response["lines"][0] + self.assertIn("product", line1) + self.assertIn("quantity", line1) + self.assertIn("unit_price", line1) + self.assertEqual(line1["product"]["id"], self.product.id) + self.assertEqual(line1["product"]["name"], self.product.name) + self.assertEqual(line1["quantity"], "2.00") + self.assertEqual(line1["unit_price"], "3000.00") + + # Verify second line + line2 = json_response["lines"][1] + self.assertEqual(line2["product"]["id"], self.product.id) + self.assertEqual(line2["quantity"], "3.00") + self.assertEqual(line2["unit_price"], "5000.00") + def test_csv_structure_in_sales_for_tryton(self): url = "/don_confiao/api/sales/for_tryton" self._create_sale() diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index 2406bc8..96e831d 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -13,6 +13,7 @@ from .api import ( SaleView, CatalogSaleView, SaleSummary, + CatalogSaleSummary, SalesForTrytonView, SalesToTrytonView, # Payments @@ -44,6 +45,11 @@ urlpatterns = [ SaleSummary.as_view(), name="purchase_json_summary", ), + path( + "resumen_compra_catalogo_json/", + CatalogSaleSummary.as_view(), + name="catalog_purchase_json_summary", + ), path( "payment_methods/all/select_format", PaymentMethodView.as_view(),