import - inventory dashboard / incentive plan search
This commit is contained in:
@@ -399,7 +399,7 @@ class IncentivePlanViewSet(SoftDeleteMixin, viewsets.ModelViewSet, DynamicSearch
|
|||||||
queryset = product_models.IncentivePlan.objects.all()
|
queryset = product_models.IncentivePlan.objects.all()
|
||||||
serializer_class = product_serializers.IncentivePlanSerializer
|
serializer_class = product_serializers.IncentivePlanSerializer
|
||||||
filter_backends = [filters.SearchFilter]
|
filter_backends = [filters.SearchFilter]
|
||||||
search_fields = ['plan_type', 'name']
|
search_fields = ['plan_type', 'name', 'group']
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
@@ -443,7 +443,9 @@ class IncentivePlanViewSet(SoftDeleteMixin, viewsets.ModelViewSet, DynamicSearch
|
|||||||
Q(is_time_unlimited=False) |
|
Q(is_time_unlimited=False) |
|
||||||
Q(start_date_limit__lte=today, end_date_limit__gte=today)
|
Q(start_date_limit__lte=today, end_date_limit__gte=today)
|
||||||
)
|
)
|
||||||
page = self.paginate_queryset(incentive_plans)
|
|
||||||
|
queryset = self.filter_queryset(incentive_plans)
|
||||||
|
page = self.paginate_queryset(queryset)
|
||||||
if page is not None:
|
if page is not None:
|
||||||
serializer = self.get_serializer(page, many=True)
|
serializer = self.get_serializer(page, many=True)
|
||||||
return self.get_paginated_response(serializer.data)
|
return self.get_paginated_response(serializer.data)
|
||||||
|
|||||||
@@ -523,6 +523,13 @@ class QuotaViewSet(BaseViewSet, SoftDeleteMixin, QuotaDashboardService, viewsets
|
|||||||
""" list of organization active quotas that have inventory entries """
|
""" list of organization active quotas that have inventory entries """
|
||||||
|
|
||||||
org = get_organization_by_user(request.user)
|
org = get_organization_by_user(request.user)
|
||||||
|
query_param = self.request.query_params # noqa
|
||||||
|
base_query = {}
|
||||||
|
|
||||||
|
# filter by product
|
||||||
|
product_id = query_param.get('product_id') if 'product_id' in query_param.keys() else None
|
||||||
|
if product_id:
|
||||||
|
base_query['product_id'] = product_id
|
||||||
|
|
||||||
queryset = self.filter_query(
|
queryset = self.filter_query(
|
||||||
self.get_queryset(visibility_by_org_scope=True).filter(
|
self.get_queryset(visibility_by_org_scope=True).filter(
|
||||||
@@ -534,6 +541,7 @@ class QuotaViewSet(BaseViewSet, SoftDeleteMixin, QuotaDashboardService, viewsets
|
|||||||
Q(assigned_organizations=org) |
|
Q(assigned_organizations=org) |
|
||||||
Q(registerer_organization=org),
|
Q(registerer_organization=org),
|
||||||
org_quota_stats__inventory_received__gt=0,
|
org_quota_stats__inventory_received__gt=0,
|
||||||
|
**base_query
|
||||||
).order_by('-modify_date').distinct()
|
).order_by('-modify_date').distinct()
|
||||||
)
|
)
|
||||||
if page is not None: # noqa
|
if page is not None: # noqa
|
||||||
|
|||||||
51
apps/warehouse/services/inventory_entry_dashboard_service.py
Normal file
51
apps/warehouse/services/inventory_entry_dashboard_service.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
from django.db.models import Count, Sum
|
||||||
|
from django.db.models.functions import Coalesce
|
||||||
|
|
||||||
|
from apps.authentication.models import Organization
|
||||||
|
from apps.authentication.services.service import get_all_org_child
|
||||||
|
from apps.core.services.filter.search import DynamicSearchService
|
||||||
|
from apps.warehouse.models import InventoryEntry
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryEntryDashboardService:
|
||||||
|
"""
|
||||||
|
Inventory Entry Dashboard Services
|
||||||
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_dashboard(
|
||||||
|
org: Organization,
|
||||||
|
start_date: str = None,
|
||||||
|
end_date: str = None,
|
||||||
|
search_fields: list[str] = None,
|
||||||
|
query_string: str = None
|
||||||
|
):
|
||||||
|
""" dashboard of inventory entry page """
|
||||||
|
|
||||||
|
child_orgs = get_all_org_child(org)
|
||||||
|
child_orgs.append(org)
|
||||||
|
|
||||||
|
if org.type.key == 'ADM':
|
||||||
|
inventory_entries = InventoryEntry.objects.filter(quota__is_closed=False)
|
||||||
|
else:
|
||||||
|
inventory_entries = InventoryEntry.objects.filter(
|
||||||
|
quota__is_closed=False,
|
||||||
|
organization__in=child_orgs
|
||||||
|
)
|
||||||
|
|
||||||
|
if (start_date and end_date) or query_string:
|
||||||
|
inventory_entries = DynamicSearchService(
|
||||||
|
queryset=inventory_entries,
|
||||||
|
start=start_date,
|
||||||
|
end=end_date,
|
||||||
|
search_fields=search_fields,
|
||||||
|
date_field="create_date",
|
||||||
|
query_string=query_string
|
||||||
|
).apply()
|
||||||
|
|
||||||
|
dashboard = inventory_entries.aggregate(
|
||||||
|
total_entries=Count("id"),
|
||||||
|
total_weight=Coalesce(Sum("weight"), 0),
|
||||||
|
)
|
||||||
|
|
||||||
|
return dashboard
|
||||||
@@ -10,6 +10,7 @@ from apps.core.api import BaseViewSet
|
|||||||
from apps.core.mixins.search_mixin import DynamicSearchMixin
|
from apps.core.mixins.search_mixin import DynamicSearchMixin
|
||||||
from apps.core.mixins.soft_delete_mixin import SoftDeleteMixin
|
from apps.core.mixins.soft_delete_mixin import SoftDeleteMixin
|
||||||
from apps.warehouse import models as warehouse_models
|
from apps.warehouse import models as warehouse_models
|
||||||
|
from apps.warehouse.services.inventory_entry_dashboard_service import InventoryEntryDashboardService
|
||||||
from apps.warehouse.services.transaction_dashboard_service import TransactionDashboardService
|
from apps.warehouse.services.transaction_dashboard_service import TransactionDashboardService
|
||||||
from apps.warehouse.web.api.v1 import serializers as warehouse_serializers
|
from apps.warehouse.web.api.v1 import serializers as warehouse_serializers
|
||||||
from common.generics import base64_to_image_file
|
from common.generics import base64_to_image_file
|
||||||
@@ -17,7 +18,13 @@ from common.helpers import get_organization_by_user
|
|||||||
from common.liara_tools import upload_to_liara
|
from common.liara_tools import upload_to_liara
|
||||||
|
|
||||||
|
|
||||||
class InventoryEntryViewSet(BaseViewSet, SoftDeleteMixin, viewsets.ModelViewSet, DynamicSearchMixin):
|
class InventoryEntryViewSet(
|
||||||
|
BaseViewSet,
|
||||||
|
SoftDeleteMixin,
|
||||||
|
viewsets.ModelViewSet,
|
||||||
|
DynamicSearchMixin,
|
||||||
|
InventoryEntryDashboardService
|
||||||
|
):
|
||||||
queryset = warehouse_models.InventoryEntry.objects.all()
|
queryset = warehouse_models.InventoryEntry.objects.all()
|
||||||
serializer_class = warehouse_serializers.InventoryEntrySerializer
|
serializer_class = warehouse_serializers.InventoryEntrySerializer
|
||||||
# filter_backends = [filters.SearchFilter]
|
# filter_backends = [filters.SearchFilter]
|
||||||
@@ -108,6 +115,34 @@ class InventoryEntryViewSet(BaseViewSet, SoftDeleteMixin, viewsets.ModelViewSet,
|
|||||||
self.upload_confirmation_document(request, inventory=pk)
|
self.upload_confirmation_document(request, inventory=pk)
|
||||||
return Response(status=status.HTTP_200_OK)
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['get'],
|
||||||
|
detail=False,
|
||||||
|
url_path='inventory_dashboard',
|
||||||
|
url_name='inventory_dashboard',
|
||||||
|
name='inventory_dashboard'
|
||||||
|
)
|
||||||
|
def inventory_dashboard(self, request):
|
||||||
|
""" inventory entry dashboard """
|
||||||
|
|
||||||
|
org = get_organization_by_user(request.user)
|
||||||
|
query_param = self.request.query_params # noqa
|
||||||
|
|
||||||
|
# filter by date
|
||||||
|
start_date = query_param.get('start') if 'start' in query_param.keys() else None
|
||||||
|
end_date = query_param.get('end') if 'end' in query_param.keys() else None
|
||||||
|
query_string = query_param.get('search') if 'search' in query_param.keys() else None
|
||||||
|
|
||||||
|
return Response(
|
||||||
|
self.get_dashboard(
|
||||||
|
org=org,
|
||||||
|
start_date=start_date,
|
||||||
|
end_date=end_date,
|
||||||
|
query_string=query_string,
|
||||||
|
search_fields=self.search_fields,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
@action(
|
@action(
|
||||||
methods=['get'],
|
methods=['get'],
|
||||||
detail=True,
|
detail=True,
|
||||||
|
|||||||
Reference in New Issue
Block a user