import datetime from django.db.models import Prefetch, Q, Sum, F from django.http import QueryDict from django_filters.rest_framework import DjangoFilterBackend from rest_framework import viewsets from oauth2_provider.contrib.rest_framework import ( TokenHasReadWriteScope, ) from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import AllowAny from ticket.helper import send_image_to_server from authentication.helper.refresh import refresh from authentication.models import SystemUserProfile from panel.KillHouse.helpers import get_difference_carcasses_percent from panel.ReportingPanel.filterset import ProfileFilterSet, ManagementVetFarmFilterSet, PoultryFilterSet from panel.VetFarm.serializers import VetFarmSerializer, VetFarmInspectionSerializer, ManagementVetFarmSerializer, \ PoultryForCityVetSerializer, VetForSubSectorSerializer, VetForSubSectorTransactionSerializer from rest_framework.response import Response from rest_framework import status import string import random import os ARVAN_Vet_Farm_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' # ARVAN_Vet_Farm_URL = 'https://vet-farm.s3.ir-thr-at1.arvanstorage.ir/' from panel.models import VetFarm, Poultry, PoultryHatching, Vet, VetFarmInspection, PoultryRequest, KillHouseRequest, \ PercentageOfWageType, WageType, KillHouse, SubSectorTransactions, BarDifferenceRequest # ویوست مربوط به ثبت و نمایش و ... دامپزشک فارم class VetFarmViewSet(viewsets.ModelViewSet): queryset = VetFarm.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = VetFarmSerializer def create(self, request, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) if 'vet_key' in request.data.keys(): vet = Vet.objects.get(key=request.data['vet_key']) request.data.pop('vet_key') else: vet = Vet.objects.get(user=user) poultry = Poultry.objects.get(key=request.data['poultry_key']) request.data.pop('poultry_key') halls = request.data['halls'] request.data.pop('halls') # vet_farm = VetFarm.objects.filter(poultry=poultry, hall=int(request.data['hall'])) # if vet_farm.count() > 0: # vet_farm = vet_farm.last() # if vet_farm.vet.id == vet.id: # return Response({"result": "object exist"}, status=status.HTTP_403_FORBIDDEN) # else: # pass for hall in halls: vet_farm = VetFarm( vet=vet, poultry=poultry, hall=int(hall), ) vet_farm.save() return Response({"result": "created"}, status=status.HTTP_201_CREATED) # serializer = self.serializer_class(data=request.data) # if serializer.is_valid(): # vetfarm = serializer.create(validated_data=request.data) # vetfarm.vet = vet # vetfarm.poultry = poultry # vetfarm.save() # return Response(serializer.data, status=status.HTTP_201_CREATED) # return Response(serializer.errors) # تابع مربوط به نمایش دوره جوجه ریزی مرغدار def list(self, request, *args, **kwargs): # refresh(request.user.id) # list of self poultry houses user = SystemUserProfile.objects.get(user=request.user) vet = Vet.objects.get(user=user) vet_farm = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry', 'vet') serializer = VetFarmSerializer(vet_farm, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) try: vet_farm = VetFarm.objects.get(key=request.GET["vet_farm_key"]) # if VetFarmInspection.objects.filter(vet_farm=vet_farm).exists(): # return Response({"result": "object can not delete"}, status=status.HTTP_403_FORBIDDEN) vet_farm.trash = True vet_farm.save() return Response({"result": "object deleted"}, status=status.HTTP_200_OK) except: return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_403_FORBIDDEN) class TotalVetSubSectorWageDashboardViewSet(viewsets.ModelViewSet): queryset = Vet.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = VetForSubSectorSerializer def list(self, request, *args, **kwargs): total_quantity = 0 total_weight = 0 total_wage = 0 total_wage_type = WageType.objects.filter(trash=False) province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province', trash=False).first().amount percentages_wage_type = PercentageOfWageType.objects.filter(trash=False) other_province_kill_request_percent = percentages_wage_type.filter( wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100 other_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell', share_type__en_name='other').first().percent / 100 other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province', share_type__en_name='other').first().percent / 100 other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id') if 'date1' in request.GET: date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), out=True, out_province_request_cancel=False, temporary_trash=False, wage_pay=True, has_wage=True, temporary_deleted=False, vet_farm__isnull=False, send_date__date__gte=date1, send_date__date__lte=date2 ) kill_house_requests = KillHouseRequest.objects.filter( Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q( Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q( Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False, province_request__poultry_request__vet_farm__isnull=False, # clearance_code__isnull=False, clearance_code__isnull=False, trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2 ) vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False, date__date__gte=date1, date__date__lte=date2) difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, state='accepted',acceptor_date__date__gte=date1, acceptor_date__date__lte=date2) else: poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), out=True, out_province_request_cancel=False, temporary_trash=False, wage_pay=True, has_wage=True, temporary_deleted=False, vet_farm__isnull=False, ) kill_house_requests = KillHouseRequest.objects.filter( Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q( Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q( Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False, province_request__poultry_request__vet_farm__isnull=False, # clearance_code__isnull=False, clearance_code__isnull=False, trash=False, calculate_status=True ) difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, state='accepted') vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet__isnull=False) # quarantine_code__isnull=False) out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ 'total'] or 0 province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[ 'total'] or 0 province_live_weight += \ difference_requests.aggregate(total=Sum('weight'))['total'] or 0 total_quantity += province_live_quantity + out_province_poultry_request_quantity total_weight += province_live_weight + out_province_poultry_request_weight province_carcasses_weight = province_live_weight * 0.75 if 'date1' in request.GET: internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent(date1,date2) else: internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent() external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0 total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount total_remain_wage = total_wage - vet_deposit_amount result = { "total_quantity": total_quantity, "total_weight": total_weight, "out_province_poultry_request_quantity": out_province_poultry_request_quantity, "out_province_poultry_request_weight": out_province_poultry_request_weight, "province_live_quantity": province_live_quantity, "province_live_weight": province_live_weight, "province_carcasses_weight": province_carcasses_weight, "internal_pure_province_carcasses_weight": internal_pure_province_carcasses_weight, "external_pure_province_carcasses_weight": external_pure_province_carcasses_weight, "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount, "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount, "out_province_poultry_request_amount": out_province_poultry_request_amount, "total_wage": total_wage, "number_of_deposit": len(vet_deposit), "vet_deposit_amount": vet_deposit_amount, "total_remain_wage": total_remain_wage, } return Response(result, status=status.HTTP_200_OK) class VetForSubSectorViewSet(viewsets.ModelViewSet): queryset = Vet.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = VetForSubSectorSerializer # تابع مربوط به نمایش دوره جوجه ریزی مرغدار def list(self, request, *args, **kwargs): vet = Vet.objects.filter(pk__in=VetFarm.objects.all().values_list('vet', flat=True), trash=False).order_by('id') serializer = self.serializer_class(vet, many=True,context={'request':request}) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) try: vet_farm = VetFarm.objects.get(key=request.GET["vet_farm_key"]) # if VetFarmInspection.objects.filter(vet_farm=vet_farm).exists(): # return Response({"result": "object can not delete"}, status=status.HTTP_403_FORBIDDEN) vet_farm.trash = True vet_farm.save() return Response({"result": "object deleted"}, status=status.HTTP_200_OK) except: return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_403_FORBIDDEN) class VetForSubSectorTransactionViewSet(viewsets.ModelViewSet): queryset = Vet.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = VetForSubSectorTransactionSerializer def list(self, request, *args, **kwargs): vet = Vet.objects.filter(pk__in=VetFarm.objects.all().values_list('vet', flat=True), trash=False).order_by('id') serializer = self.serializer_class(vet, many=True) return Response(serializer.data, status=status.HTTP_200_OK) # ویوست مربوط به ثبت و نمایش و ... دامپزشک فارم class VetFarmInspectionViewSet(viewsets.ModelViewSet): queryset = VetFarmInspection.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = VetFarmInspectionSerializer def create(self, request, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) vet = Vet.objects.get(user=user) image_list = [] vet_farm = VetFarm.objects.get(key=request.data['key']) request.data.pop('key') try: poultry_hatching = PoultryHatching.objects.get(key=request.data['poultry_hatching_key']) request.data.pop('poultry_hatching_key') except: poultry_hatching = None try: images = request.data['image'] request.data.pop('image') except: images = None if poultry_hatching != None: if PoultryRequest.objects.filter(hatching=poultry_hatching, hatching__left_over=0, hatching__allow_hatching='pending', hatching__state='pending').exists(): return Response({"result": "باقی مانده موجود در سالن صفر میباشد."}, status=status.HTTP_406_NOT_ACCEPTABLE) today = datetime.datetime.now().date() inspections = VetFarmInspection.objects.filter(vet_farm__vet=vet, state='pending', create_date__year=today.year, create_date__month=today.month, create_date__day=today.day) if inspections.count() > 0: inspection = inspections.last() if poultry_hatching != None: if inspection.poultry_hatching.poultry.id != poultry_hatching.poultry.id: return Response({"result": "can not register"}, status=status.HTTP_403_FORBIDDEN) elif inspection.poultry_hatching.poultry.id == poultry_hatching.poultry.id and inspection.poultry_hatching.hall == int( request.data['hall']): return Response({"result": "can not register"}, status=status.HTTP_400_BAD_REQUEST) elif poultry_hatching == None: if inspection.vet_farm.poultry != vet_farm.poultry: return Response({"result": "can not register"}, status=status.HTTP_403_FORBIDDEN) elif inspection.vet_farm.hall == int(request.data['hall']): return Response({"result": "can not register"}, status=status.HTTP_400_BAD_REQUEST) # # else: # for inspect in inspections: # if inspect.hall == int(request.data['hall']): # return Response({"result": "can not register"}, status=status.HTTP_403_FORBIDDEN) # else: # pass serializer = self.serializer_class(data=request.data) if serializer.is_valid(): vet_farm_inspection = serializer.create(validated_data=request.data) vet_farm_inspection.vet_farm = vet_farm if images != None: for image in images: image_list.append(send_image_to_server(image)) vet_farm_inspection.image = image_list if poultry_hatching != None: if int(vet_farm_inspection.Losses) > 0: vet_farm.vetfarm_losses += int(vet_farm_inspection.Losses) vet_farm.save() if poultry_hatching.losses != 0: poultry_hatching.losses = poultry_hatching.losses + int(vet_farm_inspection.Losses) poultry_hatching.left_over = poultry_hatching.left_over - int(vet_farm_inspection.Losses) else: poultry_hatching.losses = vet_farm_inspection.Losses poultry_hatching.left_over = poultry_hatching.quantity - int(vet_farm_inspection.Losses) poultry_hatching.save() vet_farm_inspection.poultry_hatching = poultry_hatching vet_farm_inspection.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) def list(self, request, *args, **kwargs): # refresh(request.user.id) if 'key' in request.GET: vet_farm_inspection = VetFarmInspection.objects.filter(vet_farm__key=request.GET['key']) serializer = VetFarmInspectionSerializer(vet_farm_inspection, many=True) elif 'poultry_key' in request.GET: if 'hall' in request.GET: vet_farm_inspection = VetFarmInspection.objects.filter( vet_farm__poultry__key=request.GET['poultry_key'], hall=int(request.GET['hall'])) if vet_farm_inspection.count() == 0: vet_farm_inspection = [] serializer = VetFarmInspectionSerializer(vet_farm_inspection, many=True) else: user = SystemUserProfile.objects.get(user=request.user) vet = Vet.objects.get(userprofile=user) vet_farm_inspection = VetFarmInspection.objects.filter(vet_farm__vet=vet) serializer = VetFarmInspectionSerializer(vet_farm_inspection, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class CustomPagination(PageNumberPagination): page_size = 10 class ManagementVetFarmViewSet(viewsets.ModelViewSet): queryset = VetFarm.objects.all() permission_classes = [AllowAny] serializer_class = ManagementVetFarmSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ManagementVetFarmFilterSet poultry_filterset_class = PoultryFilterSet filterset_fields = [ 'poultry__user__mobile', 'poultry__unit_name', 'poultry__address__city__name', ] poultry_filterset_fields = [ 'user__mobile', 'unit_name', 'address__city__name', ] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user) if request.GET['role'] == 'VetFarm': vet = Vet.objects.get(user=user) vet_farm = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry', 'vet') vet_farm_list = [] if 'search' in request.GET: if request.GET['search'] == 'filter': if request.GET['value'] != "" and request.GET['value'] != 'undefined': for item in self.filterset_fields: query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) if (self.filterset_class( data=query, queryset=vet_farm ) ).filter(): ps = self.filterset_class(data=query, queryset=vet_farm) vet_farm_list = ps.filter() vet_farm = [] if len(vet_farm_list) == 0 else vet_farm_list page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(vet_farm) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = ManagementVetFarmSerializer(vet_farm, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: poultries = Poultry.objects.filter( pk__in=PoultryHatching.objects.filter(trash=False, allow_hatching='pending', state='pending', archive=False).values_list('poultry__id', flat=True), address__city=user.city) poultries_list = [] if 'search' in request.GET: if request.GET['search'] == 'filter': if request.GET['value'] != "" and request.GET['value'] != 'undefined': for item in self.poultry_filterset_fields: query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) if (self.poultry_filterset_class( data=query, queryset=poultries ) ).filter(): ps = self.filterset_class(data=query, queryset=poultries) poultries_list = ps.filter() poultries = [] if len(poultries_list) == 0 else poultries_list page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(poultries) if page is not None: serializer = PoultryForCityVetSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryForCityVetSerializer(poultries, many=True) return Response(serializer.data, status=status.HTTP_200_OK)