From e22344b30832d3f813f2fd850550f50e3638e60c Mon Sep 17 00:00:00 2001 From: colaftc Date: Tue, 2 Dec 2025 12:02:40 +0800 Subject: [PATCH] feat: added product info to statements api --- .../views/business/statements/serializers.py | 1 + api_v1/views/business/statements/views.py | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/api_v1/views/business/statements/serializers.py b/api_v1/views/business/statements/serializers.py index 1bacc99..a9d4c96 100644 --- a/api_v1/views/business/statements/serializers.py +++ b/api_v1/views/business/statements/serializers.py @@ -16,6 +16,7 @@ class StatementRecordSerializer(serializers.Serializer): cumulative_amount = serializers.CharField() current_balance = serializers.CharField() arrears_amount = serializers.CharField() + items = serializers.ListField(child=serializers.DictField()) extra = serializers.DictField(required=False) diff --git a/api_v1/views/business/statements/views.py b/api_v1/views/business/statements/views.py index da125ef..d8c4fc3 100644 --- a/api_v1/views/business/statements/views.py +++ b/api_v1/views/business/statements/views.py @@ -63,8 +63,11 @@ class StatementViewBase(StockChangeViewMixin, views.APIView): status_label: str, positive_amount, negative_amount, + items: List[dict] | None = None, extra: dict | None = None, ) -> dict: + items = items or [] + print(items) record = { 'counterparty': counterparty_id, 'counterparty_name': counterparty_name, @@ -77,6 +80,7 @@ class StatementViewBase(StockChangeViewMixin, views.APIView): 'status_label': status_label, 'positive_amount': self._normalize_amount(positive_amount), 'negative_amount': self._normalize_amount(negative_amount), + 'items': items, } if extra: record['extra'] = extra @@ -160,9 +164,21 @@ class CustomerStatementView(StatementViewBase): status=business_models.SalesOrderStatusEnum.APPROVED, ) .select_related('customer') + .prefetch_related('items__product') ) records = [] for order in qs: + items = [ + { + 'product_id': item.product_id, + 'product_name': item.product.name, + 'quantity': item.quantity, + 'price': item.price, + 'unit': item.unit, + } + for item in order.items.all() + ] + print(items) records.append( self._build_record( counterparty_id=order.customer_id, @@ -176,6 +192,7 @@ class CustomerStatementView(StatementViewBase): status_label=order.get_status_display(), positive_amount=order.get_total_amount(), negative_amount=ZERO, + items=items, ) ) return records @@ -188,9 +205,20 @@ class CustomerStatementView(StatementViewBase): status=business_models.SalesReturnStatusEnum.APPROVED, ) .select_related('customer') + .prefetch_related('items__product') ) records = [] for order in qs: + items = [ + { + 'product_id': item.product_id, + 'product_name': item.product.name, + 'quantity': item.quantity, + 'price': item.price, + 'unit': item.unit, + } + for item in order.items.all() + ] records.append( self._build_record( counterparty_id=order.customer_id, @@ -204,6 +232,7 @@ class CustomerStatementView(StatementViewBase): status_label=order.get_status_display(), positive_amount=ZERO, negative_amount=order.get_total_amount(), + items=items, ) ) return records @@ -283,6 +312,16 @@ class SupplierStatementView(StatementViewBase): ) records = [] for order in qs: + items = [ + { + 'product_id': item.product_id, + 'product_name': item.product.name, + 'quantity': item.quantity, + 'price': item.price, + 'unit': item.unit, + } + for item in order.items.all() + ] records.append( self._build_record( counterparty_id=order.supplier_id, @@ -296,6 +335,7 @@ class SupplierStatementView(StatementViewBase): status_label=order.get_status_display(), positive_amount=order.get_total_amount(), negative_amount=ZERO, + items=items, ) ) return records @@ -311,6 +351,16 @@ class SupplierStatementView(StatementViewBase): ) records = [] for order in qs: + items = [ + { + 'product_id': item.product_id, + 'product_name': item.product.name, + 'quantity': item.quantity, + 'price': item.price, + 'unit': item.unit, + } + for item in order.items.all() + ] records.append( self._build_record( counterparty_id=order.supplier_id, @@ -324,6 +374,7 @@ class SupplierStatementView(StatementViewBase): status_label=order.get_status_display(), positive_amount=ZERO, negative_amount=order.get_total_amount(), + items=items, ) ) return records