import math import threading from io import BytesIO from typing import List, Dict import openpyxl import requests from django.contrib.auth.models import Group from django.db.models import Q, Prefetch, Min, Max, Avg, Case, When, IntegerField, ExpressionWrapper, FloatField from rest_framework.generics import GenericAPIView from rest_framework.views import APIView from authentication.sahandsms.sms import kill_house_price from general_urls import base_url_for_sms_report from panel.ReportingPanel.views import ( get_gid_poultry_request, get_gid_poultry_request_quarantine_code, ) from panel.admin import PROJECT_API_KEY from panel.helper import build_query from panel.helper_excel import percent_of_losses from panel.poultry.helpers import poultry_prediction_helper, calculate_hatching_increase, \ create_update_chicken_commission_prices, market_daily_limitation_info from ticket.bucket import upload_to_liara, delete_file_from_liara ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/" ARTA_URL_CHANGE_MOBILE_NUMBER = "https://userbackend.rasadyar.com/change_mobile_number/" from authentication.models import User, Province import random import string from datetime import datetime, timedelta from django.http import QueryDict from django.views.decorators.csrf import csrf_exempt from django_filters.rest_framework import DjangoFilterBackend from num2fawords import words from oauth2_provider.contrib.rest_framework import ( TokenHasReadWriteScope, ) from django.utils import timezone from django.db.models import F from rest_framework import status from rest_framework import viewsets from rest_framework.decorators import permission_classes, api_view from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination from ticket.helper import send_image_to_server from authentication.models import UserProfile, UserMessage, SystemUserProfile, CityUnit, City from authentication.serializer.serializer import SystemUserProfileSerializer from django.db.models import Sum from authentication.sms_management import operator_hatching_sms, operator_poultry_request_sms, \ operator_out_poultry_request_sms, sms_chain_company_for_ver_farm, \ confirm_price_poultry_request_sms, send_sms_for_poultry_market from panel.KillHouse.serializers import PoultryRequestExchangeAcceptSerializer, ProvinceKillRequestSerializer, \ KillHouseRequestSerializer, KillHouseRequestForBarManagementSerializer, \ PoultryRequestLetterTotalSerializer, \ PoultryRequestoutProvinceSerializer, KillHouseRequestForHatchingDetailSerializer, \ ReturnProvinceKillRequestSerializer, BarDifferenceRequestSerializer from panel.convert_date import * from panel.filterset import PoultryRequestExchangeFilterSet, PoultryFilterSet, PoultryHatchingFilterSet, \ PoultryRequestFilterSet, ChainAllocationFilterSet, ChainCompanyFilterSet, OutProvincePoultryRequestBuyerFilterSet, \ DashboardPoultryRequestFilterSet, PoultryManageFilterSet, HatchingIncreaseRequestFilterSet, \ PoultryRequestDirectBuyingFilterSet, EvacuationHatchingDetailFilterSet from panel.models import ( PoultryRequest, PoultryAssignmentInformation, KillHouseRequest, CityOperatorCheckRequest, ProvinceCheckOperatorRequest, DepositAllocation, PovinceInspector, KillHouseAssignmentInformation, KillHouseFactorToProvince, ProvinceFactorToKillHouse, VetCheckRequest, PoultryRequestExchange, PoultryRequestExchangeAccept, KillHouseRequestExchangeReserve, KillHouseCheckRequest, ProvinceKillRequest, PoultryHatching, Poultry, PoultryTenant, CityOperator, PoultryRequestAuction, Pricing, KillHouseRequestAction, KillHouseRequestActionWinner, ProvinceRequestAction, VetFarmInspection, InspectorOperator, ProvinceOperator, KillHouseOperator, KillHouse, Vet, KillHouseVet, VetFarm, ShareOfAllocation, ProvinceFactorToKillHouseForPoultry, KillHouseFactorToPoultry, KillHouseComplaint, KillHouseDriver, KillRequest, CheckUnusualCasualties, PercentageOfLosses, ProvinceImportKillHouseOutFactors, TotalPoultryRequestQuantity, HourLimit, KillHousePercentage, SmsLicense, ProvinceAllowPoultryChooseKillHouse, ProvinceAllowPoultrySellFree, LastUpdate, FreeSaleWithinprovince, OperationLimitation, ChickenAgeRange, TimeRange, ChainCompany, Wallet, ChainAllocation, WageType, PercentageOfWageType, ChainCompanyTransaction, InternalTransaction, OutProvincePoultryRequestBuyer, PoultryOutProvinceRequest, PoultryPrediction, PriceConfirmation, HatchingIncreaseRequest, ChickenCommissionPrices, PoultryRequestQuarantineCode, FinePermission, ShowMarketRequest, ManagementHatchingAgeRange, IndexWeightCategory, PoultryScience, BarDifferenceRequest, EvacuationHatchingDetail, MarketDailyLimitation, HatchingArchivePercent ) from panel.poultry.serializers import ( PoultryRequestSerializer, PoultryAssignmentInformationSerializer, PoultryRequestExchangeSerializer, PoultryHatchingSerializer, PoultrySerializer, PoultryTenantSerializer, TotalPoultryRequestQuantitySerializer, PoultryForPoultryHatchingSerializer, TotalPoultrySerializer, LastUpdateSerializer, PoultryRequestForKillingInformationSerializer, PoultryForPoultryHatchingForKillInformationSerializer, ChainCompanySerializer, ChainAllocationSerializer, ChainCompanyTransactionSerializer, ChainCompanyForTotalWageAllocationWithDAteSerializer, ChainCompanyForTotalWageAllocationSerializer, ChainAllocationForWageSerializer, ChainCompanyForTotalWageTransactionSerializer, ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer, OutProvincePoultryRequestBuyerSerializer, OutProvincePoultryRequestBuyerForBuyerRequestSerializer, ChainCompanyForCompanyRequestSerializer, PoultryLocationSerializer, GetAllPoultrySerializer, PoultryHatchingForPredictionSerializer, PoultryPredictionSerializer, HatchingIncreaseRequestSerializer, ChickenCommissionPricesSerializer, PoultryRequestQuarantineCodeSerializer, PoultryHatchingForDetailsSerializer, PoultryRequestForHatchingDetailSerializer, ChainAllocationForHatchingDetailSerializer, PoultryHatchingForBazrasiSerializer, PoultryRequestForDirectBuyingSerializer, ManagementHatchingAgeRangeSerializer, EvacuationHatchingDetailSerializer, PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer, PoultryDetailForPoultryAndHatchingForPoultryScienceSerializer ) # آدرس پایه برای ذخیره عکس در گالری مرغدار بر روی استوریج آروان ARVAN_poultry_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/' # ARVAN_poultry_URL = 'https://poultry-gallery.s3.ir-thr-at1.arvanstorage.ir/' def update_chain_hatching(poultry_hatching): chain_allocations = ChainAllocation.objects.filter(trash=False, state='accepted', poultry_hatching=poultry_hatching) total_killed_quantity = chain_allocations.aggregate(total=Sum('quantity'))['total'] or 0 total_killed_weight = chain_allocations.aggregate(total=Sum('weight'))['total'] or 0 poultry_hatching.chain_killed_quantity = total_killed_quantity poultry_hatching.chain_killed_weight = total_killed_weight poultry_hatching.save() class CustomPagination(PageNumberPagination): page_size = 10 class OutProvincePoultryRequestBuyerViewSet(viewsets.ModelViewSet): queryset = OutProvincePoultryRequestBuyer.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = OutProvincePoultryRequestBuyerSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = OutProvincePoultryRequestBuyerFilterSet filterset_fields = [ 'mobile', 'kill_house_unique_id', 'user__national_id', 'user__base_order', 'user__mobile', 'user__first_name', 'user__last_name', 'user__fullname', 'unit_name', ] def create(self, request, *args, **kwargs): operator_user = SystemUserProfile.objects.get(user=request.user, trash=False) if SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).exists(): return Response({"result": "این کاربر قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) else: password = "00100" data = { "username": request.data['mobile'], "password": password, "api_key": PROJECT_API_KEY } req = requests.post( url=ARTA_URL_REGISTER, data=data, verify=False ) if req.status_code in (200, 400): user = User(username=request.data['mobile'], first_name=request.data['fullname']) user.save() base_id = SystemUserProfile.objects.all() if base_id.count() > 0: base_id = int(base_id.last().base_order) + 1 else: base_id = 1000 system_profile = SystemUserProfile( mobile=request.data['mobile'], first_name=request.data['fullname'], fullname=request.data['fullname'], user=user, base_order=base_id, password=password, city=operator_user.city, province=operator_user.province ) system_profile.save() else: return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) serializer = self.serializer_class(data=request.data) if serializer.is_valid(): buyer = serializer.create(validated_data=request.data) buyer.user = system_profile buyer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) def list(self, request, *args, **kwargs): buyer_list = [] if 'state' in request.GET: buyers = OutProvincePoultryRequestBuyer.objects.filter(trash=False).order_by('id') 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=buyers ) ).filter(): ps = self.filterset_class(data=query, queryset=buyers) buyer_list = ps.filter() buyers = [] if len(buyer_list) == 0 else buyer_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(buyers) if page is not None: serializer = OutProvincePoultryRequestBuyerForBuyerRequestSerializer(page, many=True) return self.get_paginated_response(serializer.data) else: buyers = OutProvincePoultryRequestBuyer.objects.filter(active=True, trash=False).order_by('id') serializer = self.get_serializer(buyers, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def update(self, request, pk=None, *args, **kwargs): buyer = OutProvincePoultryRequestBuyer.objects.get(key=request.data['buyer_key'], trash=False) request.data.pop('buyer_key') system_user_profile = SystemUserProfile.objects.get(key=buyer.user.key, trash=False) if 'fullname' in request.data.keys(): system_user_profile.first_name = request.data['fullname'] system_user_profile.fullname = request.data['fullname'] system_user_profile.save() if 'mobile' in request.data.keys(): first_mobile_number = system_user_profile.mobile second_mobile_number = request.data['mobile'] if first_mobile_number != second_mobile_number: if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: second_mobile_number = second_mobile_number user = User.objects.get(id=system_user_profile.user.id) user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() serializer = self.serializer_class(buyer) serializer.update(instance=buyer, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None, *args, **kwargs): buyer = OutProvincePoultryRequestBuyer.objects.get(key=request.GET["buyer_key"], trash=False) buyer.trash = True buyer.save() return Response({"result": "با موفقیت حذف شد."}, status=status.HTTP_200_OK) class TotalPoultryViewSet(viewsets.ModelViewSet): queryset = Poultry.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = TotalPoultrySerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = PoultryManageFilterSet filterset_fields = [ 'breeding_unique_id', 'user__national_id', 'user__base_order', 'user__mobile', 'user__first_name', 'user__last_name', 'address__city__name', 'unit_name', ] def list(self, request, *args, **kwargs): poultries = [] user = SystemUserProfile.objects.get(user=request.user, trash=False) if 'search' in request.GET: if 'role' in request.GET: if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultries = Poultry.objects.filter(city_operator=city_operator.unit_name, trash=False).order_by( 'id') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultries = Poultry.objects.filter(address__city=user.city, trash=False).order_by('id') else: poultries = Poultry.objects.filter(trash=False).order_by('id') else: poultries = Poultry.objects.filter(trash=False).order_by('id') value = request.GET.get('value') search = request.GET.get('search') if value and search == 'filter': if value != 'undefined' and value.strip(): poultries = poultries.filter( build_query(self.filterset_class, value)) else: if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultries = Poultry.objects.filter(city_operator=city_operator.unit_name, trash=False).order_by('id') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultries = Poultry.objects.filter(address__city=user.city, trash=False).order_by('id') else: poultries = Poultry.objects.filter(address__province=user.province, trash=False).order_by('id') 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 = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(poultries, many=True) return Response(serializer.data, status=status.HTTP_200_OK) # ویوست مربوط به ثبت و نمایش و ... مرغداری class PoultryViewSet(viewsets.ModelViewSet): queryset = Poultry.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultrySerializer filter_backends = [DjangoFilterBackend] filterset_class = PoultryFilterSet filterset_fields = [ 'breeding_unique_id', 'user__national_id', 'user__base_order', 'user__mobile', ] # تابع مربوط به ویرایش مرغداری def update(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) poultry = Poultry.objects.get(key=request.data["key"], trash=False) request.data.pop('key') serializer = self.serializer_class(poultry) serializer.update(instance=poultry, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) # تابع مربوط به نمایش مرغداری def list(self, request, *args, **kwargs): # refresh(request.user.id) # list of self poultry houses user = SystemUserProfile.objects.get(user=request.user, trash=False) if 'type' in request.GET: if request.GET['type'] == 'filter': poultry_list = [] # for poultry in self.queryset.filter(trash=False): # if PoultryHatching.objects.filter(poultry=poultry, # allow_hatching='pending', left_over__gt=0, state='pending', # archive=False, trash=False).exists(): # poultry_list.append(poultry.key) poultry_list = self.queryset.filter(address__province=user.province, trash=False) for item in self.filterset_fields: query = QueryDict('{0}={1}'.format(item, request.GET['value'])) if (self.filterset_class( data=query, # queryset=self.queryset.filter(address__province=user.province, trash=False) queryset=poultry_list ) ).filter(): ps = self.filterset_class(data=query, queryset=poultry_list) filtered_poultry = ps.filter() serializer = self.serializer_class(filtered_poultry, many=True) return Response(serializer.data) return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) elif 'role' in request.GET: if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) if 'active_hatching' in request.GET: poultry = [] poultry_ids = PoultryHatching.objects.filter( allow_hatching='pending', left_over__gt=0, state='pending', poultry__city_operator=city_operator.unit_name, archive=False, trash=False ).select_related('poultry').only('poultry').values_list('poultry', flat=True).distinct() poultry = Poultry.objects.filter(id__in=poultry_ids) serializer = PoultryForPoultryHatchingForKillInformationSerializer(poultry, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: poultry = Poultry.objects.filter(city_operator=city_operator.unit_name) elif request.GET['role'] == 'Poultry': poultry = Poultry.objects.filter(user=user, trash=False) else: if 'active_hatching' in request.GET: poultry_ids = PoultryHatching.objects.filter( poultry__address__province=user.province, allow_hatching='pending', left_over__gt=0, state='pending', archive=False, trash=False ).select_related('poultry').only('poultry').values_list('poultry', flat=True).distinct() age_range = ChickenAgeRange.objects.filter(trash=False).first() if 'min_age' in request.GET or 'direct_buying' in request.GET: if age_range.active: poultry_ids = poultry_ids.filter(chicken_age__range=(age_range.minimum, age_range.maximum)) else: if 'min_age' in request.GET: min_age = int(request.GET['min_age']) max_age = int(request.GET.get('max_age', min_age)) # برای اطمینان از وجود 'max_age' poultry_ids = poultry_ids.filter(chicken_age__range=(min_age, max_age)) else: poultry_ids = poultry_ids poultry = Poultry.objects.filter(id__in=poultry_ids) serializer = PoultryForPoultryHatchingForKillInformationSerializer(poultry, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: # poultry=PoultryHatching.objects.filter(trash=False,allow_hatching='pending',archive=False).values_list( # 'poultry',flat=True # ).distinct() poultry = Poultry.objects.filter(trash=False, address__province=user.province).select_related( 'user', 'address' ).order_by('id') serializer = PoultryForPoultryHatchingSerializer(poultry, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'info' in request.GET: list1 = [] # list2 = [] poultries = Poultry.objects.filter(user=user, trash=False) if poultries.count() > 0: for poultry in poultries: halls = int(poultry.number_of_halls) inspections_count = 0 hatching_state = None hatching_date = None for hall in range(halls): hatching = PoultryHatching.objects.filter(poultry=poultry, hall=hall + 1).order_by('date') if hatching.count() > 0: hatching = hatching.last() hatching_date = hatching.date if hatching.state == 'pending': hatching_state = 'active' else: hatching_state = 'inactive' vet_farms = VetFarm.objects.filter(poultry=poultry, hall=hall + 1) if vet_farms.count() > 0: for vet_farm in vet_farms: inspections = VetFarmInspection.objects.filter(vet_farm=vet_farm) if inspections.count() > 0: inspections_count += inspections.count() internal_dict = { "poultry_name": poultry.unit_name, "poultry_key": poultry.key, "hall": hall + 1, "hatching_state": hatching_state, "hatching_date": hatching_date, "inspections": inspections_count } list1.append(internal_dict) inspections_count = 0 return Response(list1, status=status.HTTP_200_OK) elif 'operator' in request.GET: if request.GET['operator'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) poultry = Poultry.objects.filter(city_operator=city_operator.unit_name, trash=False) serializer = PoultrySerializer(poultry, many=True) # # elif 'id' in request.GET: # poultry = Poultry.objects.get(breeding_unique_id=request.GET['id']) # serializer = PoultrySerializer(poultry) elif 'all' in request.GET: poultry_list = [] poultries = Poultry.objects.filter(address__province=user.province, trash=False) if poultries.count() > 0: for poultry in poultries: allow_state = None allow_sell_state = None allow = ProvinceAllowPoultryChooseKillHouse.objects.filter(poultry=poultry, trash=False) allow_sell = ProvinceAllowPoultrySellFree.objects.filter(poultry=poultry, trash=False) if allow.count() > 0: allow_state = allow.last().allow if allow_sell.count() > 0: allow_sell_state = allow_sell.last().allow poultry_dict = { "name": poultry.unit_name, "key": poultry.key, "allow_state": allow_state, "allow_sell_state": allow_sell_state } poultry_list.append(poultry_dict) return Response(poultry_list, status=status.HTTP_200_OK) else: poultry = Poultry.objects.filter(user=user, trash=False) serializer = PoultrySerializer(poultry, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def retrieve(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) # get self - poultry profile information if 'profile' in request.GET: user = SystemUserProfile.objects.get(user=request.user, trash=False) user_serializer = SystemUserProfileSerializer(user) poultry = Poultry.objects.filter(user=user, trash=False) serializer = PoultrySerializer(poultry, many=True) profile_info = { 'profile': user_serializer.data, 'aviculture': serializer.data } return Response(profile_info, status=status.HTTP_200_OK) # get special poultry information if 'partial_key' in request.GET: poultry_object = Poultry.objects.get(key=request.GET['partial_key'], trash=False) serializer = PoultrySerializer(poultry_object) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, *args, **kwargs): # refresh(request.user.id) poultry = self.queryset.get(key=request.data['poultry_key']) poultry.trash = True poultry.save() return Response(status=status.HTTP_200_OK) class ChainCompanyViewSet(viewsets.ModelViewSet): queryset = ChainCompany.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainCompanySerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainCompanyFilterSet filterset_fields = [ 'user__national_id', 'user__mobile', 'user__first_name', 'user__last_name', 'user__fullname', 'name', ] def retrieve(self, request, pk=None, *args, **kwargs): if 'profile' in request.GET: user = SystemUserProfile.objects.get(user=request.user, trash=False) chain_company = user.chain_company_user.all() serializer = self.serializer_class(chain_company[0]) return Response(serializer.data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): group = Group.objects.get(name__exact="ChainCompany") city = City.objects.get(province_center=True) province = Province.objects.get(trash=False) system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last() if system_profile: if ChainCompany.objects.filter(user=system_profile, trash=False).exists(): return Response({"result": "این شرکت قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN) else: password = "00100" data = { "username": request.data['mobile'], "password": password, "api_key": PROJECT_API_KEY } req = requests.post( url=ARTA_URL_REGISTER, data=data, verify=False ) if req.status_code == 200: user = User(username=request.data['mobile'], first_name=request.data['first_name'], last_name=request.data['last_name']) user.save() base_id = SystemUserProfile.objects.all() if base_id.count() > 0: base_id = int(base_id.last().base_order) + 1 else: base_id = 1000 system_profile = SystemUserProfile( mobile=request.data['mobile'], first_name=request.data['first_name'], last_name=request.data['last_name'], fullname=request.data['first_name'] + " " + request.data['last_name'], user=user, base_order=base_id, password=password, national_id=request.data['national_id'], city=city, province=province ) system_profile.save() else: return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN) system_profile.role.add(group) wallet = Wallet() wallet.save() request.data.pop('mobile') request.data.pop('first_name') request.data.pop('last_name') request.data.pop('national_id') request.data.pop('postal_code') serializer = self.serializer_class(data=request.data) if serializer.is_valid(): chain_company = serializer.create(validated_data=request.data) chain_company.user = system_profile chain_company.wallet = wallet chain_company.save() return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def list(self, request, *args, **kwargs): company_list = [] if 'state' in request.GET: chain_companies = ChainCompany.objects.filter(trash=False).order_by('id') 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=chain_companies ) ).filter(): ps = self.filterset_class(data=query, queryset=chain_companies) company_list = ps.filter() chain_companies = [] if len(company_list) == 0 else company_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(chain_companies) if page is not None: serializer = ChainCompanyForCompanyRequestSerializer(page, many=True) return self.get_paginated_response(serializer.data) else: chain_companies = ChainCompany.objects.filter(trash=False).order_by('id') serializer = self.serializer_class(chain_companies, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def update(self, request, pk=None, *args, **kwargs): company = ChainCompany.objects.get(key=request.data['company_key'], trash=False) system_user_profile = SystemUserProfile.objects.get(key=company.user.key, trash=False) system_user_profile.first_name = request.data['first_name'] system_user_profile.last_name = request.data['last_name'] system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name'] system_user_profile.national_id = request.data['national_id'] system_user_profile.save() first_mobile_number = system_user_profile.mobile second_mobile_number = request.data['mobile'] request.data.pop('mobile') if first_mobile_number != second_mobile_number: if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: second_mobile_number = second_mobile_number user = User.objects.get(id=system_user_profile.user.id) user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() request.data.pop('company_key') request.data.pop('first_name') request.data.pop('last_name') request.data.pop('national_id') serializer = self.serializer_class(company) serializer.update(instance=company, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) class ChainCompanyForTotalWageAllocationViewSet(viewsets.ModelViewSet): queryset = ChainCompany.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainCompanyForTotalWageAllocationSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainCompanyFilterSet filterset_fields = [ 'name', 'user__fullname', 'user__mobile', 'address__city__name', 'address__province__name', ] def list(self, request, *args, **kwargs): 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() if request.GET['role'] == 'ProvinceOperator': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( date__date__gte=date1, date__date__lte=date2, union_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Company': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( date__date__gte=date1, date__date__lte=date2, company_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Company': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( date__date__gte=date1, date__date__lte=date2, company_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Guilds': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( date__date__gte=date1, date__date__lte=date2, guilds_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) else: chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( date__date__gte=date1, date__date__lte=date2, archive_wage=False, trash=False).values( 'chain_company'), trash=False) else: if request.GET['role'] == 'ProvinceOperator': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( union_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Company': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( company_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Company': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( company_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Guilds': chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( guilds_share__gt=0, archive_wage=False, trash=False).values( 'chain_company'), trash=False) else: chain_companies = ChainCompany.objects.filter(pk__in=ChainAllocation.objects.filter( archive_wage=False, trash=False).values( 'chain_company'), trash=False) if 'search' in request.GET: chain_companies_list = [] 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=chain_companies ) ).filter(): ps = self.filterset_class(data=query, queryset=chain_companies) chain_companies_list = ps.filter() chain_companies = [] if len(chain_companies_list) == 0 else chain_companies_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(chain_companies) if page is not None: if 'date1' in request.GET: serializer = ChainCompanyForTotalWageAllocationWithDAteSerializer(page, many=True, context={'request': request}) else: serializer = self.get_serializer(page, many=True, context={'request': request}) return self.get_paginated_response(serializer.data) if 'date1' in request.GET: serializer = ChainCompanyForTotalWageAllocationWithDAteSerializer(chain_companies, many=True, context={'request': request}) else: serializer = self.get_serializer(chain_companies, many=True, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK) class ChainCompanyForTotalWageTransactionViewSet(viewsets.ModelViewSet): queryset = ChainCompany.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainCompanyForTotalWageTransactionSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainCompanyFilterSet filterset_fields = [ 'name', 'user__fullname', 'user__mobile', 'address__city__name', 'address__province__name', ] def list(self, request, *args, **kwargs): 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() if request.GET['role'] == 'ProvinceOperator': chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( date__date__gte=date1, date__date__lte=date2, status='completed', payer_type='chain_company', union_share__gt=0, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Company': chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( date__date__gte=date1, date__date__lte=date2, status='completed', payer_type='chain_company', company_share__gt=0, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Guilds': chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( date__date__gte=date1, date__date__lte=date2, status='completed', payer_type='chain_company', guilds_share__gt=0, trash=False).values( 'chain_company'), trash=False) else: chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( date__date__gte=date1, date__date__lte=date2, status='completed', payer_type='chain_company', trash=False).values( 'chain_company'), trash=False) else: if request.GET['role'] == 'ProvinceOperator': chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( status='completed', payer_type='chain_company', union_share__gt=0, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Company': chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( status='completed', payer_type='chain_company', company_share__gt=0, trash=False).values( 'chain_company'), trash=False) elif request.GET['role'] == 'Guilds': chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( status='completed', payer_type='chain_company', guilds_share__gt=0, trash=False).values( 'chain_company'), trash=False) else: chain_companies = ChainCompany.objects.filter(pk__in=InternalTransaction.objects.filter( status='completed', payer_type='chain_company', trash=False).values( 'chain_company'), trash=False) if 'search' in request.GET: chain_companies_list = [] 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=chain_companies ) ).filter(): ps = self.filterset_class(data=query, queryset=chain_companies) chain_companies_list = ps.filter() chain_companies = [] if len(chain_companies_list) == 0 else chain_companies_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(chain_companies) if page is not None: if 'date1' in request.GET: serializer = ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer(page, many=True, context={ 'request': request}) else: serializer = self.get_serializer(page, many=True, context={'request': request}) return self.get_paginated_response(serializer.data) if 'date1' in request.GET: serializer = ChainCompanyForTotalWageTransactionTransactionWithDAteSerializer(chain_companies, many=True, context={'request': request}) else: serializer = self.get_serializer(chain_companies, many=True, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK) class ChainCompanyTransactionViewSet(viewsets.ModelViewSet): queryset = ChainCompanyTransaction.objects.all() serializer_class = ChainCompanyTransactionSerializer permission_classes = [TokenHasReadWriteScope] class PoultryChooseChainCompanyViewSet(viewsets.ModelViewSet): queryset = ChainCompany.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainCompanySerializer def create(self, request, *args, **kwargs): poultry_hitchings = request.data['poultry_hitchings'] chain_company = ChainCompany.objects.get(key=request.data['chain_company'], trash=False) hatchings = PoultryHatching.objects.filter(key__in=poultry_hitchings, trash=False) for hatching in hatchings: hatching.chain_company = chain_company hatching.has_chain_company = True hatching.save() return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED) def update(self, request, pk=None, *args, **kwargs): hatching = PoultryHatching.objects.get(key=request.data['hatching_key'], trash=False) if 'type' in request.data.keys(): if request.data['type'] == 'delete': hatching.chain_company = None hatching.has_chain_company = False hatching.save() else: company = ChainCompany.objects.get(key=request.data['company_key'], trash=False) hatching.chain_company = company hatching.has_chain_company = True hatching.save() return Response({"result": "با موفقیت ثبت شد!"}, status=status.HTTP_200_OK) class ChainAllocationForWageViewSet(viewsets.ModelViewSet): queryset = ChainAllocation.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainAllocationForWageSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainAllocationFilterSet filterset_fields = [ 'poultry_hatching__poultry__breeding_unique_id', 'poultry_hatching__poultry__user__mobile', 'poultry_hatching__poultry__user__fullname', 'poultry_hatching__poultry__user__first_name', 'poultry_hatching__poultry__user__last_name', 'poultry_hatching__poultry__unit_name', 'chain_company__name', ] def list(self, request, *args, **kwargs): chain_allocations_list = [] if request.GET['role'] == 'ChainCompany': user = SystemUserProfile.objects.get(user=request.user, trash=False) chain_company = ChainCompany.objects.get(user=user, trash=False) else: chain_company = ChainCompany.objects.get(key=request.GET['chain_company_key'], trash=False) 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() if request.GET['role'] == 'ProvinceOperator': chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, date__date__lte=date2, union_share__gt=0, trash=False).order_by('id') elif request.GET['role'] == 'Company': chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, date__date__lte=date2, company_share__gt=0, trash=False).order_by('id') elif request.GET['role'] == 'Guilds': chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, date__date__lte=date2, guilds_share__gt=0, trash=False).order_by('id') else: chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, date__date__gte=date1, date__date__lte=date2, trash=False).order_by('id') else: if request.GET['role'] == 'ProvinceOperator': chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, union_share__gt=0, trash=False).order_by('id') elif request.GET['role'] == 'Company': chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, company_share__gt=0, trash=False).order_by('id') elif request.GET['role'] == 'Guilds': chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, guilds_share__gt=0, trash=False).order_by('id') else: chain_allocations = ChainAllocation.objects.filter(chain_company=chain_company, trash=False).order_by('id') 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=chain_allocations ) ).filter(): ps = self.filterset_class(data=query, queryset=chain_allocations) chain_allocations_list = ps.filter() chain_allocations = [] if len(chain_allocations_list) == 0 else chain_allocations_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(chain_allocations) if page is not None: serializer = self.serializer_class(page, many=True, context={'request': request}) return self.get_paginated_response(serializer.data) serializer = self.serializer_class(chain_allocations, many=True, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK) class ChainAllocationViewSet(viewsets.ModelViewSet): queryset = ChainAllocation.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainAllocationSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainAllocationFilterSet filterset_fields = [ 'poultry_hatching__poultry__breeding_unique_id', 'poultry_hatching__poultry__user__mobile', 'poultry_hatching__poultry__user__fullname', 'poultry_hatching__poultry__user__first_name', 'poultry_hatching__poultry__user__last_name', 'poultry_hatching__poultry__unit_name', 'chain_company__name', ] def create(self, request, *args, **kwargs): # refresh(request.user.id) if base_url_for_sms_report == 'ma': return Response({ 'result': "امکان ثبت بار برای زنجیره وجود ندارد جهت فروش زنجیره به قسمت فروش خارج استان مراجعه فرمایید"}, status=status.HTTP_403_FORBIDDEN) user = SystemUserProfile.objects.get(user=request.user, trash=False) kill_house = None hatching = PoultryHatching.objects.get(key=request.data['hatching_key'], trash=False) chain_company = ChainCompany.objects.get(key=hatching.chain_company.key, trash=False) role = request.data['role'] request.data.pop('hatching_key') request.data.pop('role') now = datetime.datetime.now() if 'kill_house_key' in request.data.keys(): kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) request.data.pop('kill_house_key') input_date = datetime.datetime.strptime(request.data['date'], '%Y-%m-%d').date() date = datetime.datetime(year=input_date.year, month=input_date.month, day=input_date.day, hour=now.hour, minute=now.minute, second=now.second) request.data.pop('date') serializer = self.serializer_class(data=request.data) if serializer.is_valid(): chain_allocation = serializer.create(validated_data=request.data) chain_allocation.poultry_hatching = hatching chain_allocation.chain_company = chain_company chain_allocation.date = date chain_allocation.company_name = chain_company.name chain_allocation.company_user_fullname = chain_company.user.fullname chain_allocation.company_user_mobile = chain_company.user.mobile chain_allocation.company_user_province = chain_company.user.province.name chain_allocation.company_user_city = chain_company.user.city.name chain_allocation.registerer = { "role": role, "fullname": user.fullname, "mobile": user.mobile, "date": str(datetime.datetime.now()), } if kill_house != None: chain_allocation.kill_house = kill_house chain_allocation.save() # update_chain_hatching(hatching) wage = 0 wage_type = WageType.objects.filter(en_name='chain', trash=False).first() if wage_type.status == True: wage = wage_type.amount chain_allocation.wage = wage chain_allocation.total_wage_amount = wage * int(chain_allocation.weight) chain_allocation.save() percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) if wage_type and wage_type.status == True and percentages_wage_type: for percentage_wage_type in percentages_wage_type: if percentage_wage_type.share_type.en_name == 'union': chain_allocation.union_share = int( (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) chain_allocation.union_share_percent = percentage_wage_type.percent chain_allocation.save() elif percentage_wage_type.share_type.en_name == 'company': chain_allocation.company_share = int( (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) chain_allocation.company_share_percent = percentage_wage_type.percent chain_allocation.save() elif percentage_wage_type.share_type.en_name == 'guilds': chain_allocation.guilds_share = int( (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) chain_allocation.guilds_share_percent = percentage_wage_type.percent chain_allocation.save() elif percentage_wage_type.share_type.en_name == 'city': chain_allocation.city_share = int( (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) chain_allocation.city_share_percent = percentage_wage_type.percent chain_allocation.save() elif percentage_wage_type.share_type.en_name == 'wallet': chain_allocation.wallet_share = int( (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) chain_allocation.wallet_share_percent = percentage_wage_type.percent chain_allocation.save() else: chain_allocation.other_share = int( (percentage_wage_type.percent / 100) * chain_allocation.total_wage_amount) chain_allocation.other_share_percent = percentage_wage_type.percent chain_allocation.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() chain_allocations_list = [] if request.GET['role'] == "ChainCompany": if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, date__date__gte=date1, date__date__lte=date2, state='accepted', trash=False).order_by('-id') elif request.GET['role'] == "CityOperator": city_operator = CityOperator.objects.get(user=user, trash=False) if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter( poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter( poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') elif request.GET['role'] == "VetFarm": vet = Vet.objects.get(user=user, trash=False) poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( 'poultry').values_list('poultry', flat=True).distinct() poultry = Poultry.objects.filter(id__in=poultry_ids) if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, poultry_hatching__poultry__in=poultry, state__in=('rejected', 'deleted'), trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, poultry_hatching__poultry__in=poultry, state='accepted', trash=False).order_by('-id') else: if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True), temporary_trash=False, temporary_deleted=False).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') 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=chain_allocations ) ).filter(): ps = self.filterset_class(data=query, queryset=chain_allocations) chain_allocations_list = ps.filter() chain_allocations = [] if len(chain_allocations_list) == 0 else chain_allocations_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(chain_allocations) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.serializer_class(chain_allocations, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def update(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user, trash=False) chain_allocation = ChainAllocation.objects.get(key=request.data['chain_allcation_key'], trash=False) request.data.pop('chain_allcation_key') if 'check_allocation' in request.data.keys(): chain_allocation.seconder = { "role": None, "fullname": user.fullname, "mobile": user.mobile, "date": str(datetime.datetime.now()), } chain_allocation.save() request.data.pop('check_allocation') if request.data['state'] == 'accepted': poultry_name = chain_allocation.poultry_hatching.poultry.unit_name poultry_mobile = chain_allocation.poultry_hatching.poultry.user.mobile quantity = chain_allocation.quantity Index_weight = chain_allocation.index_weight if chain_allocation.kill_house is not None: kill_house_name = chain_allocation.kill_house.name kill_house_mobile = chain_allocation.kill_house.kill_house_operator.user.mobile else: kill_house_name = chain_allocation.buyer_name kill_house_mobile = chain_allocation.buyer_mobile city = chain_allocation.poultry_hatching.poultry.user.city.name province = chain_allocation.poultry_hatching.poultry.user.province.name date_str = str( chain_allocation.date) send_date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, day=send_date.day).strftime('%Y-%m-%d') date_list = reversed(send_date.split('-')) separate = "-" send_date = separate.join(date_list) vet_farm = VetFarm.objects.filter( poultry=chain_allocation.poultry_hatching.poultry).first() sms_chain_company_for_ver_farm(poultry_name, poultry_mobile, quantity, Index_weight, kill_house_name, kill_house_mobile, city, send_date, vet_farm.vet.user.mobile, province) if 'quarantine_code' in request.data.keys(): chain_allocation.quarantine_code_registrar = { "fullname": user.fullname, "mobile": user.mobile, "date": str(datetime.datetime.now()), } chain_allocation.save() if 'kill_house_key' in request.data.keys() and request.data['kill_house_key'] is not None: kill_house = KillHouse.objects.get(key=request.data['kill_house_key']) chain_allocation.kill_house = kill_house chain_allocation.save() request.data.pop('kill_house_key') serializer = self.serializer_class(chain_allocation) serializer.update(instance=chain_allocation, validated_data=request.data) if chain_allocation.state == 'accepted': update_chain_hatching(chain_allocation.poultry_hatching) chain_allocation.total_wage_amount = chain_allocation.wage * int(chain_allocation.weight) chain_allocation.save() union_percent = chain_allocation.union_share_percent / 100 if chain_allocation.union_share_percent > 0 else 0 company_percent = chain_allocation.company_share_percent / 100 if chain_allocation.company_share_percent > 0 else 0 guilds_percent = chain_allocation.guilds_share_percent / 100 if chain_allocation.guilds_share_percent > 0 else 0 city_share_percent = chain_allocation.city_share_percent / 100 if chain_allocation.city_share_percent > 0 else 0 wallet_share_percent = chain_allocation.wallet_share_percent / 100 if chain_allocation.wallet_share_percent > 0 else 0 other_share_percent = chain_allocation.other_share_percent / 100 if chain_allocation.other_share_percent > 0 else 0 chain_allocation.union_share = int(union_percent * chain_allocation.total_wage_amount) chain_allocation.company_share = int(company_percent * chain_allocation.total_wage_amount) chain_allocation.guilds_share = int(guilds_percent * chain_allocation.total_wage_amount) chain_allocation.city_share = int(city_share_percent * chain_allocation.total_wage_amount) chain_allocation.wallet_share = int(wallet_share_percent * chain_allocation.total_wage_amount) chain_allocation.other_share = int(other_share_percent * chain_allocation.total_wage_amount) chain_allocation.save() return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) role = request.GET['role'] chain_allocation = ChainAllocation.objects.get(key=request.GET['chain_allcation_key'], trash=False) if chain_allocation.quarantine_code is None == False: return Response({"result": "به علت ورود کد قرنطینه امکان حذف وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) chain_allocation.trash = True chain_allocation.state = 'deleted' chain_allocation.remover = { "role": role, "fullname": user.fullname, "mobile": user.mobile, "date": str(datetime.datetime.now()), } chain_allocation.save() update_chain_hatching(chain_allocation.poultry_hatching) return Response(status=status.HTTP_200_OK) class ParentCompanyChainAllocationViewSet(viewsets.ModelViewSet): queryset = ChainAllocation.objects.all() permission_classes = [AllowAny] serializer_class = ChainAllocationSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainAllocationFilterSet filterset_fields = [ 'poultry_hatching__poultry__breeding_unique_id', 'poultry_hatching__poultry__user__mobile', 'poultry_hatching__poultry__user__fullname', 'poultry_hatching__poultry__user__first_name', 'poultry_hatching__poultry__user__last_name', 'poultry_hatching__poultry__unit_name', 'chain_company__name', ] def list(self, request, *args, **kwargs): date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() chain_allocations_list = [] if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') 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=chain_allocations ) ).filter(): ps = self.filterset_class(data=query, queryset=chain_allocations) chain_allocations_list = ps.filter() chain_allocations = [] if len(chain_allocations_list) == 0 else chain_allocations_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(chain_allocations) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.serializer_class(chain_allocations, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class ForecastPoultryHatchingViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [AllowAny] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() age = int(request.GET['age']) days_interval = (date2 - date1).days hatching_list = [] hatches = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False, trash=False) if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) hatchings = hatches.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) hatchings = hatches.filter(poultry__address__city=user.city) else: hatchings = hatches else: hatchings = hatches if hatchings: for i in range(days_interval + 1): hatching_left_over = 0 first_date = date1 + timedelta(days=i) for hatch in hatchings: if (first_date - hatch.date.date()).days + 1 == age: hatching_left_over += hatch.left_over hatching_list.append({"date": first_date, "hatching_left_over": hatching_left_over}) if days_interval == 0: break return Response(hatching_list, status=status.HTTP_200_OK) class PoultryHatchingForDashBoardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingSerializer filterset_class = PoultryHatchingFilterSet filterset_fields = [ 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__user__fullname', 'poultry__user__mobile', 'poultry__unit_name', 'poultry__address__city__name', 'chicken_age', 'licence_number', 'poultry__breeding_unique_id', 'CertId', 'PersonTypeName', 'InteractTypeName', 'UnionTypeName', 'poultry__city_operator', ] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) hatching_filters = { 'trash': False } if request.GET['type'] == 'date-dashboard': date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultry_hatchings = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, date__date__lte=date2, # allow_hatching='pending', # state='pending', # archive=False, poultry__city_operator=city_operator.unit_name, ) elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, date__date__lte=date2, # allow_hatching='pending', # state='pending', # archive=False, poultry__address__city=user.city, ) else: poultry_hatchings = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, date__date__lte=date2, # allow_hatching='pending', # state='pending', # archive=False ) if 'search' in request.GET: value = request.GET.get('value') if request.GET['search'] == 'filter': if value != 'undefined' and value.strip(): poultry_hatchings = poultry_hatchings.filter( build_query(self.filterset_class, value) ) poultries = Poultry.objects.filter(pk__in=poultry_hatchings.values('poultry'), trash=False) total_hatching_quantity = poultry_hatchings.aggregate(total=Sum('quantity'))['total'] or 0 total_hatching_left_over_quantity = poultry_hatchings.aggregate(total=Sum('left_over'))['total'] or 0 total_hatching_killed_quantity = poultry_hatchings.aggregate(total=Sum('killed_quantity'))['total'] or 0 total_hatching_killed_weight = poultry_hatchings.aggregate(total=Sum('total_killed_weight'))['total'] or 0 all_vet_losses = poultry_hatchings.aggregate(total_quantity=Sum('losses')).get( 'total_quantity') or 0 all_union_losses = poultry_hatchings.aggregate(total_quantity=Sum('direct_losses')).get( 'total_quantity') or 0 all_total_losses = poultry_hatchings.aggregate(total_quantity=Sum('total_losses')).get( 'total_quantity') or 0 return Response({ "poultries": len(poultries), "total_hatching_quantity": total_hatching_quantity, "total_hatching_left_over_quantity": total_hatching_left_over_quantity, "total_hatching_killed_quantity": total_hatching_killed_quantity, "total_hatching_killed_weight": total_hatching_killed_weight, "total_hatching_vet_losses": all_vet_losses, "total_hatching_union_losses": all_union_losses, "total_hatching_all_losses": all_total_losses, }) else: tab = request.GET.get('tab') age1 = request.GET.get('age1') age2 = request.GET.get('age2') date1 = request.GET.get('date1') date2 = request.GET.get('date2') role = request.GET.get('role') if tab == 'unknown': hatching_filters['unknown'] = True elif tab == 'archive': hatching_filters['unknown'] = False elif tab == 'active': hatching_filters['unknown'] = False hatching_filters['allow_hatching'] = 'pending' hatching_filters['state'] = 'pending' hatching_filters['archive'] = False else: hatching_filters['unknown'] = False if age1 and age2: if int(age2) > 0: hatching_filters['chicken_age__gte'] = int(age1) hatching_filters['chicken_age__lte'] = int(age2) if date1: hatching_filters['date__date__gte'] = date1 hatching_filters['date__date__lte'] = date2 if role == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) hatching_filters['poultry__city_operator'] = city_operator.unit_name elif role in ['CityJahad', 'CityPoultry', 'CityVet']: hatching_filters['poultry__address__city'] = user.city poultry_hatchings = PoultryHatching.objects.filter(**hatching_filters).order_by('date') if tab == 'archive': poultry_hatchings = poultry_hatchings.filter( Q(allow_hatching='True', state='complete') | Q(archive=True)) if 'search' in request.GET: value = request.GET.get('value') if request.GET['search'] == 'filter': if value != 'undefined' and value.strip(): poultry_hatchings = poultry_hatchings.filter( build_query(self.filterset_class, value) ) total_hatching_quantity = poultry_hatchings.aggregate(total=Sum('quantity'))['total'] or 0 total_hatching_left_over_quantity = poultry_hatchings.aggregate(total=Sum('left_over'))['total'] or 0 total_hatching_killed_quantity = poultry_hatchings.aggregate(total=Sum('killed_quantity'))['total'] or 0 total_hatching_killed_weight = poultry_hatchings.aggregate(total=Sum('total_killed_weight'))['total'] or 0 all_vet_losses = poultry_hatchings.aggregate(total_quantity=Sum('losses')).get( 'total_quantity') or 0 all_union_losses = poultry_hatchings.aggregate(total_quantity=Sum('direct_losses')).get( 'total_quantity') or 0 all_total_losses = poultry_hatchings.aggregate(total_quantity=Sum('total_losses')).get( 'total_quantity') or 0 now = timezone.now().date() age_distribution = {"age-20-30": 0, "age-30-40": 0, "age-40-50": 0, "age-50-60": 0, "age-more-than-60": 0} for poultry_hatching in poultry_hatchings: age = (now - poultry_hatching.date.date()).days + 1 if 20 <= age <= 30: age_distribution["age-20-30"] += poultry_hatching.left_over elif age <= 40: age_distribution["age-30-40"] += poultry_hatching.left_over elif age <= 50: age_distribution["age-40-50"] += poultry_hatching.left_over elif age <= 60: age_distribution["age-50-60"] += poultry_hatching.left_over else: age_distribution["age-more-than-60"] += poultry_hatching.left_over return Response({ "poultries": poultry_hatchings.values('poultry').distinct().count(), "hatchings": poultry_hatchings.count(), "total_hatching_quantity": total_hatching_quantity, "total_hatching_left_over_quantity": total_hatching_left_over_quantity, **age_distribution, "total_hatching_killed_quantity": total_hatching_killed_quantity, "total_hatching_killed_weight": total_hatching_killed_weight, "total_hatching_vet_losses": all_vet_losses, "total_hatching_union_losses": all_union_losses, "total_hatching_all_losses": all_total_losses, }) # ویوست مربوط به ثبت و نمایش و ... جوجه ریزی مرغدار class PoultryHatchingViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingSerializer pagination_class = CustomPagination filterset_class = PoultryHatchingFilterSet filterset_fields = [ 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__user__fullname', 'poultry__user__mobile', 'poultry__unit_name', 'poultry__address__city__name', 'chicken_age', 'licence_number', 'poultry__breeding_unique_id', 'CertId', 'PersonTypeName', 'InteractTypeName', 'UnionTypeName', 'poultry__city_operator', ] def generate_random_filename(self, extension="jpg", length=15): """Generates a random filename with the given extension.""" random_str = ''.join(random.choices(string.ascii_uppercase + string.digits, k=length)) return f"{random_str}.{extension}" def process_violation_images(self, images): """Uploads images to Arvan Cloud and returns the URLs.""" violation_images = [] for image in images: file_url = upload_to_liara(image, image.name) violation_images.append(file_url) return violation_images # تابع مربوط به ثبت جوجه ریزی مرغدار def create(self, request, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) if 'role' in request.data.keys(): role = request.data['role'] request.data.pop('role') else: role = None poultry = Poultry.objects.get(key=request.data["key"], trash=False) request.data.pop("key") if role == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) if city_operator.unit_name != poultry.city_operator: return Response({"result": "مرغدار زیر مجموعه تعاونی دیگری دیگری است !"}, status=status.HTTP_403_FORBIDDEN) hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False) serializer = self.serializer_class(data=request.data) if serializer.is_valid(): if PoultryHatching.objects.filter(poultry=poultry, hall=int(request.data['hall']), state__in=('pending', 'complete'), allow_hatching='pending', archive=False, trash=False).exists(): return Response({"result": "برای شما دوره فعال جوجه ریزی وجود دارد !"}, status=status.HTTP_403_FORBIDDEN) hatch = PoultryHatching.objects.filter(poultry=poultry, hall=int(request.data['hall']), state__in=('pending', 'complete'), allow_hatching='pending', archive=False, trash=False) if hatch.count() > 0: hatch = hatch.last() hatch.quantity += int(request.data['quantity']) # hatch.left_over += int(request.data['quantity']) hatch.state = 'pending' counter = 1 for chicken_breed in hatch.breed: if request.data['chicken_breed'] == chicken_breed['breed']: chicken_breed['main_quantity'] += int(request.data['quantity']) chicken_breed['remain_quantity'] += int(request.data['quantity']) break counter += 1 if counter == 1: pass else: hatch.breed.append({ 'breed': request.data['chicken_breed'], 'main_quantity': int(request.data['quantity']), 'remain_quantity': int(request.data['quantity']) }) if hatch.chicken_breed == request.data['chicken_breed']: pass else: hatch.chicken_breed = hatch.chicken_breed + " " + "-" + " " + request.data[ 'chicken_breed'] hatch.save() if SmsLicense.objects.filter(hatching=True).exists(): province_operator = ProvinceOperator.objects.filter( user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) if province_operator.count() > 0: province_operator = province_operator.last() poultry_fullname = hatch.poultry.unit_name quantity = hatch.quantity chicken_breed = hatch.chicken_breed date_str = str(hatch.date) date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).strftime( '%Y-%m-%d') date_list = reversed(date.split('-')) separate = "-" date = separate.join(date_list) province = hatch.poultry.user.province.name city = hatch.poultry.user.city.name province_operator_mobile = province_operator.user.mobile operator_hatching_sms(province_operator_mobile, poultry_fullname, quantity, date, chicken_breed, province, city) free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() if free_sale: if free_sale.type == 'weight': hatch.total_commitment = hatch.quantity * free_sale.weight else: hatch.total_commitment_quantity = int(hatch.quantity * (free_sale.percent / 100)) hatch.save() serializer = self.serializer_class(hatch) return Response(serializer.data, status=status.HTTP_201_CREATED) if int(request.data['quantity']) == 0: return Response({"result": "you enter zero"}, status=status.HTTP_403_FORBIDDEN) breed_list = [] poultry_hatching = serializer.create(validated_data=request.data) poultry_hatching.poultry = poultry if hatching.count() > 0: poultry_hatching.period = hatching.last().period + 1 else: poultry_hatching.period = 1 if role != None: poultry_hatching.registrar = { "role": role, "fullname": user.fullname, "date": str(poultry_hatching.create_date) } # poultry_hatching.left_over = poultry_hatching.quantity breed_list.append({ 'breed': request.data['chicken_breed'], 'main_quantity': int(request.data['quantity']), 'remain_quantity': int(request.data['quantity']) }) poultry_hatching.breed = breed_list poultry_hatching.latest_hatching_change = { "role": role, "date": str(datetime.datetime.now().date()), "full_name": user.fullname } poultry_hatching.save() free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() if free_sale: if free_sale.type == 'weight': poultry_hatching.total_commitment = poultry_hatching.quantity * free_sale.weight else: poultry_hatching.total_commitment_quantity = int( poultry_hatching.quantity * (free_sale.percent / 100)) poultry_hatching.save() province_operator = ProvinceOperator.objects.filter( user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) if province_operator.count() > 0: province_operator = province_operator.last() poultry_mobile = poultry_hatching.poultry.user.mobile poultry_fullname = poultry_hatching.poultry.unit_name quantity = poultry_hatching.quantity chicken_breed = poultry_hatching.chicken_breed date_str = poultry_hatching.date date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date() date = jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).strftime( '%Y-%m-%d') date_list = reversed(date.split('-')) separate = "-" date = separate.join(date_list) if SmsLicense.objects.filter(hatching=True).exists(): province = poultry_hatching.poultry.user.province.name city = poultry_hatching.poultry.user.city.name base_order = poultry_hatching.poultry.user.base_order province_operator_mobile = province_operator.user.mobile province_operator_name = province_operator.user.fullname # hatching_sms(poultry_mobile, poultry_fullname, quantity, chicken_breed, date, province, city, base_order) operator_hatching_sms(province_operator_mobile, poultry_fullname, quantity, date, chicken_breed, province, city) serializer = self.serializer_class(poultry_hatching) return Response(serializer.data, status=status.HTTP_201_CREATED) def update(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) hatching = PoultryHatching.objects.get(key=request.data["key"], trash=False) request.data.pop('key') if 'violation_check' in request.data.keys(): if hatching.violation_reporter is not None: hatching.violation_report_editor = user.fullname hatching.violation_report_edit_date = datetime.datetime.now() else: hatching.violation_reporter = user.fullname hatching.violation_report_date = datetime.datetime.now() if request.FILES.get('violation_image_0'): violation_files = [ f for i in range(5) if (f := request.FILES.get(f'violation_image_{i}')) ] images = hatching.violation_image if images: for image in images: delete_file_from_liara(image.split('/')[-1]) violation_images = self.process_violation_images(violation_files) hatching.violation_image = violation_images if request.data['archive'] == True: hatching.allow_hatching = 'True' hatching.state = 'complete' hatching.archive_date = datetime.datetime.now() hatching.archive = True if hatching.first_date_input_archive is None: hatching.first_date_input_archive = datetime.datetime.now() else: hatching.second_date_input_archive = datetime.datetime.now() hatching.input_archiver = user.fullname hatching.save() request.data.pop('violation_check') request.data.pop('archive') if 'unknown' in request.data.keys(): hatching.poultry.order_limit = False hatching.poultry.save() if 'archive_state' in request.data.keys(): if hatching.left_over > (hatching.quantity * 10): return Response({'result': 'به دلیل مانده بیش از ده درصد امکان بایگانی کردن این جوجه ریزی را ندارید!'}, status=status.HTTP_403_FORBIDDEN) role = request.data['role'] request.data.pop('role') request.data.pop('archive_state') hatching.allow_hatching = True if hatching.unknown: hatching.unknown = False hatching.poultry.order_limit = False hatching.poultry.save() hatching.state = 'complete' hatching.archive_date = datetime.datetime.now() hatching.archive = True if hatching.first_date_input_archive is None: hatching.first_date_input_archive = datetime.datetime.now() else: hatching.second_date_input_archive = datetime.datetime.now() if hatching.left_over > (hatching.quantity * percent_of_losses): hatching.violation = True hatching.input_archiver = user.fullname hatching.last_change = { "date": str(datetime.datetime.now()), "full_name": user.fullname, "role": role, "type": "manual_archive" } hatching.save() if 'quantity' in request.data.keys() and request.data['quantity'] != None: quantity = int(request.data['quantity']) # poultry_requests_quantity = \ # PoultryRequest.objects.filter(hatching=hatching, state_process__in=('pending', 'accepted'), # province_state__in=('pending', 'accepted'), final_state='pending', # trash=False).aggregate( # total_quantity=Sum('quantity'))[ # 'total_quantity'] or 0 if quantity < hatching.killed_quantity: # if int(request.data['quantity']) < hatching.left_over: return Response({"result": "تعداد وارد شده کمتر از تعداد کشتار شده قبلی است."}) else: role = request.data['role'] request.data.pop('role') # if quantity > hatching.quantity: # hatching.left_over += quantity - hatching.quantity # elif quantity < hatching.quantity and hatching.left_over != 0: # hatching.left_over -= hatching.quantity - quantity hatching.quantity = quantity hatching.allow_hatching = 'pending' hatching.state = 'pending' # hatching.output_archive_date = datetime.datetime.now() # hatching.output_archiver = user.fullname hatching.last_change = { "date": str(datetime.datetime.now()), "full_name": user.fullname, "role": role, "type": "change_hatching" } hatching.save() free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() if free_sale: if free_sale.type == 'weight': hatching.total_commitment = hatching.quantity * free_sale.weight else: hatching.total_commitment_quantity = int(hatching.quantity * (free_sale.percent / 100)) hatching.save() if 'type' in request.data.keys(): if request.data['type'] == 'return_archive': if PoultryHatching.objects.filter(poultry=hatching.poultry, hall=hatching.hall, trash=False, allow_hatching='pending', archive=False ).exists(): return Response({"result": "شما در این سالن جوجه ریزی فعال دارید"}, status=status.HTTP_403_FORBIDDEN) elif (datetime.datetime.now().date() - hatching.date.date()).days > 85: return Response({"result": "جوجه ریزی انتخابی بالاتر از 85 روز میباشد،امکان بازگشت وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) else: hatching.allow_hatching = 'pending' hatching.state = 'pending' hatching.archive = False hatching.chicken_age = (datetime.datetime.now().date() - hatching.date.date()).days + 1 hatching.output_archive_date = datetime.datetime.now() hatching.output_archiver = user.fullname free_sale = FreeSaleWithinprovince.objects.filter(trash=False, allow=True).first() if free_sale: if free_sale.type == 'weight': hatching.total_commitment = hatching.quantity * free_sale.weight else: hatching.total_commitment_quantity = int(hatching.quantity * (free_sale.percent / 100)) hatching.save() if 'violation' in request.data.keys(): if request.data['violation'] == True and hatching.violation == False: hatching.violation = True if request.data['violation'] == False and hatching.violation == True: hatching.violation = False hatching.save() request.data.pop('violation') if 'delete_tenant' in request.data.keys(): hatching.tenant_fullname = None hatching.tenant_national_code = None hatching.tenant_mobile = None hatching.tenant_city = None hatching.has_tenant = False hatching.save() request.data.pop('delete_tenant') if 'direct_losses' in request.data.keys(): if request.data['direct_losses'] > hatching.left_over: return Response({"result": "تعداد وارد شده از باقی مانده سالن بیشتر است"}, status=status.HTTP_403_FORBIDDEN) date = datetime.datetime.now() if hatching.direct_losses_inputer is None: hatching.direct_losses_inputer = user.fullname hatching.direct_losses_date = date else: hatching.direct_losses_editor = user.fullname hatching.direct_losses_last_edit_date = date hatching.save() if 'end_period_losses' in request.data.keys(): if request.data['losses'] > hatching.left_over: return Response({"result": "تعداد وارد شده از باقی مانده سالن بیشتر است"}, status=status.HTTP_403_FORBIDDEN) if request.data['type'] == 'add': hatching.losses += request.data['losses'] else: hatching.losses = request.data['losses'] date = datetime.datetime.now() if hatching.end_period_losses_inputer is None: hatching.end_period_losses_inputer = user.fullname hatching.end_period_losses_date = date else: hatching.end_period_losses_editor = user.fullname hatching.end_period_losses_last_edit_date = date hatching.save() return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_200_OK) serializer = self.serializer_class(hatching) serializer.update(instance=hatching, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) # تابع مربوط به نمایش دوره جوجه ریزی مرغدار def list(self, request, *args, **kwargs): value = request.GET.get('value') poultry_hatchings = [] # refresh(request.user.id) from datetime import datetime now = datetime.now().date() user = SystemUserProfile.objects.get(user=request.user) if 'all_active_and_archive' in request.GET: base_query = PoultryHatching.objects.filter( trash=False ).select_related( 'poultry__user', 'poultry__address__city', 'poultry__address__province', 'chain_company' ) if request.GET.get('role') == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultry_hatchings = base_query.filter( poultry__city_operator=city_operator.unit_name, poultry__address__province=user.province ) elif request.GET.get('role') in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = base_query.filter( poultry__address__city=user.city ) elif request.GET.get('role') == 'ChainCompany': poultry_hatchings = base_query.filter( chain_company__user=user, poultry__address__province=user.province ) else: poultry_hatchings = base_query.filter( poultry__address__province=user.province ) if 'date1' in request.GET and 'date2' in request.GET: date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() poultry_hatchings = poultry_hatchings.filter( date__date__gte=date1, date__date__lte=date2 ) if 'age1' in request.GET and int(request.GET.get('age2')) > 0: age1 = int(request.GET['age1']) age2 = int(request.GET['age2']) poultry_hatchings = poultry_hatchings.filter( chicken_age__gte=age1, chicken_age__lte=age2 ) if 'search' in request.GET and value and value != 'undefined' and value.strip(): poultry_hatchings = poultry_hatchings.filter( build_query(self.filterset_class, value) ) poultry_hatchings = poultry_hatchings.order_by('-date') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(poultry_hatchings) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(poultry_hatchings, many=True) return Response(serializer.data, status=status.HTTP_200_OK) if 'unknown' in request.GET: base_query = PoultryHatching.objects.filter( trash=False, unknown=True ).select_related( 'poultry__user', 'poultry__address__city', 'poultry__address__province', 'chain_company' ) if request.GET.get('role') == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultry_hatchings = base_query.filter( poultry__city_operator=city_operator.unit_name, poultry__address__province=user.province ) elif request.GET.get('role') in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = base_query.filter( poultry__address__city=user.city ) elif request.GET.get('role') == 'ChainCompany': poultry_hatchings = base_query.filter( chain_company__user=user, poultry__address__province=user.province ) else: poultry_hatchings = base_query.filter( poultry__address__province=user.province ) if 'date1' in request.GET and 'date2' in request.GET: date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() poultry_hatchings = poultry_hatchings.filter( date__date__gte=date1, date__date__lte=date2 ) if 'age1' in request.GET and int(request.GET.get('age2')) > 0: age1 = int(request.GET['age1']) age2 = int(request.GET['age2']) poultry_hatchings = poultry_hatchings.filter( chicken_age__gte=age1, chicken_age__lte=age2 ) if 'search' in request.GET and value and value != 'undefined' and value.strip(): poultry_hatchings = poultry_hatchings.filter( build_query(self.filterset_class, value) ) poultry_hatchings = poultry_hatchings.order_by('-date') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(poultry_hatchings) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(poultry_hatchings, many=True) return Response(serializer.data, status=status.HTTP_200_OK) if 'role' in request.GET: if 'age1' in request.GET and int(request.GET.get('age2')) > 0: age1 = int(request.GET.get('age1')) age2 = int(request.GET.get('age2')) poultry_hatch = PoultryHatching.objects.filter(trash=False, chicken_age__range=(age1, age2), unknown=False) else: if 'date1' in request.GET: date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() poultry_hatch = PoultryHatching.objects.filter(trash=False, date__date__gte=date1, date__date__lte=date2, unknown=False) else: poultry_hatch = PoultryHatching.objects.filter(trash=False, unknown=False) if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) if 'search' in request.GET: if 'chain' in request.GET: if 'archive' in request.GET: queryset = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, has_chain_company=True, poultry__city_operator=city_operator.unit_name ).order_by('-archive_date') else: queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', has_chain_company=True, poultry__city_operator=city_operator.unit_name) else: if 'archive' in request.GET: queryset = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, poultry__city_operator=city_operator.unit_name ).order_by('-archive_date') else: queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', poultry__city_operator=city_operator.unit_name) if request.GET['search'] == 'filter': if value != 'undefined' and value.strip(): poultry_hatchings = queryset.filter( build_query(self.filterset_class, value) ) else: poultry_hatchings = queryset elif 'archive' in request.GET: if 'chain' in request.GET: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, has_chain_company=True, poultry__city_operator=city_operator.unit_name ).order_by('-archive_date') else: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, poultry__city_operator=city_operator.unit_name ).order_by('-archive_date') else: if 'chain' in request.GET: poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, has_chain_company=True, allow_hatching='pending', poultry__city_operator=city_operator.unit_name).order_by( 'date') else: poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, allow_hatching='pending', poultry__city_operator=city_operator.unit_name).order_by( 'date') elif request.GET['role'] == 'ChainCompany': if 'search' in request.GET: if 'chain' in request.GET: if 'archive' in request.GET: queryset = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, has_chain_company=True, chain_company__user=user ).order_by('-archive_date') else: queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', has_chain_company=True, chain_company__user=user) else: if 'archive' in request.GET: queryset = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, chain_company__user=user ).order_by('-archive_date') else: queryset = poultry_hatch.filter(archive=False, allow_hatching='pending', chain_company__user=user) if request.GET['search'] == 'filter': if value != 'undefined' and value.strip(): poultry_hatchings = queryset.filter( build_query(self.filterset_class, value) ) else: poultry_hatchings = queryset elif 'archive' in request.GET: if 'chain' in request.GET: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, has_chain_company=True, chain_company__user=user ).order_by('-archive_date') else: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, chain_company__user=user ).order_by('-date') else: if 'chain' in request.GET: poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, has_chain_company=True, allow_hatching='pending', chain_company__user=user).order_by( 'date') else: poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, allow_hatching='pending', chain_company__user=user).order_by( 'date') else: if 'search' in request.GET: if 'archive' in request.GET: if 'chain' in request.GET: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__city=user.city, has_chain_company=True, ).order_by('-archive_date') else: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, has_chain_company=True, ).order_by('-archive_date') else: if request.GET['role'] in ['CityJahad', 'CityPoultry']: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__city=user.city, trash=False ).order_by('-archive_date') else: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, trash=False ).order_by('-archive_date') else: if 'chain' in request.GET: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', poultry__address__city=user.city, has_chain_company=True, trash=False ) else: poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', poultry__address__province=user.province, has_chain_company=True, trash=False ) else: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', poultry__address__city=user.city, ).order_by('date') else: poultry_hatchings = poultry_hatch.filter(archive=False, allow_hatching='pending', ).order_by('date') if request.GET['search'] == 'filter': poultry_hatchings_list = [] if value != 'undefined' and value.strip(): poultry_hatchings = poultry_hatchings.filter( build_query(self.filterset_class, value) ) else: poultry_hatchings = poultry_hatchings elif 'archive' in request.GET: if 'chain' in request.GET: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__city=user.city, has_chain_company=True, ).order_by('-archive_date') else: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, has_chain_company=True, ).order_by('-archive_date') else: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__city=user.city, ).order_by('-date') else: poultry_hatchings = poultry_hatch.filter( Q(allow_hatching='True', state='complete') | Q(archive=True), poultry__address__province=user.province, ).order_by('-date') else: if 'chain' in request.GET: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter(poultry__address__city=user.city, archive=False, has_chain_company=True, allow_hatching='pending').order_by( 'date') else: poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, archive=False, has_chain_company=True, allow_hatching='pending').order_by( 'date') else: if request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = poultry_hatch.filter(poultry__address__city=user.city, archive=False, allow_hatching='pending').order_by( 'date') else: poultry_hatchings = poultry_hatch.filter(poultry__address__province=user.province, archive=False, allow_hatching='pending').order_by( 'date') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(poultry_hatchings) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(poultry_hatchings, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'illegal' in request.GET: poultry_hatching = PoultryHatching.objects.filter(poultry__address__province=user.province, archive=True).order_by('date') serializer = PoultryHatchingSerializer(poultry_hatching, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'forecast' in request.GET: hatch_quantity = 0 hatch_losses = 0 from datetime import datetime date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() hatchs = PoultryHatching.objects.filter(state='pending', poultry__address__province=user.province) if hatchs.count() > 0: for hatch in hatchs: if date1.year <= hatch.date.year and date1.month <= hatch.date.month and date1.day <= hatch.date.day and hatch.date.year >= date2.year and hatch.date.month >= date2.month and hatch.date.day >= date2.day: hatch_quantity += hatch.quantity - (hatch.quantity * 0.1) hatch_losses += hatch.losses return Response({"hatch_quantity": hatch_quantity, "hatch_losses": hatch_losses}) elif 'filter' in request.GET: now = datetime.now().date() quantity_1_5 = 0 quantity_5_10 = 0 quantity_10_15 = 0 quantity_15_20 = 0 quantity_20_25 = 0 quantity_25_30 = 0 quantity_30_35 = 0 quantity_35_40 = 0 quantity_40_45 = 0 quantity_45_50 = 0 quantity_50_55 = 0 quantity_55_60 = 0 hatching = PoultryHatching.objects.filter(state='pending') if hatching.count() > 0: for hatch in hatching: age = (now - hatch.date.date()).days + 1 if age >= 1 and age <= 5: quantity_1_5 += hatch.quantity elif age >= 5 and age <= 10: quantity_5_10 += hatch.quantity elif age >= 10 and age <= 15: quantity_10_15 += hatch.quantity elif age >= 15 and age <= 20: quantity_15_20 += hatch.quantity elif age >= 20 and age <= 25: quantity_20_25 += hatch.quantity elif age >= 25 and age <= 30: quantity_25_30 += hatch.quantity elif age >= 30 and age <= 35: quantity_30_35 += hatch.quantity elif age >= 35 and age <= 40: quantity_35_40 += hatch.quantity elif age >= 40 and age <= 45: quantity_40_45 += hatch.quantity elif age >= 45 and age <= 50: quantity_45_50 += hatch.quantity elif age >= 50 and age <= 55: quantity_50_55 += hatch.quantity elif age >= 55 and age <= 60: quantity_55_60 += hatch.quantity out_put = { 'quantity_1_5': quantity_1_5, 'quantity_5_10': quantity_5_10, 'quantity_10_15': quantity_10_15, 'quantity_15_20': quantity_15_20, 'quantity_20_25': quantity_20_25, 'quantity_25_30': quantity_25_30, 'quantity_30_35': quantity_30_35, 'quantity_35_40': quantity_35_40, 'quantity_40_45': quantity_40_45, 'quantity_45_50': quantity_45_50, 'quantity_50_55': quantity_50_55, 'quantity_55_60': quantity_55_60, } return Response(out_put, status=status.HTTP_200_OK) elif 'age' in request.GET: poultry = [] poultry_hatching = PoultryHatching.objects.filter(state='pending') now = datetime.now().date() if poultry_hatching.count() > 0: for hatch in poultry_hatching: age = (now - hatch.date.date()).days + 1 if age >= int(request.GET['age1']) and age <= int(request.GET['age2']): if hatch.poultry in poultry: pass else: poultry.append(hatch.poultry) serializer = PoultrySerializer(poultry, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'amar' in request.GET: now = datetime.now().date() total_list = [] l1 = [] chickenbreed_list = ['وارداتی', 'آرین', 'راس', 'آربراکرز(آپلاس)', 'کاب', 'هوبارد', 'ترکیبی'] for city in City.objects.all(): for breed in chickenbreed_list: quantity_1_5 = 0 quantity_1_5_losses = 0 quantity_5_10 = 0 quantity_5_10_losses = 0 quantity_10_15 = 0 quantity_10_15_losses = 0 quantity_15_20 = 0 quantity_15_20_losses = 0 quantity_20_25 = 0 quantity_20_25_losses = 0 quantity_25_30 = 0 quantity_25_30_losses = 0 quantity_30_35 = 0 quantity_30_35_losses = 0 quantity_35_40 = 0 quantity_35_40_losses = 0 quantity_40_45 = 0 quantity_40_45_losses = 0 quantity_45_50 = 0 quantity_45_50_losses = 0 quantity_50_55 = 0 quantity_50_55_losses = 0 quantity_55_60 = 0 quantity_55_60_losses = 0 hatchs = PoultryHatching.objects.filter(state='pending', poultry__address__city=city, chicken_breed=breed) if hatchs.count() > 0: for hatch in hatchs: age = (now - hatch.date.date()).days + 1 if age >= 1 and age <= 5: quantity_1_5 += hatch.quantity quantity_1_5_losses += hatch.losses elif age >= 5 and age <= 10: quantity_5_10 += hatch.quantity quantity_5_10_losses += hatch.losses elif age >= 10 and age <= 15: quantity_10_15 += hatch.quantity quantity_10_15_losses += hatch.losses elif age >= 15 and age <= 20: quantity_15_20 += hatch.quantity quantity_15_20_losses += hatch.losses elif age >= 20 and age <= 25: quantity_20_25 += hatch.quantity quantity_20_25_losses += hatch.losses elif age >= 25 and age <= 30: quantity_25_30 += hatch.quantity quantity_25_30_losses += hatch.quantity elif age >= 30 and age <= 35: quantity_30_35 += hatch.quantity quantity_30_35_losses += hatch.losses elif age >= 35 and age <= 40: quantity_35_40 += hatch.quantity quantity_35_40_losses += hatch.losses elif age >= 40 and age <= 45: quantity_40_45 += hatch.quantity quantity_40_45_losses += hatch.losses elif age >= 45 and age <= 50: quantity_45_50 += hatch.quantity quantity_45_50_losses += hatch.losses elif age >= 50 and age <= 55: quantity_50_55 += hatch.quantity quantity_50_55_losses += hatch.losses elif age >= 55 and age <= 60: quantity_55_60 += hatch.quantity quantity_55_60_losses += hatch.losses internal_dict = { 'quantity_1_5': quantity_1_5, 'quantity_1_5_losses': quantity_1_5_losses, 'quantity_5_10': quantity_5_10, 'quantity_5_10_losses': quantity_5_10_losses, 'quantity_10_15': quantity_10_15, 'quantity_10_15_losses': quantity_10_15_losses, 'quantity_15_20': quantity_15_20, 'quantity_15_20_losses': quantity_15_20_losses, 'quantity_20_25': quantity_20_25, 'quantity_20_25_losses': quantity_20_25_losses, 'quantity_25_30': quantity_25_30, 'quantity_25_30_losses': quantity_25_30_losses, 'quantity_30_35': quantity_30_35, 'quantity_30_35_losses': quantity_30_35_losses, 'quantity_35_40': quantity_35_40, 'quantity_35_40_losses': quantity_35_40_losses, 'quantity_40_45': quantity_40_45, 'quantity_40_45_losses': quantity_40_45_losses, 'quantity_45_50': quantity_45_50, 'quantity_45_50_losses': quantity_45_50_losses, 'quantity_50_55': quantity_50_55, 'quantity_50_55_losses': quantity_50_55_losses, 'quantity_55_60': quantity_55_60, 'quantity_55_60_losses': quantity_55_60_losses, } l1.append({breed: internal_dict}) total_list.append({city.name: l1}) l1 = [] return Response(total_list, status=status.HTTP_200_OK) # list of self poultry houses elif 'key' in request.GET: poultry = Poultry.objects.get(key=request.GET['key'], trash=False) if 'hall' in request.GET: poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, hall=int(request.GET['hall']), state='pending', trash=False).order_by('date') elif 'increase' in request.GET: poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, state='pending', trash=False).order_by('date') else: poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, state='pending', left_over__gt=0, trash=False).order_by('date') elif 'role' in request.GET: if 'age1' in request.GET and int(request.GET.get('age2')) > 0: age1 = int(request.GET.get('age1')) age2 = int(request.GET.get('age2')) poultry_hatch = self.queryset.filter(trash=False, chicken_age__range=(age1, age2)) else: poultry_hatch = self.queryset.filter(trash=False) if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user)) city = city_operator.address.city city_unit_list = [] city_units = CityUnit.objects.filter(city=city) for city in city_units: city_unit_list.append(city.name) poultry_hatching = poultry_hatch.filter(poultry__address__city__name__in=city_unit_list, state__in=('pending', 'complete'), trash=False).order_by( '-create_date') else: poultry_hatching = poultry_hatch.filter(poultry__address__province=user.province, # state__in=('pending', 'complete'), trash=False).order_by( '-create_date') else: user = SystemUserProfile.objects.get(user=request.user, trash=False) poultry = Poultry.objects.filter(user=user, trash=False) if poultry.count() > 1: list1 = [] for p in poultry: list1.append(p.id) poultry_hatching = PoultryHatching.objects.filter(poultry_id__in=list1, trash=False).order_by( 'date') else: poultry_hatching = PoultryHatching.objects.filter(poultry=poultry.last(), trash=False).order_by( 'date') serializer = PoultryHatchingSerializer(poultry_hatching, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) queryset = PoultryHatching.objects.get(key__exact=request.GET["key"], trash=False) vet_farm_inspection = VetFarmInspection.objects.filter(poultry_hatching=queryset, trash=False) poultry_request = PoultryRequest.objects.filter(hatching=queryset, trash=False) if vet_farm_inspection.count() > 0: return Response({"result": "object has inspection"}, status=status.HTTP_400_BAD_REQUEST) elif poultry_request.count() > 0: return Response({"result": "object has poultry_request"}, status=status.HTTP_403_FORBIDDEN) queryset.trash = True queryset.save() # queryset.delete() return Response({"result": "object deleted"}, status=status.HTTP_200_OK) class PoultryHatchingForPredictionViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingForPredictionSerializer pagination_class = CustomPagination filterset_class = PoultryHatchingFilterSet filterset_fields = [ 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__user__mobile', 'poultry__unit_name', 'poultry__address__city__name', 'chicken_age', 'poultry__breeding_unique_id', 'poultry__city_operator', ] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) if 'hatching_list' in request.GET: poultry_hatchings = PoultryHatching.objects.filter( id__in=(request.GET['hatching_list']).split(',')).order_by('date') else: if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', poultry__city_operator=city_operator.unit_name, trash=False).order_by('date') elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', poultry__address__city=user.city, trash=False).order_by('date') else: poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', trash=False).order_by('date') if 'search' in request.GET: hatching_list = [] 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=poultry_hatchings ) ).filter(): ps = self.filterset_class(data=query, queryset=poultry_hatchings) hatching_list = ps.filter() poultry_hatchings = [] if len(hatching_list) == 0 else hatching_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(poultry_hatchings) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(poultry_hatchings, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class PoultryHatchingForPredictionDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingForPredictionSerializer def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', poultry__city_operator=city_operator.unit_name, trash=False).order_by('date') elif request.GET['role'] in ['CityJahad', 'CityPoultry', 'CityVet']: poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', poultry__address__city=user.city, trash=False).order_by('date') else: poultry_hatchings = PoultryHatching.objects.filter(archive=False, allow_hatching='pending', state='pending', trash=False).order_by('date') now_ages = poultry_hatchings.aggregate(total=Sum('now_age'))['total'] or 0 total_hatching_quantity = poultry_hatchings.aggregate(total=Sum('quantity'))['total'] or 0 total_hatching_left_over = poultry_hatchings.aggregate(total=Sum('left_over'))['total'] or 0 ave_now_age = now_ages / len(poultry_hatchings) if len(poultry_hatchings) > 0 else 0 sum_age = 0 ave_age = 0 ave_weight = 0 counter = 0 poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), out_province_request_cancel=False, hatching__in=poultry_hatchings) for poultry_request in poultry_requests: sum_age += (poultry_request.send_date.date() - poultry_request.hatching.date.date()).days + 1 counter += 1 ave_age = int(sum_age / counter) if counter > 0 else 0 province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), province_request__poultry_request__hatching__in=poultry_hatchings, first_car_allocated_quantity=0, return_to_province=False) province_kill_requests_quantity = \ province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0 province_kill_requests_weight = \ province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0 kill_house_requests = KillHouseRequest.objects.filter(trash=False, province_request__poultry_request__hatching__in=poultry_hatchings) kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 kill_house__requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 total_quantity = province_kill_requests_quantity + kill_house_requests_quantity total_weight = province_kill_requests_weight + kill_house__requests_weight ave_weight = round(total_weight / total_quantity, 2) if total_quantity > 0 else 0 result = { "hatchings": len(poultry_hatchings), "total_hatching_quantity": total_hatching_quantity, "total_hatching_left_over": total_hatching_left_over, "ave_age": ave_age, "ave_now_age": ave_now_age, "ave_weight": ave_weight, "province_kill_requests": len(province_kill_requests), "province_kill_requests_quantity": province_kill_requests_quantity, "province_kill_requests_weight": province_kill_requests_weight, "kill_house_requests": len(kill_house_requests), "kill_house_requests_quantity": kill_house_requests_quantity, "kill_house__requests_weight": kill_house__requests_weight, "total_quantity": total_quantity, "total_weight": total_weight } return Response(result, status=status.HTTP_200_OK) class PoultryHatchingForPredictionChartViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingForPredictionSerializer def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) consumption_limit_type = request.GET.get('consumption_limit_type') consumption_limit = request.GET.get('consumption_limit') killing_age_external_type = request.GET.get('killing_age_external_type') killing_age_internal_type = request.GET.get('killing_age_internal_type') killing_age = request.GET.get('killing_age') time_frame_type = request.GET.get('time_frame_type') date1 = request.GET.get('date1') date2 = request.GET.get('date2') date_list = [] final_list = [] poultries = Poultry.objects.filter(killing_ave_age__gt=1, trash=False) if killing_age_external_type == 'poultry_ave_killing_age': if killing_age_internal_type == 'poultry': if time_frame_type == 'all': hatchings = PoultryHatching.objects.filter(trash=False, state='pending', archive=False, temporary_trash=False, temporary_deleted=False, predicate_date__isnull=False) date_list = hatchings.values_list('predicate_date', flat=True).distinct() for date in date_list: n_hatchings = hatchings.filter(predicate_date=date) poultries = Poultry.objects.filter(pk__in=n_hatchings.values_list('poultry', flat=True)) ages = poultries.values_list('killing_ave_age', flat=True).distinct() index_weight = poultries.aggregate(total=Sum('real_killing_ave_weight'))[ 'total'] or 0 quantity = n_hatchings.aggregate(total=Sum('left_over'))[ 'total'] or 0 result = { "date": date, "quantity": quantity, "poultry": len(poultries), "age": ages, "hatchings": n_hatchings.values_list('id', flat=True), "weight": int(quantity * index_weight) if consumption_limit_type in ( 'quantity', 'live_weight') else int((quantity * index_weight) * 0.75), } final_list.append(result) else: date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() hatchings = PoultryHatching.objects.filter(trash=False, state='pending', archive=False, temporary_trash=False, temporary_deleted=False, predicate_date__date__gte=date1, predicate_date__date__lte=date2) # poultries = poultries.filter(date__gte=date1,date__lte=date2).order_by('date') date_list = poultries.values_list('date', flat=True).distinct() for date in date_list: n_hatchings = hatchings.filter(predicate_date__date=date) poultries = Poultry.objects.filter(pk__in=n_hatchings.values_list('poultry', flat=True)) ages = poultries.values_list('killing_ave_age', flat=True).distinct() index_weight = poultries.aggregate(total=Sum('real_killing_ave_weight'))[ 'total'] or 0 quantity = n_hatchings.aggregate(total=Sum('left_over'))[ 'total'] or 0 result = { "date": date, "quantity": quantity, "poultry": len(poultries.filter(date=date)), "age": ages, "hatchings": n_hatchings.values_list('id', flat=True), "weight": int(quantity * index_weight) if consumption_limit_type in ( 'quantity', 'live_weight') else int((quantity * index_weight) * 0.75), } final_list.append(result) else: sum_of_ages = poultries.aggregate(total=Sum('killing_ave_age'))[ 'total'] or 0 ave_killing_age = int(sum_of_ages / len(poultries)) if time_frame_type == 'all': final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type) else: date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1, date2) else: if killing_age_internal_type == 'poultry': if time_frame_type == 'all': final_list = poultry_prediction_helper(int(killing_age), consumption_limit_type) # poultries = poultries.filter(killing_ave_age=int(killing_age)) # date_list = poultries.values_list('date', flat=True).distinct() # for date in date_list: # index_weight = poultries.filter(date=date).aggregate(total=Sum('killing_ave_weight'))[ # 'total'] or 0 # quantity = poultries.filter(date=date).aggregate(total=Sum('active_left_over'))[ # 'total'] or 0 # # result = { # "date": date, # "quantity": quantity, # "poultry": len(poultries.filter(date=date)), # "age": int(killing_age), # "wight": quantity * index_weight, # } # final_list.append(result) else: date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() final_list = poultry_prediction_helper(int(killing_age), consumption_limit_type, date1, date2) # poultries = poultries.filter(killing_ave_age=int(killing_age),date__gte=date1,date__lte=date2) # date_list = poultries.values_list('date', flat=True) # for date in date_list: # index_weight = poultries.filter(date=date).aggregate(total=Sum('killing_ave_weight'))[ # 'total'] or 0 # quantity = poultries.filter(date=date).aggregate(total=Sum('active_left_over'))[ # 'total'] or 0 # # result = { # "date": date, # "quantity": quantity, # "poultry": len(poultries.filter(date=date)), # "age": int(killing_age), # "wight": quantity * index_weight, # } # final_list.append(result) else: ave_killing_age = int(killing_age) if time_frame_type == 'all': final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type) else: date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() final_list = poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1, date2) return Response(final_list) class PoultryTenantViewSet(viewsets.ModelViewSet): queryset = PoultryTenant.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryTenantSerializer # ویوست مربوط به ثبت و نمایش و ... درخواست بورسی مرغدار class PoultryRequestExchangeViewSet(viewsets.ModelViewSet): queryset = PoultryRequestExchange.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryRequestExchangeSerializer filter_backends = [DjangoFilterBackend] filterset_class = PoultryRequestExchangeFilterSet filterset_fields = [ 'quantity', 'send_date', 'chicken_breed', 'Index_weight', 'fee', 'age', ] # تابع مربوط به ثبت درخواست بورسی مرغدار def create(self, request, *args, **kwargs): # refresh(request.user.id) user = UserProfile.objects.get(user=request.user, trash=False) send_date = request.data['send_date'] hatching_date = request.data['hatching_date'] serializer = self.serializer_class(data=request.data) if serializer.is_valid(): poultry_request_exchange = serializer.create(validated_data=request.data) send_date = datetime.strptime(send_date, '%Y-%m-%d %H:%M:%S').date() hatching_date = datetime.strptime(hatching_date, '%Y-%m-%d %H:%M:%S').date() poultry_request_exchange.age = (send_date - hatching_date).days poultry_request_exchange.user = user poultry_request_exchange.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) # تابع مربوط به نمایش درخواست بورسی مرغدار def list(self, request, *args, **kwargs): # refresh(request.user.id) queryset = [] list1 = [] values_item = [] query_list = [] query_dictionary = {} query_list_obj = [] filter_list = [] obj_list = [] q2 = [] if 'operator' in request.GET: if request.GET['operator'] == 'kill_house': chicken_breed = request.GET['chicken_breed'].split(",") send_date1 = request.GET['send_date1'].strip() send_date2 = request.GET['send_date2'].strip() send_date1 = datetime.strptime(send_date1, '%Y-%m-%d').date() send_date2 = datetime.strptime(send_date2, '%Y-%m-%d').date() q = PoultryRequestExchange.objects.filter(chicken_breed__in=chicken_breed, trash=False).order_by( 'fee') for x in q: if x.send_date.date() >= send_date1 and x.send_date.date() <= send_date2: q2.append(x) serializer = self.serializer_class(q2, many=True) return Response(serializer.data) if 'type' in request.GET: if request.GET['type'] == 'filter': if request.GET['value'] != "": d1 = request.GET['value'].split(",") for item in self.filterset_fields: for x in d1: query = QueryDict('{0}__contains={1}'.format(item, x)) if (self.filterset_class(data=query, queryset=self.queryset.all())).filter(): query_list.append(query) for i in query_list: for key, value in i.items(): query_dictionary[key] = value if len(d1) != len(query_dictionary): pass else: for i in PoultryRequestExchange.objects.filter(**query_dictionary): query_list_obj.append(i) if 'age_period' in request.GET: if request.GET['age_period'] != "": age_split = request.GET['age_period'].split(',') for item in self.queryset: if int(age_split[0]) <= item.age <= int(age_split[1]): obj_list.append(item) for i in obj_list: for j in query_list_obj: if i == j: filter_list.append(i) query_list_obj.clear() for i in filter_list: query_list_obj.append(i) serializer = self.serializer_class(query_list_obj, many=True) return Response(serializer.data) return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) queryset = PoultryRequestExchange.objects.all() serializer = self.serializer_class(queryset, many=True) return Response(serializer.data) # ویوست مربوط به تایید یا رد درخواست بورسی رزرو شده توسط کشتارگاه برای درخواست بورسی مرغدار class PoultryRequestExchangeAcceptViewSet(viewsets.ModelViewSet): queryset = PoultryRequestExchangeAccept.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryRequestExchangeAcceptSerializer # تابع مربوط به تایید یا رد درخواست بورسی رزرو شده توسط کشتارگاه برای درخواست بورسی مرغدار def create(self, request, *args, **kwargs): # refresh(request.user.id) poultry_exchange = PoultryRequestExchange.objects.get(key=request.data['poultry_request_key'], trash=False) kill_house_exchange_reserve = KillHouseRequestExchangeReserve.objects.get( key=request.data['kill_house_request_key'], trash=False) request.data.pop('poultry_request_key') request.data.pop('kill_house_request_key') serializer = self.serializer_class(data=request.data) if serializer.is_valid(): poultry_request_exchange_accept = serializer.create(validated_data=request.data) poultry_request_exchange_accept.poultry_request_exchange = poultry_exchange poultry_request_exchange_accept.kill_house_request_exchange_reserve = kill_house_exchange_reserve poultry_request_exchange_accept.save() if poultry_request_exchange_accept.state == 'accepted': poultry_exchange.quantity -= kill_house_exchange_reserve.quantity poultry_exchange.state = 'pending' poultry_exchange.save() kill_house_exchange_reserve.state = 'accepted' else: kill_house_exchange_reserve.state = 'rejected' kill_house_exchange_reserve.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) # ویوست مربوط به ثبت و نمایش و ... درخواست مرغدار class PoultryRequestForLetterViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): date = datetime.datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date() poultry_requests = PoultryRequest.objects.filter(send_date__date=date, quantity__gt=F('remain_quantity'), trash=False) serializer = PoultryRequestLetterTotalSerializer(poultry_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class CancelOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] def update(self, request, pk=None, *args, **kwargs): date = datetime.datetime.now() user = SystemUserProfile.objects.get(user=request.user, trash=False) role = request.data['role'] poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) if poultry_request.quarantine_code != None: return Response({"result": "به علت ورود کد قرنطینه امکان لغو وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) if poultry_request.wage_pay == True: return Response({"result": "به علت پرداخت امکان لغو وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) poultry_request.out_province_request_cancel = True poultry_request.out_province_request_canceller = { "role": role, "fullname": user.fullname, "mobile": user.mobile, "date": str(date), } poultry_request.save() if poultry_request.province_state == 'accepted': hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) hatching.out_province_killed_weight -= int(poultry_request.quantity * poultry_request.Index_weight) hatching.out_province_killed_quantity -= poultry_request.quantity hatching.save() return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) class OutProvincePoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestoutProvinceSerializer permission_classes = [TokenHasReadWriteScope] pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = PoultryRequestFilterSet filterset_fields = [ 'order_code', 'poultry__user__mobile', 'poultry__user__fullname', 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__address__city__name', ] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() state = request.GET['state'] date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if request.GET['role'] == 'VetFarm': vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) poultries = Poultry.objects.filter( pk__in=vet_farms.values('poultry') ) if state == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, trash=False).order_by('-send_date') elif request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) if state == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: if state == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: if request.GET['state'] == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='rejected', province_state='rejected', has_wage=True, wage_pay=False, out_province_request_cancel=True, archive=True) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=True), send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') if 'search' in request.GET: poultry_request_list = [] 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=poultry_requests ) ).filter(): ps = self.filterset_class(data=query, queryset=poultry_requests) poultry_request_list = ps.filter() poultry_requests = [] if len(poultry_request_list) == 0 else poultry_request_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(poultry_requests) if page is not None: serializer = PoultryRequestoutProvinceSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def update(self, request, pk=None, *args, **kwargs): poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) poultry_request.out_province_driver_info['driverhealthCode'] = request.data['driver_health_code'] poultry_request.save() return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) class OutProvincePoultryRequestDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestoutProvinceSerializer permission_classes = [TokenHasReadWriteScope] filter_backends = [DjangoFilterBackend] filterset_class = PoultryRequestFilterSet filterset_fields = [ 'order_code', 'poultry__user__mobile', 'poultry__user__fullname', 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__address__city__name', ] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) if request.GET['role'] == 'VetFarm': vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) poultries = Poultry.objects.filter( pk__in=vet_farms.values('poultry') ) poultry_requests = PoultryRequest.objects.filter( poultry__in=poultries, out=True, temporary_trash=False, temporary_deleted=False, trash=False).order_by('-send_date') elif request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) poultry_requests = PoultryRequest.objects.filter( poultry__city_operator=city_operator.unit_name, temporary_trash=False, temporary_deleted=False, out=True, trash=False).order_by('-send_date') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultry_requests = PoultryRequest.objects.filter( poultry__address__city=user.city, temporary_trash=False, temporary_deleted=False, out=True, trash=False).order_by('-send_date') elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']: poultry_requests = PoultryRequest.objects.filter( out=True, temporary_trash=False, temporary_deleted=False, trash=False).order_by('-send_date') 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 = poultry_requests.filter(send_date__date__gte=date1, send_date__date__lte=date2) if 'search' in request.GET: poultry_request_list = [] 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=poultry_requests ) ).filter(): ps = self.filterset_class(data=query, queryset=poultry_requests) poultry_request_list = ps.filter() poultry_requests = [] if len(poultry_request_list) == 0 else poultry_request_list poultry = Poultry.objects.filter(trash=False, pk__in=poultry_requests.values_list('poultry', flat=True)) total_out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_out_province_poultry_request_weight = \ poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ 'total'] or 0 accepted_poultry_requests_with_out_wage = poultry_requests.filter( state_process='accepted', province_state='accepted', final_state='archive', out_province_request_cancel=False, has_wage=False, wage_pay=False, ) total_accepted_poultry_request_quantity_with_out_wage = \ accepted_poultry_requests_with_out_wage.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_accepted_poultry_request_weight_with_out_wage = \ accepted_poultry_requests_with_out_wage.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ 'total'] or 0 paid_poultry_requests = poultry_requests.filter( state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True, out_province_request_cancel=False ) total_paid_poultry_request_quantity = paid_poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_paid_poultry_request_weight = \ paid_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ 'total'] or 0 result = { "poultries": len(poultry), "total_number_of_poultry_request": len(poultry_requests), "total_poultry_request_quantity": total_out_province_poultry_request_quantity, "total_poultry_request_weight": total_out_province_poultry_request_weight, "total_number_of_accepted_poultry_request_with_out_wage": len(accepted_poultry_requests_with_out_wage), "total_accepted_poultry_request_quantity_with_out_wage": total_accepted_poultry_request_quantity_with_out_wage, "total_accepted_poultry_request_weight_with_out_wage": total_accepted_poultry_request_weight_with_out_wage, "total_number_of_accepted_poultry_request_with_wage": len(paid_poultry_requests), "total_accepted_poultry_request_quantity_with_wage": total_paid_poultry_request_quantity, "total_accepted_poultry_request_weight_with_wage": total_paid_poultry_request_weight, "total_number_of_accepted_poultry_request": len(accepted_poultry_requests_with_out_wage) + len( paid_poultry_requests), "total_accepted_poultry_request_quantity": total_paid_poultry_request_quantity + total_accepted_poultry_request_quantity_with_out_wage, "total_accepted_poultry_request_weight": total_paid_poultry_request_weight + total_accepted_poultry_request_weight_with_out_wage, } return Response(result, status=status.HTTP_200_OK) class ParentCompanyOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestoutProvinceSerializer permission_classes = [AllowAny] pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = PoultryRequestFilterSet filterset_fields = [ 'order_code', 'poultry__user__mobile', 'poultry__user__fullname', 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__address__city__name', ] def list(self, request, *args, **kwargs): state = request.GET['state'] date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if request.GET['state'] == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='rejected', province_state='rejected', has_wage=True, wage_pay=False, out_province_request_cancel=True, archive=True) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=True), send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') if 'search' in request.GET: poultry_request_list = [] 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=poultry_requests ) ).filter(): ps = self.filterset_class(data=query, queryset=poultry_requests) poultry_request_list = ps.filter() poultry_requests = [] if len(poultry_request_list) == 0 else poultry_request_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(poultry_requests) if page is not None: serializer = PoultryRequestoutProvinceSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class TemporaryOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestoutProvinceSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if request.GET['role'] == 'VetFarm': vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) poultries = Poultry.objects.filter( pk__in=vet_farms.values('poultry') ) poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, out_province_request_cancel=False, trash=False).order_by('-send_date') elif request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']: poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') serializer = PoultryRequestoutProvinceSerializer(poultry_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def update(self, request, pk=None, *args, **kwargs): poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) poultry_request.out_province_driver_info['driverhealthCode'] = request.data['driver_health_code'] poultry_request.save() return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) class PoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer pagination_class = CustomPagination permission_classes = [TokenHasReadWriteScope] filter_backends = [DjangoFilterBackend] # filterset_class = PoultryRequestFilterSet filterset_fields = [ 'order_code', 'poultry__user__mobile', 'poultry__user__fullname', 'poultry__user__first_name', 'poultry__user__last_name', 'poultry__address__city__name', ] # تابع مربوط به ثبت درخواست مرغدار def create(self, request, *args, **kwargs): request_buyer = None traffic_codes = None vet = None if 'kill_req_key' in request.data.keys(): if request.data['kill_req_key'] is not None: kill_request = KillRequest.objects.get(key=request.data['kill_req_key']) if request.data['quantity'] > (kill_request.kill_capacity - kill_request.remain_quantity_for_poultry): return Response({"result": "تعداد وارد شده از باقی مانده ظرفیت کشتارگاه انتخابی بیشتر است!"}, status=status.HTTP_403_FORBIDDEN) kill_request.remain_quantity_for_poultry += request.data['quantity'] kill_request.save() request.data.pop('kill_req_key') wage_type = WageType.objects.filter(en_name='poultry-sell-out-province', trash=False).first() time_range = TimeRange.objects.filter(trash=False).first() if time_range: time = next( (t for t in time_range.time_range if t.get("name") == "poultry_request" and t.get("active", False)), None) if time: start_hour = datetime.datetime.strptime(time.get("start", 0), "%H:%M:%S").time() end_hour = datetime.datetime.strptime(time.get("end", 0), "%H:%M:%S").time() current_hour = datetime.datetime.now().time().replace(second=0, microsecond=0) if not (start_hour < current_hour < end_hour): return Response( {"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"}, status=status.HTTP_403_FORBIDDEN) user = SystemUserProfile.objects.get(user=request.user, trash=False) last_poultry_request = PoultryRequest.objects.all() if last_poultry_request.count() > 0: general_order_code = last_poultry_request.last().general_order_code + 1 else: general_order_code = 1 now_request_date = datetime.datetime.now().date() now = datetime.datetime.now().time() now_hour = HourLimit.objects.all() if now_hour.count() > 0: now_hour = now_hour.last() if now_hour.active == True: request_date = datetime.datetime.strptime(request.data['send_date'], '%Y-%m-%d').date() if request_date.year >= now_request_date.year and request_date.month >= now_request_date.month and request_date.day > now_request_date.day: pass else: if now.hour >= now_hour.hour: text = 'زمان ثبت درخواست کشتار درامروز تا ساعت {0} بوده است. شما میتوانید برای تاریخ های آینده درخواست ثبت نمایید ! '.format( now_hour.hour) if 'role' not in request.data.keys(): return Response({'result': text}, status=status.HTTP_403_FORBIDDEN) poultry_hatching = PoultryHatching.objects.get(key=request.data['poultry_hatching_key'], trash=False) vet = VetFarm.objects.filter(poultry=poultry_hatching.poultry, trash=False).last() free_sale_with_province = FreeSaleWithinprovince.objects.filter(trash=False).first() if poultry_hatching.poultry.order_limit: return Response( {"result": "امکان ثبت کشتار برای مرغدار وجود ندارد جهت اطلاعات بیشتر بااتحادیه استان خود هماهنگ کنید!"}, status=status.HTTP_403_FORBIDDEN) # if RequestLimitation.objects.filter(trash=False).first().limitation: # if ('out' in request.data.keys() and request.data['out'] == True) or ( # 'free_sale_in_province' in request.data.keys() and request.data['free_sale_in_province'] == True): # free_sale_state = FreeSaleWithinprovince.objects.filter(trash=False).first() # if free_sale_state and free_sale_state.allow: # percent = (free_sale_state.percent - 10)/100 # govermental_quantity = percent * poultry_hatching.quantity # govermental_poultry_requests = PoultryRequest.objects.filter(state_process__in=('pending','accepted'),province_state__in=('pending','accepted'),out=False,free_sale_in_province=False, trash=False, hatching=poultry_hatching) # govermental_poultry_requests_sum = \ # govermental_poultry_requests.aggregate(total=Sum('quantity'))[ # 'total'] or 0 # if govermental_poultry_requests_sum < govermental_quantity: # return Response({"result": "امکان فروش آزاد تا تکمیل تعهد دولتی وجود ندارد!"}, # status=status.HTTP_403_FORBIDDEN) # Q(direct_buying=True) | Q(out=True, wage_pay=True) | Q(free_sale_in_province=True), # state_process='accepted', province_state='accepted', trash=False, hatching=poultry_hatching) if free_sale_with_province.allow == True: if ('out' in request.data.keys() and request.data['out'] == True) or ( 'free_sale_in_province' in request.data.keys() and request.data['free_sale_in_province'] == True): poultry_requests_for_free_sale = PoultryRequest.objects.filter( Q(direct_buying=True) | Q(out=True, wage_pay=True) | Q(free_sale_in_province=True), state_process='accepted', province_state='accepted', trash=False, hatching=poultry_hatching) poultry_requests_for_free_sale_sum = poultry_requests_for_free_sale.aggregate(total=Sum('quantity'))[ 'total'] or 0 if poultry_requests_for_free_sale_sum + request.data[ 'quantity'] > poultry_hatching.total_free_commitment_quantity: return Response({"result": "مجموع حجم کشتار آزاد از حجم کل تعهد آزاد بیشتر است "}, status=status.HTTP_403_FORBIDDEN) if 'role' in request.data.keys() and request.data['role'] not in ('AdminX', 'SuperAdmin'): age_range = ChickenAgeRange.objects.filter(trash=False).first() if age_range.active == True: chicken_age = (datetime.datetime.strptime(request.data['send_date'], '%Y-%m-%d').date() - poultry_hatching.date.date()).days + 1 if chicken_age < age_range.minimum or chicken_age > age_range.maximum: return Response( {"result": "به علت استاندارد نبودن سن مرغ برای کشتار امکان ثبت درخواست وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) if 'role' in request.data.keys(): role = request.data['role'] poultry_object = Poultry.objects.get(key=request.data['poultry_key']) request.data.pop('role') request.data.pop('poultry_key') if role == 'CityOperator': city_operator = CityOperator.objects.get(user=user, trash=False) if city_operator.unit_name != poultry_object.city_operator: poultry_city = poultry_object.city_operator return Response({"result": "مرغدار زیر مجموعه {0} است !".format(poultry_city)}, status=status.HTTP_403_FORBIDDEN) else: role = None poultry_object = None if 'operator_key' in request.data.keys(): if request.data['operator_key'] == None or request.data['operator_key'] == "": c_operator = None else: c_operator = CityOperator.objects.get(key=request.data['operator_key']) request.data.pop('operator_key') else: c_operator = None auction_list = request.data['auction_list'] request.data.pop('poultry_hatching_key') request.data.pop('auction_list') if auction_list != None: for auction in auction_list: pricing = Pricing.objects.get(key=auction['pricing_key'], trash=False) if pricing.ceiling_price < int(auction['fee']): return Response({"result": "fee is more than celling price"}, status=status.HTTP_403_FORBIDDEN) if role != None: poultry = poultry_object user = SystemUserProfile.objects.get(key=poultry_object.user.key, trash=False) else: poultry = Poultry.objects.get(id=poultry_hatching.poultry.id, trash=False) user = SystemUserProfile.objects.get(user=request.user, trash=False) poultry_requests = PoultryRequest.objects.filter(poultry__user=poultry.user, trash=False).order_by( 'create_date') if poultry_hatching.left_over < int(request.data['quantity']) or poultry_hatching.left_over < int( request.data['quantity']) + int(request.data['losses']): return Response({"result": "تعداد درخواست از باقی مانده سالن بیشتر است!"}, status=status.HTTP_403_FORBIDDEN) cash = request.data['cash'] credit = request.data['credit'] request.data.pop('cash') request.data.pop('credit') dict1 = {} new_date = datetime.datetime.strptime(request.data['send_date'], '%Y-%m-%d').date() change_date = datetime.datetime(year=new_date.year, month=new_date.month, day=new_date.day, hour=now.hour, minute=now.minute, second=now.second) request.data.pop('send_date') if 'out_province_poultry_request_buyer_key' in request.data.keys(): if request.data['out_province_poultry_request_buyer_key'] != None: request_buyer = OutProvincePoultryRequestBuyer.objects.get( key=request.data['out_province_poultry_request_buyer_key']) out_province_request_limitation = PoultryOutProvinceRequest.objects.filter(trash=False).first() if role and role not in ('AdminX', 'SuperAdmin'): if out_province_request_limitation: if out_province_request_limitation.allow: out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, hatching=poultry_hatching, out_province_request_cancel=False, state_process__in=( 'pending', 'accepted'), province_state__in=( 'pending', 'accepted')) out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 if poultry_hatching.quantity * ( out_province_request_limitation.limitation / 100) < out_poultry_requests_quantity + \ request.data['quantity']: return Response( {"result": " تعداد وارد شده بیشتر از ظرفیت فروش به خارج استان برای مرغدار است ! "}, status=status.HTTP_403_FORBIDDEN) # request.data.pop('out_province_poultry_request_buyer_key') if wage_type and wage_type.status == False: request.data.pop('payer_type') request.data.pop('poultry_mobile') request.data.pop('buyer_mobile') else: if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: if poultry_hatching.poultry.user.mobile != request.data['poultry_mobile']: first_mobile_number = poultry_hatching.poultry.user.mobile second_mobile_number = request.data['poultry_mobile'] system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) poultry_user = User.objects.get(id=system_user_profile.user.id) if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: poultry_user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() elif 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: if request_buyer.user.mobile != request.data['buyer_mobile']: first_mobile_number = request_buyer.user.mobile second_mobile_number = request.data['buyer_mobile'] system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) buyer_user = User.objects.get(id=system_user_profile.user.id) if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: buyer_user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() request_buyer.mobile = second_mobile_number request_buyer.save() request.data.pop('poultry_mobile') request.data.pop('buyer_mobile') request.data.pop('out_province_poultry_request_buyer_key') if 'confirm_poultry_mobile' in request.data.keys(): if request.data.get('confirm_poultry_mobile') != "": first_mobile_number = poultry.user.mobile second_mobile_number = request.data['confirm_poultry_mobile'] if first_mobile_number != second_mobile_number: system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) system_person = SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False) if system_person: return Response({"result": f'این شماره در سامانه به نام {system_person.first().fullname} است'}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: system_user_profile.user.username = second_mobile_number system_user_profile.user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() request.data.pop('confirm_poultry_mobile') if 'traffic_codes' in request.data: traffic_codes = request.data.get('traffic_codes', []) request.data.pop('traffic_codes') if 'market' in request.data and request.data['market']: if MarketDailyLimitation.objects.filter(active=True).exists(): market_result = market_daily_limitation_info() if request.data['quantity'] > market_result['remain_quantity']: return Response({"result": "تعداد وارد شده از باقی مانده سقف کشتار معاملات بیشتر است!"}, status=status.HTTP_403_FORBIDDEN) serializer = self.serializer_class(data=request.data) if serializer.is_valid(): poultry_request = serializer.create(validated_data=request.data) price_confirmation = PriceConfirmation.objects.filter(trash=False).first() price_confirmation = price_confirmation.poultry_status if price_confirmation else False poultry_request.general_order_code = general_order_code poultry_request.send_date = change_date poultry_request.killing_age = (poultry_request.send_date.date() - poultry_hatching.date.date()).days + 1 if request_buyer != None: poultry_request.out_province_poultry_request_buyer = request_buyer poultry_request.buyer_mobile = request_buyer.mobile poultry_request.buyer_fullname = request_buyer.fullname poultry_request.buyer_city = request_buyer.city poultry_request.buyer_province = request_buyer.province if int(poultry_request.losses) > 0: poultry_hatching.losses += int(poultry_request.losses) poultry_hatching.save() poultry_request.poultry = poultry poultry_request.hatching = poultry_hatching if vet: poultry_request.vet_farm = vet.vet city = poultry.address.city.name city_unit = CityUnit.objects.filter(name=city, trash=False) if c_operator != None: main_operator = c_operator.user.first_name + " " + c_operator.user.last_name city_operator_user = c_operator else: if city_unit.count() > 0: city_operator_user = CityOperator.objects.filter(address__city__name=city_unit[0].city.name, trash=False) if city_operator_user.count() > 0: city_operator_user = city_operator_user.last() else: city_operator_user = CityOperator.objects.filter(address__city__province_center=True, trash=False) city_operator_user = city_operator_user.last() else: city_operator_user = CityOperator.objects.filter(address__city__name=city, trash=False) if city_operator_user.count() > 0: city_operator_user = city_operator_user.last() else: city_operator_user = CityOperator.objects.filter(address__city__province_center=True, trash=False) city_operator_user = city_operator_user.last() main_operator = city_operator_user.user.first_name + " " + city_operator_user.user.last_name poultry_request.state = { "city_operator": main_operator, "city_state": poultry_request.state_process, "city_operator_mobile": city_operator_user.user.mobile, "province_operator": "", "province_state": "" } if poultry_requests.count() > 0: poultry_request.order_code = poultry_requests.last().order_code + 1 else: poultry_request.order_code = int(str(user.base_order) + '0001') poultry_request.save() if len(auction_list) > 0: for auction in auction_list: poultry_request_auction = PoultryRequestAuction( poultry_request=poultry_request, pricing=Pricing.objects.all().last(), fee=auction['fee'], hour=auction['hour'] ) poultry_request_auction.save() dict1.update({ 'cash': cash, 'credit': credit }) poultry_request.cell_type = dict1 poultry_request.city_operator = city_operator_user if role != None: system_user = SystemUserProfile.objects.get(user=request.user, trash=False) poultry_request.registrar = { "role": role, "fullname": system_user.fullname, "date": str(poultry_request.create_date) } if poultry_request.out_province_poultry_request_buyer != None: poultry_request.out = True # if role != None and role == 'ProvinceOperator': # poultry_request.state_process = 'accepted' # poultry_request.province_state = 'accepted' # poultry_request.final_state = 'archive' poultry_request.previous_quantity = int(request.data['quantity']) poultry_request.remain_quantity = int(request.data['quantity']) poultry_request.first_quantity = int(request.data['quantity']) poultry_request.save() message = UserMessage(message="درخواست شما با کد سفارش {0} در انتطار تایید کارشناس شهرستان/{1}".format( poultry_request.order_code, main_operator)) message.save() message.users.add(user) vet_farm = VetFarm.objects.filter(poultry=poultry_hatching.poultry, hall=poultry_hatching.hall, state='pending') if vet_farm.count() > 0: vet_farm = vet_farm.last() inspections = VetFarmInspection.objects.filter(vet_farm=vet_farm, hall=vet_farm.hall, state='pending') for inspection in inspections: inspection.state = 'complete' inspection.save() vet_farm.save() if SmsLicense.objects.filter(poultry_request=True).exists(): province_operator = ProvinceOperator.objects.filter( user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) if province_operator.count() > 0: province_operator = province_operator.last() poultry_fullname = poultry_request.poultry.unit_name poultry_mobile = poultry_request.poultry.user.mobile quantity = poultry_request.quantity chicken_breed = poultry_request.chicken_breed order_code = poultry_request.order_code request_kill_house = poultry_request.kill_house_list[0] if poultry_request.kill_house_list else "-" date_str = poultry_request.send_date send_date = datetime.datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, day=send_date.day).strftime('%Y-%m-%d') date_list = reversed(send_date.split('-')) separate = "-" send_date = separate.join(date_list) province_operator_mobile = province_operator.user.mobile sms_operator_poultry_request_sms = threading.Thread(target=operator_poultry_request_sms, args=( province_operator_mobile, poultry_fullname, quantity, chicken_breed, order_code, send_date, poultry_request.free_sale_in_province, poultry_request.amount, request_kill_house, poultry_mobile)) sms_operator_poultry_request_sms.start() if poultry_request.out_province_poultry_request_buyer != None: vet = VetFarm.objects.filter(trash=False, poultry=poultry_request.poultry).first() vet_number = vet.vet.user.mobile if vet else None if wage_type and wage_type.status == False: sms_operator_out_poultry_request_sms = threading.Thread(target=operator_out_poultry_request_sms, args=( province_operator_mobile, poultry_fullname, quantity, chicken_breed, order_code, send_date, poultry_request.free_sale_in_province, poultry_request.amount, vet_number )) sms_operator_out_poultry_request_sms.start() if role != None and role == 'ProvinceOperator' and poultry_request.out == False: city_operator_check_request = CityOperatorCheckRequest( city_operator_system=poultry_request.city_operator, poultry_request=poultry_request, state='accept', province_accept=True, province_state='accept', allow_hatching=True ) city_operator_check_request.save() province_operator = ProvinceOperator.objects.filter( user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province)) if province_operator.count() > 0: province_operator = province_operator.last() check = ProvinceCheckOperatorRequest( province_operator_system=province_operator, poultry_request=poultry_request, city_request_Poultry=city_operator_check_request, quantity=poultry_request.quantity, state='accept', ) check.save() poultry_request.state_process = 'accepted' poultry_request.province_state = 'accepted' if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': poultry_request.archive = True poultry_request.save() elif role != None and role == 'CityOperator' and poultry_request.out == False: city_operator_check_request = CityOperatorCheckRequest( city_operator_system=poultry_request.city_operator, poultry_request=poultry_request, state='accept', province_accept=False, province_state='pending', allow_hatching=True ) city_operator_check_request.save() poultry_request.state_process = 'accepted' if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': poultry_request.archive = True poultry_request.save() else: if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': city_operator_check_request = CityOperatorCheckRequest( city_operator_system=poultry_request.city_operator, poultry_request=poultry_request, state='accept', province_accept=False, province_state='pending', allow_hatching=True ) city_operator_check_request.save() if poultry_request.city_operator.address.city.name == 'فاقد شهرستان': poultry_request.archive = True poultry_request.state_process = 'accepted' poultry_request.save() if poultry_request.out == True: if wage_type and wage_type.status == True: poultry_request.has_wage = True if poultry_request.payer_type == 'buyer': poultry_request.payer_fullname = poultry_request.out_province_poultry_request_buyer.fullname else: poultry_request.payer_fullname = poultry_request.poultry.user.fullname poultry_request.save() wage = wage_type.amount poultry_request.wage = wage percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0, trash=False) if percentages_wage_type: poultry_request.total_wage_amount = int( (poultry_request.Index_weight * poultry_request.quantity) * wage) # fine = FinePermission.objects.filter(trash=False).first() # time_for_fine = datetime.datetime.now() # time_for_fine = time_for_fine.replace(second=0, microsecond=0).time() # if fine.out_poultry_request: # if fine.out_poultry_request_start_time < time_for_fine < fine.out_poultry_request_end_time: # poultry_request.fine = True # poultry_request.fine_amount = fine.out_poultry_request_fine_coefficient * poultry_request.total_wage_amount # poultry_request.fine_coefficient = fine.out_poultry_request_fine_coefficient for percentage_wage_type in percentages_wage_type: if percentage_wage_type.share_type.en_name == 'union': poultry_request.union_share = int( (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) poultry_request.union_share_percent = percentage_wage_type.percent poultry_request.save() elif percentage_wage_type.share_type.en_name == 'company': poultry_request.company_share = int( (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) poultry_request.company_share_percent = percentage_wage_type.percent poultry_request.save() elif percentage_wage_type.share_type.en_name == 'guilds': poultry_request.guilds_share = int( (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) poultry_request.guilds_share_percent = percentage_wage_type.percent poultry_request.save() elif percentage_wage_type.share_type.en_name == 'city': poultry_request.city_share = int( (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) poultry_request.city_share_percent = percentage_wage_type.percent poultry_request.save() elif percentage_wage_type.share_type.en_name == 'wallet': poultry_request.wallet_share = int( (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) poultry_request.wallet_share_percent = percentage_wage_type.percent poultry_request.save() else: poultry_request.other_share = int( (percentage_wage_type.percent / 100) * poultry_request.total_wage_amount) poultry_request.other_share_percent = percentage_wage_type.percent poultry_request.save() # poultry_prediction(poultry_hatching.poultry) if price_confirmation and not poultry_request.out: poultry_fullname = poultry_request.poultry.unit_name poultry_mobile = poultry_request.poultry.user.mobile quantity = poultry_request.quantity chicken_breed = poultry_request.chicken_breed order_code = poultry_request.order_code request_kill_house = poultry_request.kill_house_list[0] if poultry_request.kill_house_list else "-" date_str = poultry_request.send_date send_date = datetime.datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, day=send_date.day).strftime('%Y-%m-%d') date_list = reversed(send_date.split('-')) separate = "-" send_date = separate.join(date_list) # poultry_fullname = poultry_request.poultry.unit_name # poultry_mobile = poultry_request.poultry.user.mobile # quantity = poultry_request.quantity # chicken_breed = poultry_request.chicken_breed # date_str = poultry_request.send_date # send_date = datetime.datetime.strptime(str(date_str), '%Y-%m-%d %H:%M:%S').date() # send_date = jdatetime.datetime.fromgregorian(year=send_date.year, month=send_date.month, # day=send_date.day).strftime('%Y-%m-%d') # date_list = reversed(send_date.split('-')) # separate = "-" # send_date = separate.join(date_list) # confirm_code = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5)) confirm_code = str(random.randint(10000, 99000)) confirm_price_poultry_request = threading.Thread(target=confirm_price_poultry_request_sms, args=( poultry_mobile, poultry_fullname, quantity, chicken_breed, order_code, send_date, poultry_request.free_sale_in_province, poultry_request.amount, request_kill_house, confirm_code)) confirm_price_poultry_request.start() poultry_request.price_confirmation_code = confirm_code poultry_request.price_confirmation = True poultry_request.save() if poultry_request.market == True: send_sms_for_poultry_market(poultry_request) create_update_chicken_commission_prices() if traffic_codes and isinstance(traffic_codes, list): codes_to_create = [] now = datetime.datetime.now() for traffic_code in traffic_codes: if traffic_code and str(traffic_code).strip(): codes_to_create.append( PoultryRequestQuarantineCode( poultry_request=poultry_request, traffic_code=str(traffic_code).strip(), registrar=user.fullname, register_date=now ) ) if codes_to_create: PoultryRequestQuarantineCode.objects.bulk_create(codes_to_create) serializer_request = self.serializer_class(poultry_request) return Response(serializer_request.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) # تابع مربوط به ویرایش درخواست ثبت شده مرغدار def update(self, request, pk=None, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) if 'confirmation_code' in request.data.keys(): poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) if poultry_request.price_confirmation_code != request.data['confirmation_code']: return Response({"result": "کد وارد شده صحیح نمی باشد!"}, status=status.HTTP_403_FORBIDDEN) poultry_request.input_price_confirmation_code = request.data['confirmation_code'] poultry_request.save() return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK) if 'quarantine_code' in request.data.keys(): poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) date_time_of_now = datetime.datetime.now().date() if OperationLimitation.objects.all().first().vet_farm_out_province_limitation == True: if date_time_of_now > poultry_request.send_date.date() + timedelta(days=1): return Response( {"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"}, status=status.HTTP_403_FORBIDDEN) if PoultryRequest.objects.filter(quarantine_code=request.data['quarantine_code'], trash=False).exists(): return Response({"result": "کد وارد شده تکراری میباشد!"}, status=status.HTTP_403_FORBIDDEN) poultry_request.quarantine_code = request.data['quarantine_code'] poultry_request.quarantine_code_registrar = { "role": request.data['role'], "fullname": user.fullname, "mobile": user.mobile, "date": str(datetime.datetime.now().date()), } poultry_request.save() get_gid_poultry_request(poultry_request.id) return Response({"result": "با موفقیت ثیت شد"}, status=status.HTTP_200_OK) if 'edit' in request.data.keys(): poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) request.data.pop('poultry_request_key') hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False) if 'out_province_poultry_request_buyer_key' in request.data.keys(): request_buyer = OutProvincePoultryRequestBuyer.objects.get( key=request.data['out_province_poultry_request_buyer_key']) poultry_request.out_province_poultry_request_buyer = request_buyer poultry_request.buyer_mobile = request_buyer.mobile poultry_request.buyer_fullname = request_buyer.fullname poultry_request.buyer_city = request_buyer.city poultry_request.buyer_province = request_buyer.province request.data.pop('out_province_poultry_request_buyer_key') if 'quantity' in request.data.keys(): if poultry_request.market: if MarketDailyLimitation.objects.filter(active=True).exists(): market_result = market_daily_limitation_info() if int(request.data['quantity']) > poultry_request.quantity: diff_quantity = int(request.data['quantity']) - poultry_request.quantity if diff_quantity > market_result['remain_quantity']: return Response({"result": "تعداد وارد شده از باقی مانده سقف کشتار معاملات بیشتر است!"}, status=status.HTTP_403_FORBIDDEN) if poultry_request.out: out_province_request_limitation = PoultryOutProvinceRequest.objects.filter(trash=False).first() if out_province_request_limitation: if out_province_request_limitation.limitation_status: out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, hatching=poultry_request.hatching, out_province_request_cancel=False, state_process__in=( 'pending', 'accepted'), province_state__in=( 'pending', 'accepted')).exclude( id=poultry_request.id) out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 if poultry_request.hatching.quantity * ( out_province_request_limitation.limitation / 100) < out_poultry_requests_quantity + \ int(request.data['quantity']): return Response( {"result": " تعداد وارد شده بیشتر از ظرفیت فروش به خارج استان برای مرغدار است ! "}, status=status.HTTP_403_FORBIDDEN) if int(request.data['quantity']) > poultry_request.quantity: diffrent_quantity = int(request.data['quantity']) - poultry_request.quantity if hatching.left_over < diffrent_quantity: return Response({"result": "تعداد وارد شده از باقی مانده جوجه ریزی بیشتر است !"}, status=status.HTTP_403_FORBIDDEN) if poultry_request.out == True and poultry_request.province_state == 'accepted': hatching.out_province_killed_quantity += diffrent_quantity hatching.out_province_killed_weight += int(diffrent_quantity * poultry_request.Index_weight) hatching.save() elif int(request.data['quantity']) < poultry_request.quantity: if poultry_request.out == True and poultry_request.province_state == 'accepted': diffrent_quantity = poultry_request.quantity - int(request.data['quantity']) hatching.out_province_killed_quantity -= diffrent_quantity hatching.out_province_killed_weight -= int(diffrent_quantity * poultry_request.Index_weight) hatching.save() poultry_request.remain_quantity = int(request.data['quantity']) poultry_request.save() if 'poultry_mobile' in request.data.keys() and request.data['poultry_mobile'] is not None: if poultry_request.poultry.user.mobile != request.data['poultry_mobile']: first_mobile_number = poultry_request.poultry.user.mobile second_mobile_number = request.data['poultry_mobile'] system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) poultry_user = User.objects.get(id=system_user_profile.user.id) if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: poultry_user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() elif 'buyer_mobile' in request.data.keys() and request.data['buyer_mobile'] is not None: if poultry_request.out_province_poultry_request_buyer.user.mobile != request.data['buyer_mobile']: first_mobile_number = poultry_request.out_province_poultry_request_buyer.user.mobile second_mobile_number = request.data['buyer_mobile'] system_user_profile = SystemUserProfile.objects.get(mobile=first_mobile_number, trash=False) buyer_user = User.objects.get(id=system_user_profile.user.id) if SystemUserProfile.objects.filter(mobile=second_mobile_number, trash=False).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: buyer_user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number system_user_profile.save() request_buyer = OutProvincePoultryRequestBuyer.objects.get( key=poultry_request.out_province_poultry_request_buyer.key) request_buyer.mobile = second_mobile_number request_buyer.save() request.data.pop('poultry_mobile') request.data.pop('buyer_mobile') serializer = self.serializer_class(poultry_request) serializer.update(instance=poultry_request, validated_data=request.data) poultry_request.total_wage_amount = int( (poultry_request.Index_weight * poultry_request.quantity) * poultry_request.wage) poultry_request.save() union_percent = poultry_request.union_share_percent / 100 if poultry_request.union_share_percent > 0 else 0 company_percent = poultry_request.company_share_percent / 100 if poultry_request.company_share_percent > 0 else 0 guilds_percent = poultry_request.guilds_share_percent / 100 if poultry_request.guilds_share_percent > 0 else 0 city_share_percent = poultry_request.city_share_percent / 100 if poultry_request.city_share_percent > 0 else 0 wallet_share_percent = poultry_request.wallet_share_percent / 100 if poultry_request.wallet_share_percent > 0 else 0 other_share_percent = poultry_request.other_share_percent / 100 if poultry_request.other_share_percent > 0 else 0 poultry_request.union_share = int(union_percent * poultry_request.total_wage_amount) poultry_request.company_share = int(company_percent * poultry_request.total_wage_amount) poultry_request.guilds_share = int(guilds_percent * poultry_request.total_wage_amount) poultry_request.city_share = int(city_share_percent * poultry_request.total_wage_amount) poultry_request.wallet_share = int(wallet_share_percent * poultry_request.total_wage_amount) poultry_request.other_share = int(other_share_percent * poultry_request.total_wage_amount) poultry_request.save() return Response({"result": "با موفقیت وبرایش شد"}, status=status.HTTP_200_OK) quantity = 0 last_check_quantity = 0 province_kill_request_quantity = 0 if 'state' in request.data.keys(): state = request.data['state'] request.data.pop('state') else: state = None poultry_request = PoultryRequest.objects.get(key=request.data["key"], trash=False) request.data.pop('key') province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) if 'quantity' in request.data.keys() or 'allocated_number' in request.data.keys(): if 'quantity' in request.data.keys(): if poultry_request.out: out_province_request_limitation = PoultryOutProvinceRequest.objects.filter(trash=False).first() if out_province_request_limitation: if out_province_request_limitation.limitation_status: out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True, hatching=poultry_request.hatching, out_province_request_cancel=False, state_process__in=( 'pending', 'accepted'), province_state__in=( 'pending', 'accepted')).exclude( id=poultry_request.id) out_poultry_requests_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 if poultry_request.hatching.quantity * ( out_province_request_limitation.limitation / 100) < out_poultry_requests_quantity + \ int(request.data['quantity']): return Response( {"result": " تعداد وارد شده بیشتر از ظرفیت فروش به خارج استان برای مرغدار است ! "}, status=status.HTTP_403_FORBIDDEN) quantity = int(request.data['quantity']) province_kill_requests = ProvinceKillRequest.objects.filter( province_request__poultry_request=poultry_request, trash=False) if province_kill_requests.count() > 0: for province_kill_request in province_kill_requests: province_kill_request_quantity += province_kill_request.main_quantity if quantity < province_kill_request_quantity: return Response({"result": "درخواست کشتار شما کمتر از مجموع کل تخصیصات داده شده است!"}, status=status.HTTP_403_FORBIDDEN) if (quantity - poultry_request.quantity) > poultry_request.hatching.left_over: # if quantity > poultry_request.hatching.left_over + poultry_request.remain_quantity: return Response({"result": "درخواست کشتار شما بزرگتر از کل مانده جوجه ریزی است!"}, status=status.HTTP_403_FORBIDDEN) if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: for item in poultry_request.kill_house_list: parts = item.split("(") name = parts[0].strip() kill_request = KillRequest.objects.filter(kill_house__name=name, recive_date__date=poultry_request.send_date.date(), trash=False, poultry__isnull=True, province_state='accepted').first() if kill_request: if quantity > poultry_request.quantity: if kill_request.remain_quantity_for_poultry + ( quantity - poultry_request.quantity) > kill_request.kill_capacity: return Response( {"result": "مقدار وارد شده از باقی مانده اعلام نیاز کشتارگاه بیشتر است!"}, status=status.HTTP_403_FORBIDDEN) kill_request.remain_quantity_for_poultry += quantity - poultry_request.quantity else: kill_request.remain_quantity_for_poultry -= poultry_request.quantity - quantity kill_request.save() else: quantity = request.data['allocated_number'] request.data.pop('allocated_number') if quantity == 0: quantity = poultry_request.quantity poultry_request.final_state = request.data['final_state'] else: request.data.pop('final_state') if province_check.count() > 0: province_check = province_check.last() last_check_quantity += province_check.quantity province_check.quantity = 0 province_check.save() poultry_request.previous_quantity = poultry_request.quantity if poultry_request.quantity > quantity: a = -1 * (poultry_request.quantity - quantity) else: a = quantity - poultry_request.quantity poultry_request.remain_quantity += a poultry_request.save() hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key) if poultry_request.quantity - quantity == 0: if state != None: pass else: province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) if province_check.count() > 0: province_check = province_check.last().quantity if province_check == 0 and last_check_quantity > 0: if poultry_request.quantity == last_check_quantity: poultry_request.final_state = 'archive' poultry_request.archive = True if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: for item in poultry_request.kill_house_list: parts = item.split("(") name = parts[0].strip() kill_request = KillRequest.objects.filter(kill_house__name=name, recive_date__date=poultry_request.send_date.date(), trash=False, poultry__isnull=True, province_state='accepted').first() if kill_request: kill_request.remain_quantity_for_poultry -= poultry_request.quantity kill_request.save() # hatching.left_over += last_check_quantity hatching.save() else: pass else: poultry_request.final_state = 'archive' poultry_request.archive = True if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0: for item in poultry_request.kill_house_list: parts = item.split("(") name = parts[0].strip() kill_request = KillRequest.objects.filter(kill_house__name=name, recive_date__date=poultry_request.send_date.date(), trash=False, poultry__isnull=True, province_state='accepted').first() if kill_request: kill_request.remain_quantity_for_poultry -= poultry_request.quantity kill_request.save() # hatching.left_over += quantity else: if quantity > poultry_request.quantity: # hatching.left_over -= quantity - poultry_request.quantity # hatching.save() if poultry_request.final_state != 'archive': province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) if province_check.count() > 0: province_check = province_check.last() province_check.quantity += quantity - poultry_request.quantity province_check.save() else: # hatching.left_over += poultry_request.quantity - quantity if poultry_request.final_state != 'archive': province_check = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request) if province_check.count() > 0: province_check = province_check.last() if 'quantity' in request.data.keys(): # province_check.quantity = (poultry_request.quantity - quantity) - last_check_quantity # last_province_quantity = province_check.quantity if quantity < poultry_request.quantity: if province_check.quantity > 0: province_check.quantity -= poultry_request.quantity - quantity else: province_check.quantity = (poultry_request.quantity - quantity) - last_check_quantity province_check.save() if hatching.left_over > 0: hatching.state = 'pending' hatching.allow_hatching = 'pending' hatching.save() poultry_request.quantity = quantity poultry_request.save() serializer = self.serializer_class(poultry_request) serializer.update(instance=poultry_request, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) # تابع مربوط به نمایش درخواست ثبت شده مرغدار def list(self, request, *args, **kwargs): # refresh(request.user.id) breed_list = [] city_list = [] quantity_list = [] total_list = [] user = SystemUserProfile.objects.get(user=request.user, trash=False) if 'role' in request.GET: if request.GET['role'] == 'Poultry': if 'waiting' in request.GET: queryset = PoultryRequest.objects.filter(poultry__user=user, awaiting_payment=True, trash=False, out=False).order_by('-send_date') elif 'inspector' in request.GET: queryset = PoultryRequest.objects.filter(poultry__user=user, inspector='pending', trash=False, out=False).order_by('-send_date') else: now = datetime.datetime.now().date() date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now queryset_lists = PoultryRequest.objects.filter(poultry__user=user, final_state__in=('pending', 'archive'), trash=False, out=False).order_by('-send_date') queryset = [ queryset_list for queryset_list in queryset_lists if date1 <= queryset_list.send_date.date() <= date2 ] elif request.GET['role'] == 'VetSupervisor': if 'check' in request.GET: if 'date1' in request.GET and 'date2' 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() if 'deleted_requests' in request.GET: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__province=user.province, trash=True, message__isnull=False, temporary_trash=False, temporary_deleted=False ).select_related('kill_request') serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__province=user.province, trash=False ).select_related('kill_request') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['role'] == 'VetFarm': vet = Vet.objects.filter(user=user, trash=False) poultries = [] if vet.count() > 0: vet = vet.last() vet_farms = VetFarm.objects.filter(vet=vet, trash=False) if vet_farms.count() > 0: for vet_farm in vet_farms: if vet_farm.poultry in poultries: pass else: poultries.append(vet_farm.poultry) if 'check' 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() if 'deleted_requests' in request.GET: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__in=poultries, trash=True, message__isnull=False, temporary_trash=False, temporary_deleted=False ).select_related('kill_request') serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__in=poultries, trash=False ).select_related('kill_request') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'waiting' in request.GET: queryset = PoultryRequest.objects.filter(poultry__in=poultries, poultry__address__province=user.province, awaiting_payment=True, trash=False, out=False).order_by('send_date') elif 'inspector' in request.GET: queryset = PoultryRequest.objects.filter(poultry__in=poultries, poultry__address__province=user.province, inspector='pending', trash=False, out=False).order_by('send_date') else: queryset = PoultryRequest.objects.filter(poultry__in=poultries, poultry__address__province=user.province, final_state__in=('pending', 'archive'), trash=False, out=False).order_by('send_date') else: queryset = [] elif request.GET['role'] == 'ProvinceInspector': if 'waiting' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, awaiting_payment=True, trash=False, out=False).order_by('send_date') elif 'inspector' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, inspector='pending', trash=False, out=False).order_by('send_date') # elif 'out' in request.GET: else: if 'date' in request.GET: date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') else: date = datetime.datetime.now() queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, out=False, send_date__year=date.year, send_date__month=date.month, send_date__day=date.day ).order_by('-send_date') elif request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) if 'check' 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() if 'deleted_requests' in request.GET: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__city_operator=city_operator.unit_name, trash=True, message__isnull=False, temporary_trash=False, temporary_deleted=False ).select_related('kill_request') serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__city_operator=city_operator.unit_name, trash=False ).select_related('kill_request') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) # list1 = [] # for c in CityUnit.objects.filter(city__name=user.city.name, trash=False): # list1.append(c.name) elif 'waiting' in request.GET: # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, # awaiting_payment=True, # trash=False).order_by('send_date') queryset = PoultryRequest.objects.filter(city_operator=city_operator, awaiting_payment=True, trash=False, out=False).order_by('send_date') elif 'inspector' in request.GET: # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, # inspector='pending', # trash=False).order_by('send_date') queryset = PoultryRequest.objects.filter(city_operator=city_operator, inspector='pending', trash=False, out=False).order_by('send_date') else: # queryset = PoultryRequest.objects.filter(poultry__address__city__name__in=list1, # trash=False).order_by( # 'send_date') if 'date1' in request.GET and 'date2' 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() if 'state' in request.GET: if request.GET['state'] == 'pending': queryset = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, trash=False, out=False, state_process='pending', final_state='pending', send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('send_date') elif request.GET['state'] == 'accepted': queryset = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, trash=False, out=False, state_process='accepted', final_state='pending', send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('send_date') else: queryset = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, out=False, final_state='pending', send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('send_date') if 'search' in request.GET: poultry_requests = [] if request.GET['search'] == 'filter': if request.GET['value'] != "": for item in self.filterset_fields: query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) if (PoultryRequestFilterSet( data=query, queryset=queryset ) ).filter(): ps = PoultryRequestFilterSet(data=query, queryset=queryset) poultry_requests = ps.filter() queryset = [] if len(poultry_requests) == 0 else poultry_requests page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(queryset) if page is not None: serializer = PoultryRequestForKillingInformationSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) # queryset = [ # poultry_req for poultry_req in queryset_list # if date1 <= poultry_req.send_date.date() <= date2 # ] elif request.GET['role'] == 'PoultryScience': poultry_science = PoultryScience.objects.filter(trash=False, user=user).values_list('poultry__id', flat=True).distinct() date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() queryset = PoultryRequest.objects.filter(poultry__id__in=poultry_science, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, out=False, final_state='pending', send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('send_date') if 'search' in request.GET: if request.GET['search'] == 'filter': if request.GET['value'] != "": for item in self.filterset_fields: query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) if (PoultryRequestFilterSet( data=query, queryset=queryset ) ).filter(): ps = PoultryRequestFilterSet(data=query, queryset=queryset) poultry_requests = ps.filter() queryset = [] if len(poultry_requests) == 0 else poultry_requests page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(queryset) if page is not None: serializer = PoultryRequestForKillingInformationSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['role'] in ['CityCommerce', 'CityVet', 'CityPoultry', 'CityJahad']: if 'check' in request.GET: if 'date1' in request.GET and 'date2' 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() if 'deleted_requests' in request.GET: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__city=user.city, trash=True, message__isnull=False, temporary_trash=False, temporary_deleted=False ).select_related('kill_request') serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__city=user.city, trash=False ).select_related('kill_request') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'date1' in request.GET and 'date2' in request.GET: now = datetime.datetime.now().date() date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now if 'state_process' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__city=user.city, trash=False, state_process='pending', out=False, send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('-send_date') else: poultry_requests = [] queryset = PoultryRequest.objects.filter(poultry__address__city=user.city, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), final_state='pending', trash=False, out=False, send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('-send_date') if 'search' in request.GET: if request.GET['search'] == 'filter': if request.GET['value'] != "": for item in self.filterset_fields: query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) if (PoultryRequestFilterSet( data=query, queryset=queryset ) ).filter(): ps = PoultryRequestFilterSet(data=query, queryset=queryset) poultry_requests = ps.filter() queryset = [] if len(poultry_requests) == 0 else poultry_requests page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(queryset) if page is not None: serializer = PoultryRequestForKillingInformationSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['role'] == 'ProvinceFinancial': if 'waiting' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, awaiting_payment=True, trash=False, out=False).order_by('send_date') elif 'inspector' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, inspector='pending', trash=False, out=False).order_by('send_date') elif 'all' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, assignment=True, final_state='pending', trash=False, out=False).order_by('send_date') else: if 'date' in request.GET: date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') else: date = datetime.datetime.now() queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, out=False, send_date__year=date.year, send_date__month=date.month, send_date__day=date.day ).order_by('-send_date') elif request.GET['role'] in ['ProvinceOperator', 'Commerce', 'SuperAdmin', 'AdminX', 'Supporter']: if 'waiting' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, awaiting_payment=True, trash=False, out=False).order_by('send_date') elif 'inspector' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, inspector='pending', trash=False, out=False).order_by('send_date') elif 'out' in request.GET: # if 'date' in request.GET: # date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() # else: # date = datetime.datetime.now() queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, send_date__date__gte=date1, send_date__date__lte=date2, trash=False, out=True).order_by('-send_date') elif 'check' in request.GET: if 'date1' in request.GET and 'date2' 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() if 'deleted_requests' in request.GET: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__province=user.province, trash=True, message__isnull=False, temporary_trash=False, temporary_deleted=False ).select_related('kill_request') # serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) # return Response(serializer.data, status=status.HTTP_200_OK) page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: kill_house_requests = KillHouseRequest.objects.filter( kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__province=user.province, trash=False ).select_related('kill_request') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif 'date1' in request.GET and 'date2' in request.GET: now = datetime.datetime.now().date() date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date2' in request.GET else now if 'state_process' in request.GET: queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, trash=False, state_process='pending', out=False, send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('-send_date') else: poultry_requests = [] queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), final_state='pending', trash=False, out=False, send_date__date__gte=date1, send_date__date__lte=date2 ).order_by('-send_date') if 'search' in request.GET: if request.GET['search'] == 'filter': if request.GET['value'] != "": for item in self.filterset_fields: query = QueryDict('{0}__contains={1}'.format(item, request.GET['value'])) if (PoultryRequestFilterSet( data=query, queryset=queryset ) ).filter(): ps = PoultryRequestFilterSet(data=query, queryset=queryset) poultry_requests = ps.filter() queryset = [] if len(poultry_requests) == 0 else poultry_requests page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(queryset) if page is not None: serializer = PoultryRequestForKillingInformationSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) # queryset = [ # queryset_list for queryset_list in queryset_lists # if date1 <= queryset_list.send_date.date() <= date2 # ] # date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() # date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() # queryset_list = PoultryRequest.objects.filter(poultry__address__province=user.province, # trash=False, out=False, # ).order_by('-send_date') # # queryset = [] # queryset = [ # poultry_req for poultry_req in queryset_list # if date1 <= poultry_req.send_date.date() <= date2 # ] else: if 'date' in request.GET: date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') else: date = datetime.datetime.now() - timedelta(days=2) queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, out=False, send_date__year__gte=date.year, send_date__month__gte=date.month, send_date__day__gte=date.day ).order_by('-send_date') elif request.GET['role'] == 'KillHouse': kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False) if 'check' in request.GET: if 'date1' in request.GET and 'date2' 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() if 'deleted_requests' in request.GET: kill_house_requests = KillHouseRequest.objects.filter( (Q(killhouse_user__in=kill_house) | Q( kill_request__slaughter_house__in=kill_house)), kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__province=user.province, trash=True, message__isnull=False, temporary_trash=False, temporary_deleted=False ).select_related('kill_request') # serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) # return Response(serializer.data, status=status.HTTP_200_OK) page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: kill_house_requests = KillHouseRequest.objects.filter( (Q(killhouse_user__in=kill_house) | Q( kill_request__slaughter_house__in=kill_house)), kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2, province_request__poultry_request__poultry__address__province=user.province, trash=False ).select_related('kill_request') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(kill_house_requests) if page is not None: serializer = KillHouseRequestForBarManagementSerializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests, many=True) return Response(serializer.data, status=status.HTTP_200_OK) # if 'check' in request.GET: # kill_house_req_dict = {} # kill_house_req_list = [] # bar_remover = None # # now = datetime.datetime.now().date() # date1 = datetime.datetime.strptime(str(request.GET['date1']), # '%Y-%m-%d').date() if 'date1' in request.GET else now # date2 = datetime.datetime.strptime(str(request.GET['date2']), # '%Y-%m-%d').date() if 'date2' in request.GET else now # queryset_list = PoultryRequest.objects.filter( # poultry__address__province=user.province, # final_state__in=('pending', 'archive'), # trash=False, out=False, # ).order_by('-send_date') # # queryset = [] # queryset = [ # poultry_req for poultry_req in queryset_list # if date1 <= poultry_req.send_date.date() <= date2 # ] # if len(queryset) > 0: # for poultry_req in queryset: # vet_farm = VetFarm.objects.filter(poultry=poultry_req.poultry) # if vet_farm.count() > 0: # vet_farm = vet_farm.last() # vet_name = vet_farm.vet.user.fullname # vet_mobile = vet_farm.vet.user.mobile # else: # vet_name = None # vet_mobile = None # if 'deleted_requests' in request.GET: # kill_house_requests = KillHouseRequest.objects.filter( # province_kill_request__province_request__poultry_request=poultry_req, # killhouse_user__in=kill_house, trash=True, # message__isnull=False) # else: # kill_house_requests = KillHouseRequest.objects.filter( # province_kill_request__province_request__poultry_request=poultry_req, # killhouse_user__in=kill_house, trash=False) # if kill_house_requests.count() > 0: # for kill_house_request in kill_house_requests: # kill_house_name = kill_house_request.kill_request.kill_house.name # if kill_house_request.kill_request.slaughter_house: # kill_place = kill_house_request.kill_request.slaughter_house.name # else: # kill_place = kill_house_name # # if kill_house_request.bar_remover != None: # bar_remover = kill_house_request.bar_remover # vet_check = VetCheckRequest.objects.filter( # kill_house_request=kill_house_request) # if vet_check.count() > 0: # vet_check_state = vet_check.last().state # else: # vet_check_state = 'pending' # # kill_house_req_dict.update({ # "poultry_req_key": poultry_req.key, # "poultry_req_order_code": poultry_req.order_code, # "poultry_name": poultry_req.poultry.unit_name, # "poultry_mobile": poultry_req.poultry.user.mobile, # "poultry_city": poultry_req.poultry.address.city.name, # "chicken_breed": poultry_req.chicken_breed, # "date": poultry_req.send_date, # "poultry_request_first_quantity": kill_house_request.quantity, # "poultry_request_final_quantity": kill_house_request.quantity, # "clearance_code": kill_house_request.clearance_code, # "traffic_code": kill_house_request.traffic_code, # "kill_house_name": kill_house_name, # "buyer_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile, # "driver_mobile": kill_house_request.add_car.driver.driver_mobile, # "kill_house_request_key": kill_house_request.key, # "registerar": kill_house_request.registrar_clearance_code, # "bar_code": kill_house_request.bar_code, # "health_code": kill_house_request.add_car.driver.health_code, # "message": kill_house_request.message, # "date_of_reject": kill_house_request.modify_date, # "vet_name": vet_name, # "vet_mobile": vet_mobile, # "driver_name": kill_house_request.add_car.driver.driver_name, # "pelak": kill_house_request.add_car.driver.pelak, # "type_car": kill_house_request.add_car.driver.type_car, # "quantity": kill_house_request.add_car.driver.type_car, # "vet_check_state": vet_check_state, # "bar_remover": bar_remover, # "kill_place": kill_place, # # }) # kill_house_req_list.append(kill_house_req_dict) # kill_house_req_dict = {} # # return Response(kill_house_req_list, status=status.HTTP_200_OK) else: if 'date' in request.GET: date = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d') else: date = datetime.datetime.now() queryset = PoultryRequest.objects.filter(poultry__address__province=user.province, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, out=False, send_date__year=date.year, send_date__month=date.month, send_date__day=date.day ).order_by('-send_date') else: if 'type' in request.GET: if request.GET['type'] == 'auction': queryset = [] poultry_req_auctions = PoultryRequestAuction.objects.filter(state='active', trash=False).order_by( 'fee').order_by( 'create_date') for poultry_req_auction in poultry_req_auctions: queryset.append( PoultryRequest.objects.get(id=poultry_req_auction.poultry_request.id, auction=True)) serializer = PoultryRequestSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) queryset = PoultryRequest.objects.get(id=pk, trash=False) if queryset.province_state == 'accepted': role = Group.objects.get(name='ProvinceOperator') if role not in user.role.all(): return Response({"result": " بدلیل تایید درخواست از طرف استان امکان حذف وجود ندارد!"}, status=status.HTTP_400_BAD_REQUEST) if ProvinceKillRequest.objects.filter(province_request__poultry_request=queryset, trash=False, ).exists(): return Response({"result": " بدلیل وجود تخصیص به کشتارگاه امکان حذف وجود ندارد!"}, status=status.HTTP_400_BAD_REQUEST) # if queryset.state_process == 'pending' and queryset.province_state == 'pending': # # # # if 'role' in request.GET: # # if request.GET['role'] == 'ProvinceOperator': # # hatching = queryset.hatching # hatching.left_over += queryset.quantity + queryset.losses # hatching.losses -= queryset.losses # hatching.state = 'pending' # hatching.save() # try: # city = CityOperatorCheckRequest.objects.get(poultry_request=queryset, trash=False) # city.trash = True # city.save() # except: # pass # queryset.trash = True # queryset.save() # if queryset.kill_house_list != None and len(queryset.kill_house_list) > 0: # for item in queryset.kill_house_list: # parts = item.split("(") # name = parts[0].strip() # kill_request = KillRequest.objects.filter(kill_house__name=name, # recive_date__date=queryset.send_date.date(), # trash=False, poultry__isnull=True, # province_state='accepted').first() # if kill_request: # kill_request.remain_quantity_for_poultry -= queryset.quantity # kill_request.save() # return Response(queryset.trash, status=status.HTTP_200_OK) # else: # if ProvinceOperator.objects.filter(user=user).exists(): # hatching = queryset.hatching # hatching.left_over += queryset.quantity + queryset.losses # hatching.losses -= queryset.losses # hatching.state = 'pending' # hatching.save() try: city = CityOperatorCheckRequest.objects.get(poultry_request=queryset, trash=False) city.trash = True city.save() except: pass queryset.trash = True queryset.save() if queryset.kill_house_list != None and len(queryset.kill_house_list) > 0: for item in queryset.kill_house_list: parts = item.split("(") name = parts[0].strip() kill_request = KillRequest.objects.filter(kill_house__name=name, recive_date__date=queryset.send_date.date(), trash=False, poultry__isnull=True, province_state='accepted').first() if kill_request: kill_request.remain_quantity_for_poultry -= queryset.quantity kill_request.save() return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) # ویوست مربوط به ریزجزییات پرونده مرغدار برای پنل مرغدار و شهرستان و کشتارگاه class ProcessViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] # تابع مربوط به نمایش ریزجزییات پرونده مرغدار برای پنل مرغدار و شهرستان و کشتارگاه def list(self, request, *args, **kwargs): # refresh(request.user.id) process = {} process1 = {} user = SystemUserProfile.objects.get(user=request.user, trash=False) poultry_request = PoultryRequest.objects.get(id=int(request.GET['id']), trash=False) # date = str(poultry_request.poultry.incubation_date) # new_date = date[:19] # chicken_date = datetime.datetime.strptime(new_date, '%Y-%m-%d %H:%M:%S') kill_date = datetime.datetime.strptime(str(poultry_request.send_date), '%Y-%m-%d %H:%M:%S') # age = (kill_date - chicken_date).days if ProvinceKillRequest.objects.filter( province_request__city_request_Poultry__poultry_request=poultry_request, state='accepted').exists(): age2 = (poultry_request.send_date - poultry_request.hatching.date).days + 1 else: age2 = (datetime.datetime.now() - poultry_request.hatching.date).days + 1 file_state = 'pending' if poultry_request.province_state == 'pending': file_state = 'province_state_pending' if ProvinceKillRequest.objects.filter(province_request__poultry_request__id=poultry_request.id).exists(): if poultry_request.remain_quantity == 0: file_state = 'allocated_completed' else: file_state = 'allocated_pending' process.update({"file_state": file_state}) process.update({"poultry": { "poultry_unit_name": poultry_request.poultry.unit_name, "breeding_unique_id": poultry_request.poultry.breeding_unique_id, "general_order_code": poultry_request.general_order_code, "halls": poultry_request.poultry.number_of_halls, "tenant": poultry_request.poultry.tenant, "has_tenant": poultry_request.poultry.has_tenant, "poultry_request_id": poultry_request.id, "base_order": poultry_request.poultry.user.base_order, "awaiting_payment": poultry_request.awaiting_payment, "poultry_request_final_state": poultry_request.final_state, "poultry_request_key": poultry_request.key, "kill_house_list": poultry_request.kill_house_list, "poultry_order_code": poultry_request.order_code, "poultry_send_date": poultry_request.send_date, "poultry_name": poultry_request.poultry.user.fullname, "poultry_mobile": poultry_request.poultry.user.mobile, "poultry_city": poultry_request.poultry.address.city.name, "poultry_province": poultry_request.poultry.address.province.name, "poultry_gis_code": poultry_request.poultry.gis_code, 'age': age2, 'chicken_date': None, "poultry_quantity": poultry_request.quantity, "poultry_first_quantity": poultry_request.first_quantity, "poultry_previous_quantity": poultry_request.previous_quantity, "poultry_remain_quantity": poultry_request.remain_quantity, "poultry_chicken_breed": poultry_request.chicken_breed, "poultry_request_losses": poultry_request.losses, "poultry_Index_weight": "{} کیلوگرم".format(poultry_request.Index_weight), "Index_weight": poultry_request.Index_weight, "poultry_register_date": poultry_request.create_date, "poultry_auction": poultry_request.auction, "sell_type": poultry_request.cell_type, "buyer": poultry_request.buyer, "clearance_code": poultry_request.clearance_code, } }) poultry_hatching = PoultryHatching.objects.filter(key=poultry_request.hatching.key, trash=False) if poultry_hatching.count() > 0: poultry_hatching = poultry_hatching.last() inspections = VetFarmInspection.objects.filter(poultry_hatching=poultry_hatching) losses = 0 if inspections.count() > 0: for ins in inspections: if ins.Losses > 0: losses += ins.Losses else: pass if losses > 0: process.update({"inspection_losses": losses }) process.update({ "inspection_losses_percent": (losses * 100) / poultry_request.hatching.quantity }) else: process.update({"inspection_losses": losses }) process.update({ "inspection_losses_percent": losses }) process.update({"poultry_hatching": { "poultry_key": poultry_request.hatching.poultry.key, "poultry_hatching_key": poultry_request.hatching.key, "poultry_name": poultry_request.hatching.poultry.unit_name, "quantity": poultry_request.hatching.quantity, "losses": poultry_request.hatching.losses, "total_losses_percent": (poultry_request.hatching.losses * 100) / poultry_request.hatching.quantity, "poultry_losses_percent": (poultry_request.losses * 100) / poultry_request.hatching.quantity, "left_over": poultry_request.hatching.left_over, "hall": poultry_request.hatching.hall, "date": poultry_request.hatching.date, "allow_hatching": poultry_request.hatching.allow_hatching, "period": poultry_request.hatching.period, "state": poultry_request.hatching.state, } }) else: process.update({"poultry_hatching": None }) vetfarm_inspection = VetFarmInspection.objects.filter(vet_farm__poultry=poultry_request.poultry, trash=False) if vetfarm_inspection.count() > 0: vetfarm_inspection = vetfarm_inspection.last() process.update({"vetfarm_inspection": { "vet_name": vetfarm_inspection.vet_farm.vet.user.fullname, "hall": vetfarm_inspection.hall, "topic": vetfarm_inspection.topic, "description": vetfarm_inspection.description, "image": vetfarm_inspection.image, "losses": vetfarm_inspection.Losses, "longitude": vetfarm_inspection.longitude, "latitude": vetfarm_inspection.latitude, } }) else: process.update({"vetfarm_inspection": None }) auctions = PoultryRequestAuction.objects.filter(poultry_request=poultry_request, state__in=('active', 'inactive'), trash=False).order_by( 'auction_date') if auctions.count() > 0: auctions_list = [] for auction in auctions: if auction.state == 'active': index = list(auctions).index(auction) + 1 pricing = Pricing.objects.get(id=auction.pricing.id) internal_dict_auction = { "ceiling_price": pricing.ceiling_price, "floor_price": pricing.floor_price, "fee": auction.fee, "hour": auction.hour, "date": auction.auction_date, "index": index, "total_index": auctions.count() } auctions_list.append(internal_dict_auction) process.update({"auctions_list": auctions_list}) # else: # break else: process.update({"auctions_list": None}) kill_house_auctions = KillHouseRequestAction.objects.filter(poultry_request=poultry_request, state='pending', trash=False) if kill_house_auctions.count() > 0: kill_house_auctions_list = [] for kill_house_auction in kill_house_auctions: internal_dict_kill_house_auction = { "kill_house_name": kill_house_auction.kill_house.name, "fullname": kill_house_auction.kill_house.kill_house_operator.user.fullname, "mobile": kill_house_auction.kill_house.kill_house_operator.user.mobile, "city": kill_house_auction.kill_house.system_address.city.name, "province": kill_house_auction.kill_house.system_address.province.name, "fee": kill_house_auction.fee, } kill_house_auctions_list.append(internal_dict_kill_house_auction) process.update({"kill_house_auctions_list": kill_house_auctions_list}) else: process.update({"kill_house_auctions_list": None}) kill_house_auction_winner = KillHouseRequestActionWinner.objects.filter( kill_house_request_auction__poultry_request=poultry_request, trash=False) if kill_house_auction_winner.count() > 0: kill_house_auction_winner = kill_house_auction_winner.last() process.update({"kill_house_winner": { "kill_house_winner_key": kill_house_auction_winner.key, "kill_house_name": kill_house_auction_winner.kill_house_request_auction.kill_house.name, "kill_house_user_name": kill_house_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, "kill_house_user_mobile": kill_house_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, "kill_house_city": kill_house_auction_winner.kill_house_request_auction.kill_house.system_address.city.name, "kill_house_province": kill_house_auction_winner.kill_house_request_auction.kill_house.system_address.province.name, "fee": kill_house_auction_winner.fee, "quantity": kill_house_auction_winner.quantity } }) else: process.update({"kill_house_winner": None }) province_request_auctions = ProvinceRequestAction.objects.filter(poultry_request=poultry_request, state='active', trash=False) if province_request_auctions.count() > 0: province_request_auction_list = [] for province_request_auction in province_request_auctions: internal_dict_province_request_auction_list = { "fullname": province_request_auction.province_operator_system.user.fullname, "mobile": province_request_auction.province_operator_system.user.mobile, "city": province_request_auction.province_operator_system.user.city.name, "province": province_request_auction.province_operator_system.user.province.name, } province_request_auction_list.append(internal_dict_province_request_auction_list) process.update({"province_request_auction_list": province_request_auction_list}) else: process.update({"province_request_auction_list": None}) poultry_assignment = PoultryAssignmentInformation.objects.filter(poultry_request=poultry_request, trash=False) if poultry_assignment: poultry_bar_list = [] for bar in poultry_assignment: internal_poultry_bar = { "poultry_bar_info_key": bar.key, "car_weight_without_load": bar.car_weight_without_load, "car_weight_without_load_image": bar.car_weight_without_load_image, "car_weight_with_load": bar.car_weight_with_load, "car_weight_with_load_image": bar.car_weight_with_load_image, "net_weight": bar.net_weight, } poultry_bar_list.append(internal_poultry_bar) process.update({"poultry_bar_info": poultry_bar_list}) if not poultry_assignment: process.update({"poultry_bar_info": None}) city = CityOperatorCheckRequest.objects.filter(poultry_request=poultry_request, trash=False) if city: process.update({"city": { "city_operator_name": city[0].city_operator_system.user.fullname, "city_operator_mobile": city[0].city_operator_system.user.mobile, "city_operator_province": city[0].city_operator_system.address.province.name, "city_operator_city": city[0].city_operator_system.address.city.name, "city_operator_address": city[0].city_operator_system.address.address, "city_operator_national_id": city[0].city_operator_system.user.national_id, "city_state": city[0].state, "province_accept": city[0].province_accept, "accepted_rejected_date": city[0].create_date, "city_operator_message": city[0].message, "unit_name": city[0].city_operator_system.unit_name, }}) if not city: process.update({"city": None}) # cit = CityUnit.objects.filter(name=poultry_request.poultry.address.city.name, trash=False) # if cit.count() > 0: # city_operator = CityOperator.objects.get(address__city=cit[0].city, trash=False) city_operator = CityOperator.objects.get(key=poultry_request.city_operator.key, trash=False) process.update({"city_operator": { "city_operator_name": city_operator.user.fullname, "city_operator_mobile": city_operator.user.mobile, "city_operator_province": city_operator.address.province.name, "city_operator_city": city_operator.address.city.name, "city_operator_address": city_operator.address.address, "city_operator_national_id": city_operator.user.national_id, "unit_name": city_operator.unit_name, }}) province = ProvinceCheckOperatorRequest.objects.filter(poultry_request=poultry_request, trash=False) if province.count() > 0: if 'role' in request.GET: if request.GET['role'] == 'Poultry': process.update({"province": { "province_check_request_key": province[0].key, "province_operator_name": province[0].province_operator_system.user.fullname, "province_operator_mobile": province[0].province_operator_system.user.mobile, "province_operator_provinc": province[0].province_operator_system.address.province.name, "province_operator_city": province[0].province_operator_system.address.city.name, "province_operator_address": province[0].province_operator_system.address.address, "province_operator_national_id": province[0].province_operator_system.user.national_id, "province_state": province[0].state, "province_message": province[0].message, "chicken_price": province[0].fee, "accepted_rejected_date": province[0].create_date, }}) else: process.update({"province": { "province_check_request_key": province[0].key, "province_operator_name": province[0].province_operator_system.user.fullname, "province_operator_mobile": province[0].province_operator_system.user.mobile, "province_operator_provinc": province[0].province_operator_system.address.province.name, "province_operator_city": province[0].province_operator_system.address.city.name, "province_operator_address": province[0].province_operator_system.address.address, "province_operator_national_id": province[0].province_operator_system.user.national_id, "province_state": province[0].state, "province_message": province[0].message, "chicken_price": province[0].fee, "accepted_rejected_date": province[0].create_date, }}) if not province: process.update({"province": None}) role = Group.objects.get(name='ProvinceOperator') province_operator = ProvinceOperator.objects.get( address__province__name=poultry_request.poultry.address.province.name, user__role=role, trash=False) process.update({"province_operator": { "province_operator_name": province_operator.user.fullname, "province_operator_mobile": province_operator.user.mobile, "province_operator_provinc": province_operator.address.province.name, "province_operator_city": province_operator.address.city.name, "province_operator_address": province_operator.address.address, "province_operator_national_id": province_operator.user.national_id, }}) if ProvinceFactorToKillHouseForPoultry.objects.filter(province_check_req=province.last()).exists(): poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( province_check_req=province.last()).last() if poultry_factor.bank != None: name_of_bank_user_poultry = poultry_factor.bank.name_of_bank_user bank_name_poultry = poultry_factor.bank.bank_name card_poultry = poultry_factor.bank.card shaba_poultry = poultry_factor.bank.shaba account_poultry = poultry_factor.bank.account else: name_of_bank_user_poultry = None bank_name_poultry = None card_poultry = None shaba_poultry = None account_poultry = None process.update({"poultry_factor": { "poultry_factor_key": poultry_factor.key, "province_factor_fee": poultry_factor.factor_fee, "province_operator": poultry_factor.province_check_req.province_operator_system.user.fullname, "province_mobile": poultry_factor.province_check_req.province_operator_system.user.mobile, "weight": poultry_factor.total_weight, "cost": poultry_factor.total_price, "poultry_share_with_profit": poultry_factor.shares, "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", "name_of_bank_user": name_of_bank_user_poultry, "bank_name": bank_name_poultry, "card": card_poultry, "shaba": shaba_poultry, "account": account_poultry, }}) else: process.update({"poultry_factor": None}) if ProvinceFactorToKillHouse.objects.filter(province_check_req=province.last()).exists(): province_factor = ProvinceFactorToKillHouse.objects.filter(province_check_req=province.last()).last() if province_factor.bank != None: name_of_bank_user_province_factor = province_factor.bank.name_of_bank_user bank_name_province_factor = province_factor.bank.bank_name card_province_factor = province_factor.bank.card shaba_province_factor = province_factor.bank.shaba account_province_factor = province_factor.bank.account else: name_of_bank_user_province_factor = None bank_name_province_factor = None card_province_factor = None shaba_province_factor = None account_province_factor = None process.update({"province_factor": { "province_factor_key": province_factor.key, "province_factor_fee": province_factor.factor_fee, "province_operator": province_factor.province_check_req.province_operator_system.user.fullname, "province_mobile": province_factor.province_check_req.province_operator_system.user.mobile, "weight": province_factor.total_weight, "cost": province_factor.total_price, "union_share_with_profit": province_factor.shares, "total_amount_char": words(province_factor.total_price) + " " + "ریال", "name_of_bank_user": name_of_bank_user_province_factor, "bank_name": bank_name_province_factor, "card": card_province_factor, "shaba": shaba_province_factor, "account": account_province_factor, }}) else: process.update({"province_factor": None}) if ProvinceImportKillHouseOutFactors.objects.filter(province_check=province.last()).exists(): payment_out_factors = ProvinceImportKillHouseOutFactors.objects.filter(province_check=province.last()) interal_factor_list = [] for payment_out_factor in payment_out_factors: internal_dict = { "key": payment_out_factor.key, "amount": payment_out_factor.amount, "image": payment_out_factor.image, } interal_factor_list.append(internal_dict) process.update({"out_factors": interal_factor_list}) else: process.update({"out_factors": None}) if 'role' in request.GET: if request.GET['role'] == 'KillHouse': kill_house_operator = KillHouseOperator.objects.filter(user=user, trash=False) if kill_house_operator.count() > 0: kill_house_operator = kill_house_operator.last() kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) province_kill_reqs = ProvinceKillRequest.objects.filter( province_request__city_request_Poultry__poultry_request=poultry_request, killhouse_user__in=kill_house, trash=False) elif request.GET['role'] == 'KillHouseVet': vet = Vet.objects.filter(user=user, trash=False) if vet.count() > 0: vet = vet.last() kill_house_vet = KillHouseVet.objects.filter(vet=vet) kill_house_vet = kill_house_vet.last() province_kill_reqs = ProvinceKillRequest.objects.filter( province_request__city_request_Poultry__poultry_request=poultry_request, killhouse_user=kill_house_vet.kill_house, trash=False) else: province_kill_reqs = ProvinceKillRequest.objects.filter( province_request__city_request_Poultry__poultry_request=poultry_request, trash=False) if province_kill_reqs.count() > 0: state_list = [] for province_kill_req in province_kill_reqs: state_list.append(province_kill_req.payment_type) l1 = set(state_list) if len(l1) > 1: process.update({"file_payment_type": "cash_credit"}) else: process.update({"file_payment_type": state_list[0]}) province_kill_reqs_list = [] for province_kill_req in province_kill_reqs: check = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_req, trash=False) internal_province_kill_dict_infos = { "province_kill_req_key": province_kill_req.key, "payment_type": province_kill_req.payment_type, "payment_dead_line": province_kill_req.payment_dead_line, "kill_req_key": province_kill_req.kill_request.key, "province_kill_req_state": province_kill_req.state, "kill_house_name": province_kill_req.kill_request.kill_house.name, "kill_house_user_name": province_kill_req.kill_request.kill_house.kill_house_operator.user.fullname, "kill_house_user_city": province_kill_req.kill_request.kill_house.kill_house_operator.user.city.name, "kill_house_user_province": province_kill_req.kill_request.kill_house.kill_house_operator.user.province.name, "kill_house_user_national_id": province_kill_req.kill_request.kill_house.kill_house_operator.user.national_id, "kill_house_mobile": province_kill_req.kill_request.kill_house.kill_house_operator.user.mobile, "quantity": province_kill_req.quantity, "time": province_kill_req.kill_request.recive_time, "date": province_kill_req.kill_request.recive_date, "automatic_state": province_kill_req.automatic, "fee": province_kill_req.fee, "province_kill_req_message": province_kill_req.message } kill_house_requests = KillHouseRequest.objects.filter( province_request__city_request_Poultry__poultry_request=poultry_request, province_kill_request=province_kill_req, trash=False) if kill_house_requests.count() > 0: reqs = [] for kill_house_request in kill_house_requests: province_req = kill_house_request.province_request internal_dict_infos = { "kill_house_req_key": kill_house_request.key, "payment_type": province_kill_req.payment_type, "province_fee": province_kill_req.fee, "payment_dead_line": province_kill_req.payment_dead_line, "kill_house_vet_state": kill_house_request.vet_state, "kill_req_key": kill_house_request.kill_request.key, "kill_house_check_key": check[0].key, "barcod": kill_house_request.bar_code, "kill_house_state": kill_house_request.state, "kill_house_name": kill_house_request.kill_request.kill_house.name, "kill_house_user_name": kill_house_request.kill_request.kill_house.kill_house_operator.user.fullname, "kill_house_user_province": kill_house_request.kill_request.kill_house.kill_house_operator.user.province.name, "kill_house_user_city": kill_house_request.kill_request.kill_house.kill_house_operator.user.city.name, "kill_house_user_address": kill_house_request.kill_request.kill_house.system_address.address, "kill_house_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile, "kill_house_national_id": kill_house_request.kill_request.kill_house.kill_house_operator.user.national_id, "quantity": kill_house_request.quantity, "fee": kill_house_request.province_kill_request.fee, "time": kill_house_request.kill_request.recive_time, "date": kill_house_request.kill_request.recive_date, "cars": kill_house_request.car, "driver_name": kill_house_request.add_car.driver.driver_name, "type_car": kill_house_request.add_car.driver.type_car, "pelak": kill_house_request.add_car.driver.pelak, "clearance_code": kill_house_request.clearance_code, "traffic_code": kill_house_request.traffic_code, "show_kill_house": kill_house_request.show_kill_house, "kill_house_message": kill_house_request.kill_house_message } vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request, trash=False) if vet_check: internal_dict_infos.update({ "vet_check_info": { "vet_user": vet_check[0].kill_house_vet.vet.user.fullname, "vet_user_mobile": vet_check[0].kill_house_vet.vet.user.mobile, "vet_check_state": vet_check[0].state, "vet_check_accept_date": vet_check[0].create_date, } }) if not vet_check: internal_dict_infos.update({ "vet_check_info": None }) kill_house_assignment = KillHouseAssignmentInformation.objects.filter( kill_house_check__province_kill_request__province_request=province_req, kill_house_request=kill_house_request, trash=False) if kill_house_assignment: internal_dict_infos.update({ "bar_info": { "kill_house_assignment_key": kill_house_assignment[0].key, "real_quantity": kill_house_assignment[0].real_quantity, "kill_house_weight_without_load": kill_house_assignment[ 0].car_weight_without_load, "kill_house_weight_with_load": kill_house_assignment[ 0].car_weight_with_load, "kill_house_image_without_load": kill_house_assignment[ 0].car_weight_without_load_image, "kill_house_image_with_load": kill_house_assignment[ 0].car_weight_with_load_image, "kill_house_net_weight": kill_house_assignment[0].net_weight, "kill_house_assignment_state": kill_house_assignment[0].state, "expire_time": kill_house_assignment[0].protest_time, "kill_house_assignment_message": kill_house_assignment[0].message, "accept_reject_date": kill_house_assignment[0].modify_date, "unusual_casualties": kill_house_assignment[0].unusual_casualties, } }) complaint = KillHouseComplaint.objects.filter(bar=kill_house_assignment[0], trash=False) percentage_losses = PercentageOfLosses.objects.all() if percentage_losses.count() > 0: percentage_losses = percentage_losses.last().percent else: percentage_losses = None if complaint.count() > 0: complaint = complaint.last() check_complaint = CheckUnusualCasualties.objects.filter(complaint=complaint) if check_complaint.count() > 0: reviewer = check_complaint.last().role else: reviewer = None internal_dict_infos.update({ "complaint": { "complaint_key": complaint.key, "create_date": complaint.create_date, "title": complaint.title, "description": complaint.description, "percent": complaint.percent, "image": complaint.image, "state": complaint.state, "message": complaint.message, "registrar": complaint.registrar, "reviewer": reviewer, "real_weight": kill_house_assignment[0].net_weight, "losses_weight": kill_house_assignment[0].weight_withs_losses, "percentage_losses": percentage_losses, } }) else: internal_dict_infos.update({ "complaint": None }) if not kill_house_assignment: internal_dict_infos.update({ "bar_info": None }) internal_dict_infos.update({ "complaint": None }) poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if poultry_factor.count() > 0: poultry_factor = poultry_factor.last() if poultry_factor.bank != None: name_of_bank_user = poultry_factor.bank.name_of_bank_user bank_name = poultry_factor.bank.bank_name card = poultry_factor.bank.card, shaba = poultry_factor.bank.shaba, account = poultry_factor.bank.account, else: name_of_bank_user = None bank_name = None card = None shaba = None account = None share_allocation = ShareOfAllocation.objects.all() if share_allocation.count() > 0: share_allocation = share_allocation.last() total = share_allocation.total else: total = 0 internal_dict_infos.update({ "province_factor_to_kill_house_for_poultry": { "province_factor_key": poultry_factor.key, "province_factor_fee": poultry_factor.factor_fee, "province_operator": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, "province_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, "weight": poultry_factor.total_weight, "bar_code": poultry_factor.factor_bar_code, "kill_house_name": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, "kill_house_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, "cost": poultry_factor.total_price, "poultry_share_with_profit": poultry_factor.shares[ 'poultryShareWithProfit'], "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", "total_share_allocation": poultry_factor.total_weight * total, "total_share_allocation_char": words( poultry_factor.total_weight * total) + " " + "ریال", "name_of_bank_user": name_of_bank_user, "bank_name": bank_name, "card": card, "shaba": shaba, "account": account, } }) if not poultry_factor: internal_dict_infos.update({ "province_factor_to_kill_house_for_poultry": None }) province_factor = ProvinceFactorToKillHouse.objects.filter( province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if province_factor: if province_factor[0].bank != None: name_of_bank_user = province_factor[0].bank.name_of_bank_user bank_name = province_factor[0].bank.bank_name card = province_factor[0].bank.card, shaba = province_factor[0].bank.shaba, account = province_factor[0].bank.account, else: name_of_bank_user = None bank_name = None card = None shaba = None account = None share_allocation = ShareOfAllocation.objects.all() if share_allocation.count() > 0: share_allocation = share_allocation.last() total = share_allocation.total else: total = 0 if province_factor[0].poultry_factor == None: poultry_share_with_profit = province_factor[0].shares['poultryShareWithProfit'] else: poultry_share_with_profit = province_factor[0].poultry_factor.total_price internal_dict_infos.update({ "province_factor_to_kill_house": { "province_factor_key": province_factor[0].key, "province_factor_fee": province_factor[0].factor_fee, "province_operator": province_factor[ 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, "province_mobile": province_factor[ 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, "weight": province_factor[0].total_weight, "bar_code": province_factor[0].factor_bar_code, "kill_house_name": province_factor[ 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, "kill_house_mobile": province_factor[ 0].province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, "cost": province_factor[0].total_price, "poultry_share_with_profit": poultry_share_with_profit, "union_share_with_profit": province_factor[0].shares[ 'unionShareWithProfit'], "total_amount_char": words(province_factor[0].total_price) + " " + "ریال", "total_share_allocation": province_factor[0].total_weight * total, "total_share_allocation_char": words( province_factor[0].total_weight * total) + " " + "ریال", "name_of_bank_user": name_of_bank_user, "bank_name": bank_name, "card": card, "shaba": shaba, "account": account, } }) if not province_factor: internal_dict_infos.update({ "province_factor_to_kill_house": None }) kill_house_factor_poultry = KillHouseFactorToPoultry.objects.filter( province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if kill_house_factor_poultry.count(): kill_house_factor_poultry = kill_house_factor_poultry.last() internal_dict_infos.update({ "kill_house_factor_to_poultry": { "kill_house_name": kill_house_request.killhouse_user.name, "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, "time": kill_house_factor_poultry.create_date, "payment_code": kill_house_factor_poultry.payment_code, "factor_image": kill_house_factor_poultry.factor_image, "factor_key": kill_house_factor_poultry.key, "factor_state": kill_house_factor_poultry.state, "total_money": kill_house_factor_poultry.province_factor.total_price, "factor_message": kill_house_factor_poultry.message } }) if not kill_house_factor_poultry: internal_dict_infos.update({ "kill_house_factor_to_poultry": None }) kill_house_factor = KillHouseFactorToProvince.objects.filter( province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if kill_house_factor: internal_dict_infos.update({ "kill_house_factor_to_province": { "kill_house_name": kill_house_request.killhouse_user.name, "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, "time": kill_house_factor[0].create_date, "payment_code": kill_house_factor[0].payment_code, "factor_image": kill_house_factor[0].factor_image, "factor_key": kill_house_factor[0].key, "factor_state": kill_house_factor[0].state, "total_money": kill_house_factor[0].province_factor.total_price, "factor_message": kill_house_factor[0].message } }) if not kill_house_factor: internal_dict_infos.update({ "kill_house_factor_to_province": None }) reqs.append(internal_dict_infos) internal_province_kill_dict_infos.update({"kill_house_requests": reqs }) if not kill_house_requests: internal_province_kill_dict_infos.update({"kill_house_requests": None }) province_kill_reqs_list.append(internal_province_kill_dict_infos) process.update({"province_kill_requests": province_kill_reqs_list}) elif province_kill_reqs.count() == 0: process.update({"province_kill_requests": None }) if 'role' in request.GET: if request.GET['role'] == 'KillHouse': kill_house_operator = KillHouseOperator.objects.filter(user=user, trash=False) if kill_house_operator.count() > 0: kill_house_operator = kill_house_operator.last() kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False) kill_house_reqs = KillHouseRequest.objects.filter( kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, killhouse_user__in=kill_house, trash=False) elif request.GET['role'] == 'KillHouseVet': vet = Vet.objects.filter(user=user, trash=False) if vet.count() > 0: vet = vet.last() kill_house_vet = KillHouseVet.objects.filter(vet=vet) kill_house_vet = kill_house_vet.last() kill_house_reqs = KillHouseRequest.objects.filter( kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, killhouse_user=kill_house_vet.kill_house, trash=False) else: kill_house_reqs = KillHouseRequest.objects.filter( kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, trash=False) if kill_house_reqs.count() > 0: reqs = [] for kill_house_request in kill_house_reqs: # province_req = kill_house_request.province_request internal_dict_infos = { "kill_house_req_key": kill_house_request.key, "kill_house_vet_state": kill_house_request.vet_state, "order_code": poultry_request.order_code, "barcod": kill_house_request.bar_code, "kill_house_state": kill_house_request.state, "kill_house_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, "kill_house_user_name": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.fullname, "kill_house_user_province": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.province.name, "kill_house_user_city": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.city.name, "kill_house_user_address": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.system_address.address, "kill_house_mobile": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, "kill_house_national_id": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.national_id, "quantity": kill_house_request.quantity, # "time": kill_house_request.kill_request.recive_time, # "date": kill_house_request.kill_request.recive_date, "cars": kill_house_request.car, "driver_name": kill_house_request.add_car.driver.driver_name, "type_car": kill_house_request.add_car.driver.type_car, "pelak": kill_house_request.add_car.driver.pelak, "clearance_code": kill_house_request.clearance_code, "traffic_code": kill_house_request.traffic_code, "show_kill_house": kill_house_request.show_kill_house, "kill_house_message": kill_house_request.kill_house_message } vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request, trash=False) if vet_check: internal_dict_infos.update({ "vet_check_info": { "vet_user": vet_check[0].kill_house_vet.vet.user.fullname, "vet_user_mobile": vet_check[0].kill_house_vet.vet.user.mobile, "vet_check_state": vet_check[0].state, "vet_check_accept_date": vet_check[0].create_date, } }) if not vet_check: internal_dict_infos.update({ "vet_check_info": None }) kill_house_assignment = KillHouseAssignmentInformation.objects.filter( kill_house_request=kill_house_request, trash=False) if kill_house_assignment: internal_dict_infos.update({ "bar_info": { "kill_house_assignment_key": kill_house_assignment[0].key, "real_quantity": kill_house_assignment[0].real_quantity, "kill_house_weight_without_load": kill_house_assignment[0].car_weight_without_load, "kill_house_weight_with_load": kill_house_assignment[0].car_weight_with_load, "kill_house_image_without_load": kill_house_assignment[ 0].car_weight_without_load_image, "kill_house_image_with_load": kill_house_assignment[0].car_weight_with_load_image, "kill_house_net_weight": kill_house_assignment[0].net_weight, "expire_time": kill_house_assignment[0].protest_time, "kill_house_assignment_state": kill_house_assignment[0].state, "kill_house_assignment_message": kill_house_assignment[0].message, "accept_reject_date": kill_house_assignment[0].modify_date } }) complaint = KillHouseComplaint.objects.filter(bar=kill_house_assignment[0], trash=False) if complaint.count() > 0: complaint = complaint.last() internal_dict_infos.update({ "complaint": { "complaint_key": complaint.key, "title": complaint.title, "description": complaint.description, "percent": complaint.percent, "image": complaint.image, "state": complaint.state, "message": complaint.message, } }) else: internal_dict_infos.update({ "complaint": None }) if not kill_house_assignment: internal_dict_infos.update({ "bar_info": None }) internal_dict_infos.update({ "complaint": None }) poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter( province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if poultry_factor.count() > 0: poultry_factor = poultry_factor.last() if poultry_factor.bank != None: name_of_bank_user = poultry_factor.bank.name_of_bank_user bank_name = poultry_factor.bank.bank_name card = poultry_factor.bank.card, shaba = poultry_factor.bank.shaba, account = poultry_factor.bank.account, else: name_of_bank_user = None bank_name = None card = None shaba = None account = None share_allocation = ShareOfAllocation.objects.all() if share_allocation.count() > 0: share_allocation = share_allocation.last() total = share_allocation.total else: total = 0 internal_dict_infos.update({ "province_factor_to_kill_house_for_poultry": { "province_factor_key": poultry_factor.key, "province_factor_fee": poultry_factor.factor_fee, "province_operator": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.fullname, "province_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.province_request.province_operator_system.user.mobile, "weight": poultry_factor.total_weight, "bar_code": poultry_factor.factor_bar_code, "kill_house_name": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.name, "kill_house_mobile": poultry_factor.province_check_info.kill_house_assignment.kill_house_check.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile, "cost": poultry_factor.total_price, "poultry_share_with_profit": poultry_factor.shares[ 'poultryShareWithProfit'], "total_amount_char": words(poultry_factor.total_price) + " " + "ریال", "total_share_allocation": poultry_factor.total_weight * total, "total_share_allocation_char": words( poultry_factor.total_weight * total) + " " + "ریال", "name_of_bank_user": name_of_bank_user, "bank_name": bank_name, "card": card, "shaba": shaba, "account": account, } }) if not poultry_factor: internal_dict_infos.update({ "province_factor_to_kill_house_for_poultry": None }) province_factor = ProvinceFactorToKillHouse.objects.filter( province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if province_factor: if province_factor[0].bank != None: name_of_bank_user = province_factor[0].bank.name_of_bank_user bank_name = province_factor[0].bank.bank_name card = province_factor[0].bank.card, shaba = province_factor[0].bank.shaba, account = province_factor[0].bank.account, else: name_of_bank_user = None bank_name = None card = None shaba = None account = None share_allocation = ShareOfAllocation.objects.all() if share_allocation.count() > 0: share_allocation = share_allocation.last() total = share_allocation.total else: total = 0 if province_factor[0].poultry_factor == None: poultry_share_with_profit = province_factor[0].shares['poultryShareWithProfit'] else: poultry_share_with_profit = province_factor[0].poultry_factor.total_price province_operator = province_factor[0].province_check_info.province_operator internal_dict_infos.update({ "province_factor_to_kill_house": { "province_factor_key": province_factor[0].key, "province_factor_fee": province_factor[0].factor_fee, "province_operator": province_operator.user.fullname, "province_mobile": province_operator.user.mobile, "weight": province_factor[0].total_weight, "bar_code": province_factor[0].factor_bar_code, "kill_house_name": province_factor[ 0].province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name, "kill_house_mobile": province_factor[ 0].province_check_info.kill_house_assignment.kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile, "cost": province_factor[0].total_price, "poultry_share_with_profit": poultry_share_with_profit, "union_share_with_profit": province_factor[0].shares['unionShareWithProfit'], "total_amount_char": words(province_factor[0].total_price) + " " + "ریال", "total_share_allocation": province_factor[0].total_weight * total, "total_share_allocation_char": words( province_factor[0].total_weight * total) + " " + "ریال", "name_of_bank_user": name_of_bank_user, "bank_name": bank_name, "card": card, "shaba": shaba, "account": account, } }) if not province_factor: internal_dict_infos.update({ "province_factor_to_kill_house": None }) kill_house_factor_poultry = KillHouseFactorToPoultry.objects.filter( province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if kill_house_factor_poultry.count(): kill_house_factor_poultry = kill_house_factor_poultry.last() internal_dict_infos.update({ "kill_house_factor_to_poultry": { "kill_house_name": kill_house_request.killhouse_user.name, "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, "time": kill_house_factor_poultry.create_date, "payment_code": kill_house_factor_poultry.payment_code, "factor_image": kill_house_factor_poultry.factor_image, "factor_key": kill_house_factor_poultry.key, "factor_state": kill_house_factor_poultry.state, "total_money": kill_house_factor_poultry.province_factor.total_price, "factor_message": kill_house_factor_poultry.message } }) if not kill_house_factor_poultry: internal_dict_infos.update({ "kill_house_factor_to_poultry": None }) kill_house_factor = KillHouseFactorToProvince.objects.filter( province_factor__province_check_info__kill_house_assignment__kill_house_request__kill_house_request_auction_winner__kill_house_request_auction__poultry_request=poultry_request, province_factor__province_check_info__kill_house_assignment__kill_house_request=kill_house_request, trash=False) if kill_house_factor: internal_dict_infos.update({ "kill_house_factor_to_province": { "kill_house_name": kill_house_request.killhouse_user.name, "kill_house_user_city": kill_house_request.killhouse_user.system_address.city.name, "kill_house_user_province": kill_house_request.killhouse_user.system_address.province.name, "time": kill_house_factor[0].create_date, "payment_code": kill_house_factor[0].payment_code, "factor_image": kill_house_factor[0].factor_image, "factor_key": kill_house_factor[0].key, "total_money": kill_house_factor[0].province_factor.total_price, "factor_state": kill_house_factor[0].state, "factor_message": kill_house_factor[0].message } }) if not kill_house_factor: internal_dict_infos.update({ "kill_house_factor_to_province": None }) reqs.append(internal_dict_infos) process.update({"auction": reqs}) elif kill_house_reqs.count() > 0: process.update({"auction": None}) allocation = DepositAllocation.objects.filter(poultry=poultry_request, trash=False) if allocation.count() > 0: if request.GET['role'] == 'Poultry': if poultry_request.poultry.user_bank_info != None: poultry_bank_info = poultry_request.poultry.user_bank_info.name_of_bank_user poultry_bank_name = poultry_request.poultry.user_bank_info.bank_name poultry_card_number = poultry_request.poultry.user_bank_info.card poultry_shaba = poultry_request.poultry.user_bank_info.shaba else: poultry_bank_info = None poultry_bank_name = None poultry_card_number = None poultry_shaba = None process.update({"allocation": {"allocation_key": allocation[0].key, "poultry_share_digit": allocation[0].poultry_share, "poultry_share_char": words( allocation[0].poultry_share) + " " + 'ریال', "poultry_share_payment": allocation[0].poultry_share_payment, "poultry_remaining": (allocation[0].poultry_share - allocation[ 0].poultry_share_payment), "poultry_payment_documents": allocation[ 0].poultry_share_payment_info, "poultry_bank_info": poultry_bank_info, "poultry_bank_name": poultry_bank_name, "poultry_card_number": poultry_card_number, "poultry_shaba": poultry_shaba, "poultry_image": allocation[0].poultry_image, }}) elif request.GET['role'] == 'CityOperator': if city_operator.user_bank_info != None: city_bank_info = city_operator.user_bank_info.name_of_bank_user city_bank_name = city_operator.user_bank_info.bank_name city_card_number = city_operator.user_bank_info.card city_shaba = city_operator.user_bank_info.shaba else: city_bank_info = None city_bank_name = None city_card_number = None city_shaba = None process.update({"allocation": {"allocation_key": allocation[0].key, "city_share_digit": allocation[0].city_share, "city_share_char": words( allocation[0].city_share) + " " + 'ریال', "city_share_payment": allocation[0].city_share_payment, "city_share_remaining": ( allocation[0].city_share - allocation[0].city_share_payment), "city_payment_documents": allocation[0].city_share_payment_info, "city_image": allocation[0].city_image, "city_bank_info": city_bank_info, "city_bank_name": city_bank_name, "city_card_number": city_card_number, "city_shaba": city_shaba, }}) else: process.update({"allocation": None}) if not allocation: process.update({"allocation": None}) province_incpector = PovinceInspector.objects.filter(poultry_request=poultry_request, trash=False) if province_incpector: process.update( {"province_incpector": {"inspector_name": province_incpector[0].inspector_operator.user.fullname, "state": province_incpector[0].state, "message": province_incpector[0].message, "accept-reject-date": province_incpector[0].create_date, }}) if not province_incpector: province_name = poultry_request.poultry.address.province.name inspector = InspectorOperator.objects.get(address__province__name=province_name, trash=False) process.update({"province_incpector": {"province_incpector": None, "state": 'pending', "inspector_name": inspector.user.fullname, "inspector_mobile": inspector.user.mobile, "inspector_address": inspector.address.province.name}}) process1.update({"process": process}) return Response(process1, status=status.HTTP_200_OK) # ویوست مربوط به ثبت و نمایش و ... مستاجر مرغداری class PoultryRequestAuctionViewSet(viewsets.ModelViewSet): queryset = PoultryRequestAuction.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryRequestAuction # ویوست مربوط به وارد کردن اطلاعات بار توسط مرغدار class PoultryAssignmentInformationViewSet(viewsets.ModelViewSet): queryset = PoultryAssignmentInformation.objects.all() serializer_class = PoultryAssignmentInformationSerializer permission_classes = [TokenHasReadWriteScope] # تابع مربوط به وارد کردن اطلاعات بار توسط مرغدار def create(self, request, *args, **kwargs): # refresh(request.user.id) poultry = PoultryRequest.objects.get(key=request.data['key'], trash=False) car_without_load_image = request.data['car_without_load_image'] car_with_load_image = request.data['car_with_load_image'] request.data.pop('key') request.data.pop('car_without_load_image') request.data.pop('car_with_load_image') pic = [] pic.append(car_without_load_image) pic.append(car_with_load_image) serializer = self.serializer_class(data=request.data) if serializer.is_valid(): poultry_assignment_info = serializer.create(validated_data=request.data) poultry_assignment_info.poultry_request = poultry for p in pic: if p == car_without_load_image: poultry_assignment_info.car_weight_without_load_image = send_image_to_server(p) else: poultry_assignment_info.car_weight_with_load_image = send_image_to_server(p) poultry_assignment_info.save() assignment_info_serializer = self.serializer_class(poultry_assignment_info) return Response(assignment_info_serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) # تابع مربوط به ویرایش اطلاعات بار وارد شده توسط مرغدار def update(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) poultry_assignment = PoultryAssignmentInformation.objects.get(key__exact=request.data["key"], trash=False) request.data.pop('key') try: if request.data['car_without_load_image'] == "": car_without_load_image = None else: car_without_load_image = request.data['car_without_load_image'] request.data.pop('car_without_load_image') except: car_without_load_image = None try: if request.data['car_with_load_image'] == "": car_with_load_image = None else: car_with_load_image = request.data['car_with_load_image'] request.data.pop('car_with_load_image') except: car_with_load_image = None if car_without_load_image: poultry_assignment.car_weight_without_load_image = send_image_to_server(car_without_load_image) if car_with_load_image: poultry_assignment.car_weight_with_load_image = send_image_to_server(car_with_load_image) poultry_assignment.save() serializer = self.serializer_class(poultry_assignment) serializer.update(instance=poultry_assignment, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) # ویوست مربوط به سرچ درخواست مرغدار class PoultryRequestSearchViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): # refresh(request.user.id) if 'type' in request.GET: if request.GET['type'] == 'fullname': queryset = PoultryRequest.objects.filter(user__fullname=request.GET['value'], trash=False) serializer = PoultryRequestSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['type'] == 'mobile': queryset = PoultryRequest.objects.filter(user__mobile=request.GET['value'], trash=False) serializer = PoultryRequestSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['type'] == 'gis_code': queryset = PoultryRequest.objects.filter(user__gis_code=request.GET['value'], trash=False) serializer = PoultryRequestSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['type'] == 'order_code': queryset = PoultryRequest.objects.get(order_code=int(request.GET['value']), trash=False) serializer = PoultryRequestSerializer(queryset) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['type'] == 'bar_code': poultry = KillHouseRequest.objects.get( bar_code=int(request.GET['value'])).province_request.city_request_Poultry.poultry_request queryset = PoultryRequest.objects.get(key=poultry.key, trash=False) serializer = PoultryRequestSerializer(queryset) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['type'] == 'city': queryset = PoultryRequest.objects.filter(user__address__city=request.GET['value'], trash=False) serializer = PoultryRequestSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) elif request.GET['type'] == 'province': queryset = PoultryRequest.objects.filter(user__address__province=request.GET['value'], trash=False) serializer = PoultryRequestSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN) # تابع برای کنسل کردن اتوماتیک درخواست بورسی مرغدار طبق شرایط خاص @api_view(["POST"]) @csrf_exempt @permission_classes([AllowAny]) def Cancel_Poultry_Exchange_request(request): for req in PoultryRequestExchange.objects.all(): if (req.send_date - req.hatching_date).days > 65: req.trash = True req.save() return Response("ok") def Check_Poultry_Auction_request(): reqs = PoultryRequest.objects.filter(auction=True, final_state='pending', trash=False).order_by('send_date') for req in reqs: now = datetime.datetime.now() kill_house_auction = KillHouseRequestAction.objects.filter(poultry_request=req, trash=False).order_by('fee') auction = PoultryRequestAuction.objects.filter(poultry_request=req, state='active', trash=False) if auction.count() > 0: auction = auction.last() if now.year >= auction.auction_date.year and now.month >= auction.auction_date.month and now.day >= auction.auction_date.day and now.hour >= auction.auction_date.hour and now.minute >= auction.auction_date.minute: if kill_house_auction.count() > 0: kill_house_auction = kill_house_auction.last() kill_house_auction_win = KillHouseRequestActionWinner( kill_house_request_auction=kill_house_auction, fee=kill_house_auction.fee, quantity=req.quantity ) kill_house_auction_win.save() req.auction = False req.save() auction.state = 'complete' auction.save() kill_house_auction.state = 'accepted' kill_house_auction.save() kill_house_aucs = KillHouseRequestAction.objects.filter(poultry_request=req, state='pending', trash=False) for kill_house_auc in kill_house_aucs: kill_house_auc.state = 'unaccepted' kill_house_auc.save() auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', trash=False) for auc in auctions: auc.state = 'complete' auc.save() else: auction.state = 'complete' auction.save() auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', trash=False).order_by( 'auction_date') if auctions.count() > 0: for auction in auctions: auction.state = 'active' auction.save() break else: if req.union == True: req.auction = False req.save() city_operator_check_request = CityOperatorCheckRequest.objects.get(poultry_request=req, trash=False) city_operator_check_request.show_province = True city_operator_check_request.save() return Response({"result": "system checked"}, status=status.HTTP_200_OK) @api_view(["POST"]) @csrf_exempt @permission_classes([AllowAny]) def Check_Poultry_Auction_request_front(request): reqs = PoultryRequest.objects.filter(auction=True, final_state='pending', trash=False).order_by('send_date') for req in reqs: now = datetime.datetime.now() kill_house_auction = KillHouseRequestAction.objects.filter(poultry_request=req, trash=False).order_by('fee') auction = PoultryRequestAuction.objects.filter(poultry_request=req, state='active', trash=False) if auction.count() > 0: auction = auction.last() if now.year >= auction.auction_date.year and now.month >= auction.auction_date.month and now.day >= auction.auction_date.day and now.hour >= auction.auction_date.hour and now.minute >= auction.auction_date.minute: if kill_house_auction.count() > 0: kill_house_auction = kill_house_auction.last() kill_house_auction_win = KillHouseRequestActionWinner( kill_house_request_auction=kill_house_auction, fee=kill_house_auction.fee, quantity=req.quantity ) kill_house_auction_win.save() req.auction = False req.save() auction.state = 'complete' auction.save() kill_house_auction.state = 'accepted' kill_house_auction.save() kill_house_aucs = KillHouseRequestAction.objects.filter(poultry_request=req, state='pending', trash=False) for kill_house_auc in kill_house_aucs: kill_house_auc.state = 'unaccepted' kill_house_auc.save() auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', trash=False) for auc in auctions: auc.state = 'complete' auc.save() else: auction.state = 'complete' auction.save() auctions = PoultryRequestAuction.objects.filter(poultry_request=req, state='inactive', trash=False).order_by( 'auction_date') if auctions.count() > 0: for auction in auctions: auction.state = 'active' auction.save() break else: if req.union == True: req.auction = False req.save() city_operator_check_request = CityOperatorCheckRequest.objects.get(poultry_request=req, trash=False) city_operator_check_request.show_province = True city_operator_check_request.save() return Response({"result": "system checked"}, status=status.HTTP_200_OK) class Chicken_informationViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() serializer_class = PoultryHatchingSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): # refresh(request.user.id) poultry_list = [] quantity_list = [] now = datetime.datetime.now().date() poultryhatchings = PoultryHatching.objects.filter(state='pending', trash=False) if poultryhatchings.count() > 0: if 'age1' in request.GET: if 'age2' in request.GET: for poultryhatching in poultryhatchings: if int(request.GET['age1']) <= (now - poultryhatching.date.date()).days + 1 and ( now - poultryhatching.date.date()).days + 1 <= int(request.GET['age2']): quantity_list.append(poultryhatching.quantity) internal_dict = { "full_name": poultryhatching.poultry.user.fullname, "mobile": poultryhatching.poultry.user.mobile, "city": poultryhatching.poultry.user.city.name, "province": poultryhatching.poultry.user.province.name, "unit_name": poultryhatching.poultry.unit_name, "breeding_unique_id": poultryhatching.poultry.breeding_unique_id, "quantity": quantity_list, } poultry_list.append(internal_dict) else: for poultryhatching in poultryhatchings: if (now - poultryhatching.date.date()).days + 1 == int(request.GET['age1']): internal_dict = { "full_name": poultryhatching.poultry.user.fullname, "mobile": poultryhatching.poultry.user.mobile, "city": poultryhatching.poultry.user.city.name, "province": poultryhatching.poultry.user.province.name, "unit_name": poultryhatching.poultry.unit_name, "breeding_unique_id": poultryhatching.poultry.breeding_unique_id, "quantity": poultryhatching.quantity, } poultry_list.append(internal_dict) return Response(poultry_list, status=status.HTTP_200_OK) class SingleAgeHatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [AllowAny] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): now = timezone.now().date() ages_list = [] hatching_list = [] hatches = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False , trash=False).order_by( '-date') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) hatchs = hatches.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) hatchs = hatches.filter(poultry__address__city=user.city) else: hatchs = hatches else: hatchs = hatches for hatch in hatchs: if (now - hatch.date.date()).days + 1 not in ages_list: ages_list.append((now - hatch.date.date()).days + 1) # age_difference = ExpressionWrapper(now - F('date'), output_field=DurationField()) # hatchs = hatchs.annotate(age_difference=age_difference) for age_list in ages_list: quantity = 0 losses = 0 for hatch in hatchs: age = (now - hatch.date.date()).days + 1 if age == age_list: quantity += hatch.left_over losses += hatch.losses hatching_list.append({ "type": age_list, "quantity": quantity, "losses": losses, }) return Response(hatching_list, status=status.HTTP_200_OK) class DoughnutHatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [AllowAny] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): year = datetime.datetime.now().year total = 0 city_list = [] hatching_list = [] hatchings_list = [] hatchingss_lists = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False).order_by( '-date') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) hatchingss_list = hatchingss_lists.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) hatchingss_list = hatchingss_lists.filter(poultry__address__city=user.city) else: hatchingss_list = hatchingss_lists else: hatchingss_list = hatchingss_lists for hatchingss in hatchingss_list: if (jdatetime.datetime.fromgregorian(year=hatchingss.date.year, month=hatchingss.date.month, day=hatchingss.date.day)).month == int(request.GET['month']): hatchings_list.append(hatchingss) total += hatchingss.quantity if hatchingss.poultry.address.city not in city_list: city_list.append(hatchingss.poultry.address.city) for city in city_list: quantity = 0 for hatch in hatchings_list: if hatch.poultry.address.city == city: quantity += hatch.quantity hatching_list.append({ "city": city.name, "percent": round((quantity / total) * 100, 2), "quantity": quantity, }) return Response(hatching_list, status=status.HTTP_200_OK) class DoughnutHatchingLeftOverStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [AllowAny] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): year = datetime.datetime.now().year total = 0 city_list = [] hatching_list = [] hatchings_list = [] hatchingss_lists = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False).order_by( '-date') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) hatchingss_list = hatchingss_lists.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) hatchingss_list = hatchingss_lists.filter(poultry__address__city=user.city) else: hatchingss_list = hatchingss_lists else: hatchingss_list = hatchingss_lists for hatchingss in hatchingss_list: if (jdatetime.datetime.fromgregorian(year=hatchingss.date.year, month=hatchingss.date.month, day=hatchingss.date.day)).month == int(request.GET['month']): hatchings_list.append(hatchingss) total += hatchingss.left_over if hatchingss.poultry.address.city not in city_list: city_list.append(hatchingss.poultry.address.city) for city in city_list: quantity = 0 for hatch in hatchings_list: if hatch.poultry.address.city == city: quantity += hatch.left_over hatching_list.append({ "city": city.name, "percent": round((quantity / total) * 100, 2), "quantity": quantity, }) return Response(hatching_list, status=status.HTTP_200_OK) class HatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [AllowAny] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): # user = SystemUserProfile.objects.get(user=request.user) now = timezone.now().date() age_ranges = [ (1, 5), (6, 10), (11, 15), (16, 20), (21, 25), (26, 30), (31, 35), (36, 40), (41, 45), (46, 50), (51, 55), (56, 60), (61, 65), (66, 70), (71, 75), (76, 80), (81, 85), (86, 90), (91, 95), (96, 100) ] age_ranges_dict = {f"{start}_{end}": {"quantity": 0, "losses": 0} for start, end in age_ranges} hatches = PoultryHatching.objects.filter(state='pending', allow_hatching='pending', archive=False, trash=False).order_by( 'date') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) hatchs = hatches.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) hatchs = hatches.filter(poultry__address__city=user.city) else: hatchs = hatches else: hatchs = hatches for hatch in hatchs: age = (now - hatch.date.date()).days + 1 for age_range, range_data in age_ranges_dict.items(): start_age, end_age = map(int, age_range.split('_')) if start_age <= age <= end_age: range_data["quantity"] += hatch.left_over range_data["losses"] += hatch.losses information_list = [{"type": age_range, **data} for age_range, data in age_ranges_dict.items()] return Response(information_list) class PoultryRequestProcessDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [AllowAny] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): poultry_request_quantity = 0 poultry_request_index_weight = 0 poultry_quantity = 0 poultry_list = [] now = datetime.datetime.now().date() poultry_reqs = PoultryRequest.objects.filter(state_process='accepted', province_state='accepted', archive=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day, trash=False).select_related( 'poultry').only('poultry', 'quantity', 'Index_weight') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) poultry_requests = poultry_reqs.filter(poultry__address__city=user.city) else: poultry_requests = poultry_reqs else: poultry_requests = poultry_reqs for poultry_request in poultry_requests: if poultry_request.poultry not in poultry_list: poultry_list.append(poultry_request.poultry) poultry_request_quantity += poultry_request.quantity poultry_request_index_weight += round(poultry_request.quantity * poultry_request.Index_weight) poultry_quantity = len(poultry_list) # province_kill_requests_list = ProvinceKillRequest.objects.filter(state='accepted', trash=False).select_related( # 'province_request__poultry_request', 'kill_request__kill_house').only( # 'province_request__poultry_request__Index_weight', 'quantity', 'kill_request__kill_house') # # province_kill_requests = [ # province_kill_request_list for province_kill_request_list in province_kill_requests_list # if date1 <= province_kill_request_list.kill_request.recive_date.date() <= date2 # ] # for province_kill_request in province_kill_requests: # if province_kill_request.kill_request.kill_house not in kill_house_list: # kill_house_list.append(province_kill_request.kill_request.kill_house) # province_kill_request_index_weight += province_kill_request.quantity * province_kill_request.province_request.poultry_request.Index_weight # province_kill_request_quantity += province_kill_request.quantity # kill_house_quantity = len(kill_house_list) # # kill_house_requests_list = KillHouseRequest.objects.filter(trash=False).select_related( # 'province_kill_request__province_request__poultry_request', 'kill_request').only( # 'province_kill_request__province_request__poultry_request__Index_weight', 'kill_request', 'quantity', # 'vet_state') # # kill_house_requests = [ # kill_house_request_list for kill_house_request_list in kill_house_requests_list # if date1 <= kill_house_request_list.kill_request.recive_date.date() <= date2 # ] # for kill_house_request in kill_house_requests: # kill_house_assignment_information = KillHouseAssignmentInformation.objects.filter( # kill_house_request=kill_house_request, trash=False).only('net_weight').last() # if kill_house_assignment_information: # kill_house_request_weight += kill_house_assignment_information.net_weight # else: # # kill_house_request_weight += kill_house_request.quantity * kill_house_request.province_kill_request.province_request.poultry_request.Index_weight # if kill_house_request.clearance_code != None: # clearance_code_counter += 1 # if kill_house_request.vet_state == 'accepted': # vet_state_counter += 1 # kill_house_request_quantity += kill_house_request.quantity return Response({ "poultry_quantity": poultry_quantity, "poultry_request_quantity": poultry_request_quantity, "poultry_request_index_weight": poultry_request_index_weight, # "province_kill_request_quantity": province_kill_request_quantity, # "province_kill_request_index_weight": province_kill_request_index_weight, # "kill_house_quantity": kill_house_quantity, # "clearance_code_counter": clearance_code_counter, # "kill_house_request_quantity": kill_house_request_quantity, # "kill_house_request_weight": kill_house_request_weight, # "vet_state_counter": vet_state_counter, }) class ProvinceKillRequestProcessDashboardViewSet(viewsets.ModelViewSet): queryset = ProvinceKillRequest.objects.all() permission_classes = [AllowAny] serializer_class = ProvinceKillRequestSerializer def list(self, request, *args, **kwargs): province_kill_request_quantity = 0 province_kill_request_index_weight = 0 kill_house_quantity = 0 kill_house_list = [] now = datetime.datetime.now().date() province_kill_reqs = ProvinceKillRequest.objects.filter(state__in=('accepted', 'pending'), kill_request__recive_date__year=now.year, kill_request__recive_date__month=now.month, kill_request__recive_date__day=now.day, trash=False).select_related( 'province_request__poultry_request', 'kill_request__kill_house').only( 'province_request__poultry_request__Index_weight', 'quantity', 'kill_request__kill_house') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) province_kill_requests = province_kill_reqs.filter( province_request__poultry_request__poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) province_kill_requests = province_kill_reqs.filter( province_request__poultry_request__poultry__address__city=user.city) else: province_kill_requests = province_kill_reqs else: province_kill_requests = province_kill_reqs for province_kill_request in province_kill_requests: if province_kill_request.kill_request.kill_house not in kill_house_list: kill_house_list.append(province_kill_request.kill_request.kill_house) province_kill_request_index_weight += province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight province_kill_request_quantity += province_kill_request.main_quantity kill_house_quantity = len(kill_house_list) return Response({ "province_kill_request_quantity": province_kill_request_quantity, "province_kill_request_index_weight": province_kill_request_index_weight, "kill_house_quantity": kill_house_quantity, }) class KillHouseRequestVetFarmProcessDashboardViewSet(viewsets.ModelViewSet): queryset = KillHouseRequest.objects.all() permission_classes = [AllowAny] serializer_class = KillHouseRequestSerializer def list(self, request, *args, **kwargs): kill_house_request_quantity = 0 kill_house_request_weight = 0 clearance_code_counter = 0 now = datetime.datetime.now().date() kill_house_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__year=now.year, kill_request__recive_date__month=now.month, kill_request__recive_date__day=now.day, trash=False).select_related( 'province_kill_request__province_request__poultry_request', 'kill_request').only( 'province_kill_request__province_request__poultry_request__Index_weight', 'kill_request', 'quantity', 'vet_state', 'clearance_code') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) kill_house_requests = kill_house_reqs.filter( province_request__poultry_request__poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) kill_house_requests = kill_house_reqs.filter( province_request__poultry_request__poultry__address__city=user.city) else: kill_house_requests = kill_house_reqs else: kill_house_requests = kill_house_reqs for kill_house_request in kill_house_requests: kill_house_assignment_information = KillHouseAssignmentInformation.objects.filter( kill_house_request=kill_house_request, trash=False).only('net_weight').last() if kill_house_assignment_information: kill_house_request_weight += kill_house_assignment_information.net_weight else: kill_house_request_weight += kill_house_request.quantity * kill_house_request.province_kill_request.province_request.poultry_request.Index_weight if kill_house_request.clearance_code != None: clearance_code_counter += 1 kill_house_request_quantity += kill_house_request.quantity return Response({ "kill_house_quantity": kill_house_request_quantity, "clearance_code_counter": clearance_code_counter, "kill_house_request_weight": kill_house_request_weight, }) class KillHouseRequestVetProcessDashboardViewSet(viewsets.ModelViewSet): queryset = KillHouseRequest.objects.all() permission_classes = [AllowAny] serializer_class = KillHouseRequestSerializer def list(self, request, *args, **kwargs): kill_house_request_quantity = 0 kill_house_request_weight = 0 vet_check_counter = 0 now = datetime.datetime.now().date() kill_house_reqs = KillHouseRequest.objects.filter(kill_request__recive_date__year=now.year, kill_request__recive_date__month=now.month, kill_request__recive_date__day=now.day, trash=False, vet_state='accepted').select_related( 'province_kill_request__province_request__poultry_request', 'kill_request').only( 'province_kill_request__province_request__poultry_request__Index_weight', 'kill_request', 'quantity', 'vet_state') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': user = SystemUserProfile.objects.get(user=request.user) city_operator = CityOperator.objects.get(trash=False, user=user) kill_house_requests = kill_house_reqs.filter( province_request__poultry_request__poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: user = SystemUserProfile.objects.get(user=request.user) kill_house_requests = kill_house_reqs.filter( province_request__poultry_request__poultry__address__city=user.city) else: kill_house_requests = kill_house_reqs else: kill_house_requests = kill_house_reqs for kill_house_request in kill_house_requests: kill_house_assignment_information = KillHouseAssignmentInformation.objects.filter( kill_house_request=kill_house_request, trash=False).only('net_weight').last() if kill_house_assignment_information: kill_house_request_weight += kill_house_assignment_information.net_weight else: kill_house_request_weight += kill_house_request.quantity * kill_house_request.province_kill_request.province_request.poultry_request.Index_weight if kill_house_request.vet_state == 'accepted': vet_check_counter += 1 kill_house_request_quantity += kill_house_request.quantity return Response({ "kill_house_quantity": kill_house_request_quantity, "vet_check_counter": vet_check_counter, "kill_house_request_weight": kill_house_request_weight, }) class TotalPoultryRequestStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryRequestSerializer def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user) accepted_poultry_request_quantity = 0 accepted_kill_house_request_quantity = 0 poultry_reqs = PoultryRequest.objects.filter(state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False).only( 'quantity', 'province_state', 'state_process') kill_house_reqs = KillHouseRequest.objects.filter(trash=False).only('quantity', 'vet_state') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(trash=False, user=user) poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) kill_house_requests = kill_house_reqs.filter( province_request__poultry_request__poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultry_requests = poultry_reqs.filter(poultry__address__city=user.city) kill_house_requests = kill_house_reqs.filter( province_request__poultry_request__poultry__address__city=user.city) else: poultry_requests = poultry_reqs kill_house_requests = kill_house_reqs else: poultry_requests = poultry_reqs kill_house_requests = kill_house_reqs total_poultry_request_quantity = poultry_requests.aggregate(total_quantity=Sum('quantity')).get( 'total_quantity', 0) for poultry_request in poultry_requests: if poultry_request.state_process == 'accepted' and poultry_request.province_state == 'accepted' and poultry_request.archive == False: accepted_poultry_request_quantity += poultry_request.quantity total_kill_house_request_quantity = kill_house_requests.aggregate(total_quantity=Sum('quantity')).get( 'total_quantity', 0) for kill_house_request in kill_house_requests: if kill_house_request.vet_state == 'accepted': accepted_kill_house_request_quantity += kill_house_request.quantity return Response({ "total_poultry_request_quantity": total_poultry_request_quantity, "accepted_poultry_request_quantity": accepted_poultry_request_quantity, "total_kill_house_request_quantity": total_kill_house_request_quantity, "accepted_kill_house_request_quantity": accepted_kill_house_request_quantity, }) class TotalFilePoultryRequestStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() permission_classes = [AllowAny] serializer_class = PoultryRequestSerializer def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user) accepted_poultry_request_quantity = 0 rejected_poultry_request_quantity = 0 archive_poultry_request_quantity = 0 poultry_reqs = PoultryRequest.objects.filter(trash=False).only('quantity', 'province_state', 'state_process', 'archive', 'final_state') if 'role' in request.GET: if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(trash=False, user=user) poultry_requests = poultry_reqs.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultry_requests = poultry_reqs.filter(poultry__address__city=user.city) else: poultry_requests = poultry_reqs else: poultry_requests = poultry_reqs for poultry_request in poultry_requests: if poultry_request.state_process == 'accepted' and poultry_request.province_state == 'accepted' and poultry_request.archive == False: accepted_poultry_request_quantity += 1 if poultry_request.province_state == 'rejected' or poultry_request.state_process == 'rejected': rejected_poultry_request_quantity += 1 if poultry_request.archive == True: archive_poultry_request_quantity += 1 return Response({ "total_poultry_request_quantity": poultry_requests.count(), "accepted_poultry_request_quantity": accepted_poultry_request_quantity, "rejected_poultry_request_quantity": rejected_poultry_request_quantity, "archive_poultry_request_quantity": archive_poultry_request_quantity, }) class TotalPoultryHatchingStatisticsDashboardViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingSerializer filterset_class = PoultryManageFilterSet def list(self, request, *args, **kwargs): value = request.GET.get('value') search = request.GET.get('search') poultreis = Poultry.objects.filter(trash=False).select_related('user', 'address__province', 'address__city') if 'role' in request.GET: user = SystemUserProfile.objects.get(user=request.user) if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(trash=False, user=user) poultrys = poultreis.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultrys = poultreis.filter(poultry__user__city=user.city) else: poultrys = poultreis else: poultrys = poultreis if value and search == 'filter': if value != 'undefined' and value.strip(): poultrys = poultreis.filter( build_query(self.filterset_class, value) ) all_period = 0 all_total_quantity = 0 all_hatching_pending = 0 all_total_quantity_poultry_hatching_pending = 0 all_total_left_over_poultry_hatching_pending = 0 all_kill_request = 0 all_kill_request_quantity = 0 all_all_weight_loss = 0 len_werhouse_enter = 0 for poultry in poultrys: poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False).only('quantity', 'left_over' ) if poultry_hatching: poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending', archive=False).last() if poultry_hatching_pending: all_hatching_pending += 1 if poultry_hatching_pending: period = poultry_hatching_pending.period else: period = poultry_hatching.last().period all_period += period poultry_hatching_pending1 = poultry_hatching.filter(state='pending', allow_hatching='pending', archive=False) total_quantity = \ poultry_hatching.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_quantity_poultry_hatching_pending = \ poultry_hatching_pending1.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_left_over_poultry_hatching_pending = \ poultry_hatching_pending1.aggregate(total=Sum('left_over'))[ 'total'] or 0 all_total_quantity += total_quantity all_total_quantity_poultry_hatching_pending += total_quantity_poultry_hatching_pending all_total_left_over_poultry_hatching_pending += total_left_over_poultry_hatching_pending poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry, state_process__in=('accepted', 'pending'), province_state__in=('accepted', 'pending')).only( 'quantity', 'Index_weight') kill_request = KillHouseRequest.objects.filter(trash=False, province_request__poultry_request__in=poultry_request).only( 'accepted_real_quantity', 'accepted_real_weight') all_kill_request += len(kill_request) kill_request_quantity = kill_request.aggregate( total=Sum('accepted_real_quantity'))[ 'total'] or 0 all_kill_request_quantity += kill_request_quantity werhouse_enter = kill_request.filter(ware_house_confirmation=True).only( 'ware_house_accepted_real_quantity', 'ware_house_accepted_real_weight', 'weight_loss') all_weight_loss = werhouse_enter.aggregate( total_quantity=Sum('weight_loss')).get( 'total_quantity', 0) or 0 all_all_weight_loss += all_weight_loss len_werhouse_enter += len(werhouse_enter) return Response({ "poultryCounts": len(poultrys), "allPeriod": all_period, "allTotalQuantity": all_total_quantity, "hatchingPending": all_hatching_pending, "totalQuantityPoultryHatchingPending": all_total_quantity_poultry_hatching_pending, "totalLeftOverPoultryHatchingPending": all_total_left_over_poultry_hatching_pending, "allKillRequest": all_kill_request, "allKillRequestQuantity": all_kill_request_quantity, "percentLoss": round(int(all_all_weight_loss) / len_werhouse_enter, 2) if len_werhouse_enter > 0 else 0, }) # test class Chart_DashbourdViewSet(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryHatchingSerializer def list(self, request, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) poultry_hatching = {} price_dict = {} price_list = [] poultry_requests = {} kill_house_requests = {} operators = {} prices = {} file = {} box = {} total_users = 0 number_of_users = 0 number_of_operators = 0 chicken_price = 0 celling_chicken_price = 0 floor_chicken_price = 0 total_users = 0 total_hatching = 0 total_lossess = 0 real_hatching = 0 total_list = [] killcapacity = 0 poultryquentity = 0 now = datetime.datetime.now().date() quantity_1_5 = 0 quantity_1_5_losses = 0 quantity_5_10 = 0 quantity_5_10_losses = 0 quantity_10_15 = 0 quantity_10_15_losses = 0 quantity_15_20 = 0 quantity_15_20_losses = 0 quantity_20_25 = 0 quantity_20_25_losses = 0 quantity_25_30 = 0 quantity_25_30_losses = 0 quantity_30_35 = 0 quantity_30_35_losses = 0 quantity_35_40 = 0 quantity_35_40_losses = 0 quantity_40_45 = 0 quantity_40_45_losses = 0 quantity_45_50 = 0 quantity_45_50_losses = 0 quantity_50_55 = 0 quantity_50_55_losses = 0 quantity_55_60 = 0 quantity_55_60_losses = 0 killreques_10 = 0 killreques_20 = 0 killreques_30 = 0 killreques_40 = 0 killreques_50 = 0 killreques_60 = 0 if 'city' in request.GET: hatchs = PoultryHatching.objects.filter(state='pending', poultry__address__city__name=request.GET['city'], poultry__address__province=user.province) elif 'breed' in request.GET: hatchs = PoultryHatching.objects.filter(state='pending', chicken_breed=request.GET['breed'], poultry__address__province=user.province) else: hatchs = PoultryHatching.objects.filter(state='pending', poultry__address__province=user.province) if hatchs.count() > 0: for hatch in hatchs: age = (now - hatch.date.date()).days + 1 if age >= 1 and age <= 5: quantity_1_5 += hatch.quantity quantity_1_5_losses += hatch.losses elif age >= 5 and age <= 10: quantity_5_10 += hatch.quantity quantity_5_10_losses += hatch.losses elif age >= 10 and age <= 15: quantity_10_15 += hatch.quantity quantity_10_15_losses += hatch.losses elif age >= 15 and age <= 20: quantity_15_20 += hatch.quantity quantity_15_20_losses += hatch.losses elif age >= 20 and age <= 25: quantity_20_25 += hatch.quantity quantity_20_25_losses += hatch.losses elif age >= 25 and age <= 30: quantity_25_30 += hatch.quantity quantity_25_30_losses += hatch.losses elif age >= 30 and age <= 35: quantity_30_35 += hatch.quantity quantity_30_35_losses += hatch.losses elif age >= 35 and age <= 40: quantity_35_40 += hatch.quantity quantity_35_40_losses += hatch.losses elif age >= 40 and age <= 45: quantity_40_45 += hatch.quantity quantity_40_45_losses += hatch.losses elif age >= 45 and age <= 50: quantity_45_50 += hatch.quantity quantity_45_50_losses += hatch.losses elif age >= 50 and age <= 55: quantity_50_55 += hatch.quantity quantity_50_55_losses += hatch.losses elif age >= 55 and age <= 60: quantity_55_60 += hatch.quantity quantity_55_60_losses += hatch.losses information_list = [ {"type": "1_5", "quantity": quantity_1_5, "losses": quantity_1_5_losses}, {"type": "5_10", "quantity": quantity_5_10, "losses": quantity_5_10_losses}, {"type": "10_15", "quantity": quantity_10_15, "losses": quantity_10_15_losses}, {"type": "15_20", "quantity": quantity_15_20, "losses": quantity_15_20_losses}, {"type": "20_25", "quantity": quantity_20_25, "losses": quantity_20_25_losses}, {"type": "25_30", "quantity": quantity_25_30, "losses": quantity_25_30_losses}, {"type": "30_35", "quantity": quantity_30_35, "losses": quantity_30_35_losses}, {"type": "35_40", "quantity": quantity_35_40, "losses": quantity_35_40_losses}, {"type": "40_45", "quantity": quantity_40_45, "losses": quantity_40_45_losses}, {"type": "45_50", "quantity": quantity_45_50, "losses": quantity_45_50_losses}, {"type": "50_55", "quantity": quantity_50_55, "losses": quantity_5_10_losses}, {"type": "55_60", "quantity": quantity_55_60, "losses": quantity_55_60_losses}, ] else: information_list = [] poultry_hatching.update({"poultry_hatching": information_list}) total_list.append(poultry_hatching) pricing = Pricing.objects.all() price_internal_dict = {} for price in pricing: inter_dict = { "price": price.live_chicken_price, "date": price.date } price_list.append(inter_dict) inter_dict = {} price_internal_dict.update({"price_list": price_list}) total_list.append(price_internal_dict) poultry = Poultry.objects.filter(user__province=user.province) city_operator = CityOperator.objects.filter(user__province=user.province) province_operator = ProvinceOperator.objects.filter(user__province=user.province, user__role__name='ProvinceOperator') financial_operator = Poultry.objects.filter(user__province=user.province, user__role__name='ProvinceFinancial') inspector_operator = InspectorOperator.objects.filter(user__province=user.province) killhouse_operator = KillHouseOperator.objects.filter(user__province=user.province) driver = KillHouseDriver.objects.filter(user__province=user.province) vet = Vet.objects.filter(user__province=user.province) killhouse_vet = KillHouseVet.objects.filter(vet__user__province=user.province) total_users = poultry.count() + city_operator.count() + province_operator.count() + financial_operator.count() + inspector_operator.count() + killhouse_operator.count() + vet.count() + driver.count() number_of_users = poultry.count() + killhouse_operator.count() + vet.count() + driver.count() number_of_operators = city_operator.count() + province_operator.count() + financial_operator.count() + inspector_operator.count() poultry_reqs = PoultryRequest.objects.filter(poultry__address__province=user.province) files_count = [] active = 0 archive = 0 rejected = 0 if poultry_reqs.count() > 0: for poultry_req in poultry_reqs: if poultry_req.final_state == 'pending': active += 1 if poultry_req.final_state == 'archive': archive += 1 if poultry_req.state_process == 'rejected' or poultry_req.province_state == 'rejected': rejected += 1 poultyry_hachting = PoultryHatching.objects.filter(state='pending', poultry__address__province=user.province) if poultyry_hachting.count() > 0: for hatching in poultyry_hachting: total_hatching += hatching.quantity total_lossess += hatching.losses real_hatching = total_hatching - total_lossess pricies = Pricing.objects.all() if pricies.count() > 0: price = pricies.last() chicken_price = price.live_chicken_price celling_chicken_price = price.ceiling_price floor_chicken_price = price.floor_price poultryrequests = PoultryRequest.objects.filter(state_process='accepted') if poultryrequests.count() > 0: for poultryrequest in poultryrequests: poultryquentity += poultryrequest.quantity box.update({"box": {"total_users": total_users, "number_of_users": number_of_users, "number_of_operators": number_of_operators, "number_of_active_files": active, "number_of_archive_files": archive, "number_of_rejected_files": rejected, "total_hatching": total_hatching, "total_lossess": total_lossess, "real_hatching": real_hatching, "price": chicken_price, "floor_price": floor_chicken_price, "celling_price": celling_chicken_price, "killcapacity": killcapacity, "poultryquentity": poultryquentity}}) total_list.append(box) return Response(total_list, status=status.HTTP_200_OK) class PoultryRequestInformation(viewsets.ModelViewSet): queryset = PoultryHatching.objects.all() serializer_class = PoultryHatchingSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): # refresh(request.user.id) poultry_hatchings = PoultryHatching.objects.filter(state='pending', trash=False) l = [] for hatch in poultry_hatchings: if PoultryRequest.objects.filter(hatching_id=hatch.id).exists(): inter_dict = { "period": hatch.period, "breed": hatch.chicken_breed, "hatching_date": hatch.create_date, "losses": hatch.losses } l.append(inter_dict) return Response(l, status=status.HTTP_200_OK) class TotalPoultryRequestQuantityForCitryViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): city_operator = CityOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user)) poultry_list = [] total_quantity = 0 first_quantity = 0 accepted_quantity = 0 city_accepted_quantity = 0 allocated_quantity = 0 kill_request_quantity = 0 rejected_quantity = 0 waiting_quantity = 0 assignableQuantity = 0 quantity_of_45 = 0 now = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d').date() if 'date' in request.GET else datetime.datetime.now().date() hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending', archive=False) if hatchings.count() > 0: for hatcing in hatchings: if (now - hatcing.date.date()).days + 1 <= 65 and (now - hatcing.date.date()).days + 1 >= 45: quantity_of_45 += hatcing.left_over poultry_requests = PoultryRequest.objects.filter(final_state='pending', city_operator=city_operator, trash=False, out=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day ) for poultry_request in poultry_requests: if poultry_request.province_state == 'accepted' or poultry_request.province_state == 'pending': total_quantity += poultry_request.quantity first_quantity += poultry_request.first_quantity if poultry_request.poultry in poultry_list: pass else: poultry_list.append(poultry_request.poultry) if poultry_request.state_process == 'accepted': city_accepted_quantity += poultry_request.quantity if poultry_request.poultry in poultry_list: pass else: poultry_list.append(poultry_request.poultry) if poultry_request.province_state == 'accepted': accepted_quantity += poultry_request.quantity assignableQuantity += poultry_request.remain_quantity province_kill_reqs = ProvinceKillRequest.objects.filter( province_request__poultry_request=poultry_request, trash=False, state__in=('pending', 'accepted')) if province_kill_reqs.count() > 0: for province_kill_req in province_kill_reqs: allocated_quantity += province_kill_req.main_quantity if poultry_request.poultry in poultry_list: pass else: poultry_list.append(poultry_request.poultry) if poultry_request.province_state == 'rejected' or poultry_request.state_process == 'rejected': rejected_quantity += poultry_request.quantity if poultry_request.poultry in poultry_list: pass else: poultry_list.append(poultry_request.poultry) if poultry_request.province_state == 'pending': if poultry_request.state_process == 'rejected': continue else: waiting_quantity += poultry_request.quantity if poultry_request.poultry in poultry_list: pass else: poultry_list.append(poultry_request.poultry) dict1 = { "total_quantity": total_quantity, "first_quantity": first_quantity, "accepted_quantity": accepted_quantity, "city_accepted_quantity": city_accepted_quantity, "allocated_quantity": allocated_quantity, "kill_request_quantity": kill_request_quantity, "rejected_quantity": rejected_quantity, "waiting_quantity": waiting_quantity, "assignableQuantity": assignableQuantity, "quantity_of_45": quantity_of_45 } return Response(dict1, status=status.HTTP_200_OK) class TotalPoultryRequestQuantityViewSet(viewsets.ModelViewSet): queryset = TotalPoultryRequestQuantity.objects.all() serializer_class = TotalPoultryRequestQuantitySerializer permission_classes = [TokenHasReadWriteScope] # تابع مربوط به ویرایش مرغداری def update(self, request, pk=None, *args, **kwargs): # refresh(request.user.id) user = SystemUserProfile.objects.get(user=request.user) now = datetime.datetime.now().date() total_poultry_request_quantity = TotalPoultryRequestQuantity.objects.get(key=request.data["key"], trash=False) request.data.pop('key') for kill_house in KillHouse.objects.filter(system_address__province=user.province): percentage = KillHousePercentage.objects.get(kill_house=kill_house) percentage.quantity = percentage.percent / 100 * int(request.data['input_quantity']) percentage.save() kill_req = KillRequest.objects.filter(recive_date__year=now.year, recive_date__month=now.month, recive_date__day=now.day, kill_house=kill_house) if kill_req.count() > 0: kill_req = kill_req.last() kill_req.kill_capacity = percentage.quantity kill_req.remain_quantity += percentage.quantity - kill_req.remain_quantity kill_req.save() serializer = self.serializer_class(total_poultry_request_quantity) serializer.update(instance=total_poultry_request_quantity, validated_data=request.data) return Response(serializer.data, status=status.HTTP_200_OK) # تابع مربوط به نمایش مرغداری def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user) poultry_list = [] total_quantity = 0 first_quantity = 0 accepted_quantity = 0 city_accepted_quantity = 0 allocated_quantity = 0 returned_quantity = 0 direct_buying_quantity = 0 kill_request_quantity = 0 rejected_quantity = 0 waiting_quantity = 0 assignableQuantity = 0 quantity_of_45 = 0 if 'date' in request.GET: now = datetime.datetime.strptime(request.GET['date'], '%Y-%m-%d').date() else: now = datetime.datetime.now().date() hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending', archive=False) if hatchings: for hatcing in hatchings: if (now - hatcing.date.date()).days + 1 <= 80: if (now - hatcing.date.date()).days + 1 >= 45: quantity_of_45 += hatcing.left_over poultry_requests = PoultryRequest.objects.filter( # final_state='pending', # province_state__in=('accepted', 'pending'), poultry__address__province=user.province, trash=False, out=False, # direct_buying=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) for poultry_request in poultry_requests: total_quantity += poultry_request.quantity first_quantity += poultry_request.first_quantity if poultry_request.poultry in poultry_list: pass else: poultry_list.append(poultry_request.poultry) city_accepted_poultry_requests = PoultryRequest.objects.filter(final_state='pending', state_process='accepted', poultry__address__province=user.province, trash=False, out=False, direct_buying=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) if city_accepted_poultry_requests.count() > 0: for city_accepted_poultry_request in city_accepted_poultry_requests: city_accepted_quantity += city_accepted_poultry_request.quantity if city_accepted_poultry_request.poultry in poultry_list: pass else: poultry_list.append(city_accepted_poultry_request.poultry) accepted_poultry_requests = PoultryRequest.objects.filter(final_state='pending', province_state='accepted', poultry__address__province=user.province, trash=False, out=False, direct_buying=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) if accepted_poultry_requests.count() > 0: for accepted_poultry_request in accepted_poultry_requests: accepted_quantity += accepted_poultry_request.quantity assignableQuantity += accepted_poultry_request.remain_quantity if accepted_poultry_request.poultry in poultry_list: pass else: poultry_list.append(accepted_poultry_request.poultry) rejected_requests = PoultryRequest.objects.filter( Q(province_state='rejected') | Q(state_process='rejected'), final_state='pending', poultry__address__province=user.province, trash=False, out=False, direct_buying=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) if rejected_requests.count() > 0: for rejected_request in rejected_requests: rejected_quantity += rejected_request.quantity if rejected_request.poultry in poultry_list: pass else: poultry_list.append(rejected_request.poultry) waiting_requests = PoultryRequest.objects.filter(final_state='pending', province_state='pending', poultry__address__province=user.province, trash=False, out=False, direct_buying=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) if waiting_requests.count() > 0: for waiting_request in waiting_requests: if waiting_request.state_process == 'rejected': continue else: waiting_quantity += waiting_request.quantity if waiting_request.poultry in poultry_list: pass else: poultry_list.append(waiting_request.poultry) allocated_poultry_requests = PoultryRequest.objects.filter(final_state='pending', province_state='accepted', poultry__address__province=user.province, trash=False, out=False, direct_buying=False, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) if allocated_poultry_requests.count() > 0: for allocated_poultry_request in allocated_poultry_requests: if allocated_poultry_request.poultry in poultry_list: pass else: poultry_list.append(allocated_poultry_request.poultry) province_kill_reqs = ProvinceKillRequest.objects.filter( province_request__poultry_request=allocated_poultry_request, trash=False, state__in=('pending', 'accepted')) if province_kill_reqs.count() > 0: for province_kill_req in province_kill_reqs: if province_kill_req.return_to_province == False: allocated_quantity += province_kill_req.main_quantity else: returned_quantity += province_kill_req.main_quantity direct_buying_poultry_requests = PoultryRequest.objects.filter( poultry__address__province=user.province, trash=False, out=False, direct_buying=True, send_date__year=now.year, send_date__month=now.month, send_date__day=now.day) if direct_buying_poultry_requests.count() > 0: for direct in direct_buying_poultry_requests: direct_buying_quantity += direct.quantity total_poultry_request_quantity = TotalPoultryRequestQuantity.objects.filter(create_date__year=now.year, create_date__month=now.month, create_date__day=now.day) if total_poultry_request_quantity.count() > 0: total_poultry_request_quantity = total_poultry_request_quantity.last() total_poultry_request_quantity.quantity = total_quantity total_poultry_request_quantity.accepted_quantity = accepted_quantity total_poultry_request_quantity.allocated_quantity = allocated_quantity total_poultry_request_quantity.returned_quantity = returned_quantity total_poultry_request_quantity.city_accepted_quantity = city_accepted_quantity total_poultry_request_quantity.first_quantity = first_quantity total_poultry_request_quantity.rejected_quantity = rejected_quantity total_poultry_request_quantity.waiting_quantity = waiting_quantity total_poultry_request_quantity.direct_buying_quantity = direct_buying_quantity total_poultry_request_quantity.age_up_45 = quantity_of_45 total_poultry_request_quantity.save() else: total_poultry_request_quantity = TotalPoultryRequestQuantity( quantity=total_quantity, accepted_quantity=accepted_quantity, allocated_quantity=allocated_quantity, returned_quantity=returned_quantity, city_accepted_quantity=city_accepted_quantity, first_quantity=first_quantity, rejected_quantity=rejected_quantity, waiting_quantity=waiting_quantity, direct_buying_quantity=direct_buying_quantity, age_up_45=quantity_of_45, ) total_poultry_request_quantity.save() percentage = KillHousePercentage.objects.filter(percent__gt=0) kill_reqs = KillRequest.objects.filter(recive_date__year=now.year, recive_date__month=now.month, recive_date__day=now.day, trash=False) if kill_reqs.count() > 0: for kill_req in kill_reqs: kill_request_quantity += kill_req.kill_capacity total_poultry_request_quantity.kill_requests_quantity = kill_request_quantity total_poultry_request_quantity.number_of_kill_house = percentage.count() total_poultry_request_quantity.number_of_poultry = len(poultry_list) total_poultry_request_quantity.assignableQuantity = assignableQuantity total_poultry_request_quantity.save() serializer = self.serializer_class(total_poultry_request_quantity) return Response(serializer.data) class PoultryRequestWeightViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): # user = SystemUserProfile.objects.get(user=request.user) # # refresh(request.user.id) # weight_list = [] # average = 0 # now = datetime.datetime.now().date() # poultry_requests = PoultryRequest.objects.filter(final_state='pending', # province_state__in=('accepted', 'pending'), # poultry__address__province=user.province) # # poultry_requests = PoultryRequest.objects.filter(final_state='pending', # # province_state__in=('accepted', 'pending'), # # send_date__year=now.year, send_date__month=now.month, # # send_date__day=now.day, # # poultry__address__province=user.province) # if poultry_requests.count() > 0: # # for poultry_request in poultry_requests: # total_quantity = poultry_request.quantity # # province_kill_reqs = ProvinceKillRequest.objects.filter( # province_request__poultry_request=poultry_request) # if province_kill_reqs.count() > 0: # for province_kill_req in province_kill_reqs: # total_quantity -= province_kill_req.main_quantity # if total_quantity > 0: # weight_list.append(poultry_request.Index_weight) # for weight in weight_list: # average += weight # average = average / 1 weight_list = [3.2, 3.2, 2.5, 2.9, 3.1] return Response({'list': weight_list, 'ave': 3613.2}) # return Response({'list': weight_list, 'ave': round(average, 2)}) class BarsForKillHouseViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.all() serializer_class = PoultryRequestSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related( 'system_address__province').first() if kill_house.killer == True: percentage = KillHousePercentage.objects.get(kill_house=kill_house, trash=False) kill_house_vet = KillHouseVet.objects.filter(kill_house=percentage.kill_house_for_killer, trash=False).select_related( 'vet__user').last() else: kill_house_vet = KillHouseVet.objects.filter(kill_house=kill_house, trash=False).select_related( 'vet__user').last() kill_house_req_dict = {} kill_house_req_list = [] now = datetime.datetime.now().date() date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() # date = date - timedelta(days=1) # if 'freezing' in request.GET: # freezing = True # # freezing = False if user.province.name == 'مركزی' else True # # queryset = PoultryRequest.objects.filter( # poultry__address__province=kill_house.system_address.province, # final_state__in=('pending', 'archive'), # trash=False, out=False, # send_date__date=date, # freezing=freezing # # ).select_related('poultry', 'poultry__user', 'poultry__address__city').order_by('-send_date') # else: queryset = PoultryRequest.objects.filter( poultry__address__province=kill_house.system_address.province, final_state__in=('pending', 'archive'), trash=False, out=False, send_date__date__gte=date1, send_date__date__lte=date2, ).select_related('poultry', 'poultry__user', 'poultry__address__city').order_by('-send_date') if len(queryset) > 0: for poultry_req in queryset: vet_farm = VetFarm.objects.filter(poultry=poultry_req.poultry).select_related('vet__user').last() if vet_farm: vet_name = vet_farm.vet.user.fullname vet_mobile = vet_farm.vet.user.mobile else: vet_name = None vet_mobile = None if request.GET['type'] == 'entered': kill_house_requests = KillHouseRequest.objects.filter( Q(killhouse_user=kill_house) | Q(killer=kill_house), province_kill_request__province_request__poultry_request=poultry_req, ware_house_confirmation=True, trash=False).select_related( 'kill_request__kill_house__kill_house_operator__user', 'add_car__driver', 'kill_request__kill_house') else: kill_house_requests = KillHouseRequest.objects.filter( Q(killhouse_user=kill_house) | Q(killer=kill_house), province_kill_request__province_request__poultry_request=poultry_req, ware_house_confirmation=False).select_related( 'kill_request__kill_house__kill_house_operator__user', 'add_car__driver', 'kill_request__kill_house') if kill_house_requests: for kill_house_request in kill_house_requests: weight_loss = kill_house_request.accepted_real_weight - kill_house_request.ware_house_accepted_real_weight if kill_house_request.ware_house_accepted_real_weight > 0 else 0 if weight_loss < 0: weight_loss = weight_loss * -1 total_weight_loss = ( weight_loss / kill_house_request.accepted_real_weight) * 100 if weight_loss != 0 else 0 # kill_house_request.weight_loss = total_weight_loss # kill_house_request.save() vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_request) if vet_check.count() > 0: vet_check_state = vet_check.last().state else: vet_check_state = 'pending' assignment = KillHouseAssignmentInformation.objects.filter( kill_house_request=kill_house_request).last() if assignment: assignment_state = 'accepted' assignment_real_quantity = kill_house_request.accepted_real_quantity assignment_net_weight = kill_house_request.accepted_real_weight else: if kill_house_request.vet_state == 'pending': assignment_state = 'pending' else: assignment_state = 'no_state' assignment_real_quantity = kill_house_request.accepted_real_quantity assignment_net_weight = kill_house_request.accepted_real_weight exclusive_killer = None if kill_house_request.killer != None: exclusive_killer = { "killer_name": kill_house_request.killer.name, "killer_mobile": kill_house_request.killer.kill_house_operator.user.mobile, "killer_fullname": kill_house_request.killer.kill_house_operator.user.fullname, } kill_house_req_dict.update({ "poultry_req_order_code": poultry_req.order_code, "poultry_name": poultry_req.poultry.unit_name, "poultry_user_name": poultry_req.poultry.user.fullname, "poultry_mobile": poultry_req.poultry.user.mobile, "poultry_city": poultry_req.poultry.address.city.name, "chicken_breed": poultry_req.chicken_breed, "date": poultry_req.send_date, "freezing": poultry_req.freezing, "clearance_code": kill_house_request.clearance_code, "traffic_code": kill_house_request.traffic_code, "kill_house_request_key": kill_house_request.key, "ware_house_accepted_real_quantity": kill_house_request.ware_house_accepted_real_quantity, "ware_house_accepted_real_weight": kill_house_request.ware_house_accepted_real_weight, "bar_code": kill_house_request.bar_code, "health_code": kill_house_request.add_car.driver.health_code, "vet_name": vet_name, "vet_mobile": vet_mobile, "kill_house_vet_name": kill_house_vet.vet.user.fullname, "kill_house_vet_mobile": kill_house_vet.vet.user.mobile, "driver_name": kill_house_request.add_car.driver.driver_name, "driver_mobile": kill_house_request.add_car.driver.driver_mobile, "kill_house_name": kill_house_request.killhouse_user.name, "type_car": kill_house_request.add_car.driver.type_car, "killer": exclusive_killer, "vet_check_state": vet_check_state, "assignment_state": assignment_state, "kill_house_request_quantity": kill_house_request.quantity, "assignment_real_quantity": assignment_real_quantity, "assignment_net_weight": assignment_net_weight, "weight_loss": round(total_weight_loss, 1), "input_loss": kill_house_request.weight_loss, }) kill_house_req_list.append(kill_house_req_dict) kill_house_req_dict = {} return Response(kill_house_req_list, status=status.HTTP_200_OK) @api_view(["POST"]) @permission_classes([AllowAny]) @csrf_exempt def city_operator_for_poultry(request): file = request.FILES['file'].read() wb_obj = openpyxl.load_workbook(filename=BytesIO(file)) sheet = wb_obj.active list1 = [] for i, row in enumerate(sheet.iter_rows(values_only=True)): if i == 0: continue try: poultry = Poultry.objects.get(breeding_unique_id=row[3], trash=False) poultry.city_operator = row[5] poultry.save() except: dict1 = { "name": row[4], "breeding": row[3] } list1.append(dict1) continue return Response(list1) @api_view(["POST"]) @permission_classes([TokenHasReadWriteScope]) @csrf_exempt def archive_hatching(request): user = SystemUserProfile.objects.get(user=request.user) if request.data['role'] == 'ProvinceOperator': return Response({'result': 'شما دسترسی لازم را ندارید!'}, status=status.HTTP_403_FORBIDDEN) now = datetime.datetime.now().date() date = (datetime.datetime(year=now.year, month=now.month, day=now.day, hour=23, minute=59, second=59) - timedelta( days=int(request.data['age']))) poultry_hatching = PoultryHatching.objects.filter(date__lte=date, trash=False, allow_hatching='pending', archive=False) for hatching in poultry_hatching: if hatching.left_over > (hatching.quantity * percent_of_losses): hatching.violation = True hatching.allow_hatching = 'True' hatching.state = 'complete' hatching.archive = True hatching.archive_date = datetime.datetime.now() if hatching.first_date_input_archive is None: hatching.first_date_input_archive = datetime.datetime.now() else: hatching.second_date_input_archive = datetime.datetime.now() hatching.input_archiver = user.fullname hatching.last_change = { "date": str(datetime.datetime.now()), "full_name": user.fullname, "role": request.data['role'], "type": "automatic-archive" } hatching.save() return Response({"msg": f"تعداد {poultry_hatching.count()} جوجه ریزی بایگانی شد."}, status=status.HTTP_200_OK) class LastUpdateViewSet(viewsets.ModelViewSet): queryset = LastUpdate.objects.first() serializer_class = LastUpdateSerializer permission_classes = [AllowAny] def list(self, request, *args, **kwargs): if 'type' in request.GET: if request.GET['type'] == 'poultry_hatching': update = LastUpdate.objects.first().update_date # ser_deta=self.serializer_class(update).data return Response(update) return Response({"result": "you havnt type in url params"}, status=status.HTTP_403_FORBIDDEN) class UpdatePoultryTenantViewSet(viewsets.ModelViewSet): queryset = Poultry.objects.all() serializer_class = PoultrySerializer permission_classes = [AllowAny] def update(self, request, *args, **kwargs): poultry_tenant = self.queryset.get(trash=False, key=request.data['tenant_key']) system_user_profile = SystemUserProfile.objects.get(trash=False, key=poultry_tenant.user.key) first_mobile_number = system_user_profile.mobile second_mobile_number = request.data['mobile'] poultry_tenant.breeding_unique_id = request.data['breeding_unique_id'] system_user_profile.last_name = request.data['last_name'] system_user_profile.first_name = request.data['first_name'] system_user_profile.fullname = request.data['first_name'] + ' ' + request.data['last_name'] system_user_profile.national_id = request.data['national_id'] if first_mobile_number != second_mobile_number: if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists(): return Response({"result": "این شماره در سامانه به نام شخص دیگری است"}, status=status.HTTP_403_FORBIDDEN) data = { "first_mobile_number": first_mobile_number, "second_mobile_number": second_mobile_number, } req = requests.post( url=ARTA_URL_CHANGE_MOBILE_NUMBER, data=data, verify=False ) if req.status_code == 200: second_mobile_number = second_mobile_number user = User.objects.get(id=system_user_profile.user.id) user.username = second_mobile_number user.save() system_user_profile.mobile = second_mobile_number poultry_tenant.save() system_user_profile.save() return Response('poultry tenant successfully update!', status=status.HTTP_201_CREATED) class GeneralStatisticsdashboardForCasesViewSet(viewsets.ViewSet): permission_classes = [TokenHasReadWriteScope] def list(self, request): date1 = datetime.datetime.strptime(request.GET['date1'], '%Y-%m-%d').date() date2 = datetime.datetime.strptime(request.GET['date2'], '%Y-%m-%d').date() user = SystemUserProfile.objects.get(user=request.user, trash=False) poultry_requests = PoultryRequest.objects.filter(trash=False, send_date__date__gte=date1, send_date__date__lte=date2).order_by('send_date') if request.GET['role'] in ['CityCommerce', 'CityVet', 'CityPoultry', 'CityJahad']: poultry_requests = poultry_requests.filter(poultry__address__city=user.city) elif request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) poultry_requests = poultry_requests.filter(poultry__city_operator=city_operator.unit_name) else: poultry_requests = poultry_requests poultry = poultry_requests.values('poultry').distinct().count() poultry_requests_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0 poultry_requests_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))['total'] or 0 out_poultry_request = poultry_requests.filter(out=True) out_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0 out_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ 'total'] or 0 province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'), return_to_province=False, province_request__poultry_request__in=poultry_requests) province_kill_requests_quantity = province_kill_requests.aggregate(total=Sum('main_quantity'))['total'] or 0 province_kill_requests_weight = province_kill_requests.aggregate( total=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')))['total'] or 0 province_kill_requests_buyers = province_kill_requests.values('killhouse_user').distinct().count() kill_house_requests = KillHouseRequest.objects.filter(trash=False, province_kill_request__in=province_kill_requests) kill_house_request_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 kill_house_request_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 kill_house_requests_with_quarantine_code = kill_house_requests.filter(clearance_code__isnull=False) kill_house_requests_with_quarantine_code_quantity = \ kill_house_requests_with_quarantine_code.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 kill_house_requests_with_quarantine_code_weight = \ kill_house_requests_with_quarantine_code.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 kill_house_requests_without_quarantine_code = kill_house_requests.filter(clearance_code__isnull=True) kill_house_requests_without_quarantine_code_quantity = \ kill_house_requests_without_quarantine_code.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 kill_house_requests_without_quarantine_code_weight = \ kill_house_requests_without_quarantine_code.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 kill_house_requests_with_kill_house_vet_accepted = kill_house_requests.filter(vet_state='accepted') kill_house_requests_with_kill_house_vet_accepted_quantity = \ kill_house_requests_with_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_quantity'))[ 'total'] or 0 kill_house_requests_with_kill_house_vet_accepted_weight = \ kill_house_requests_with_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 kill_house_requests_without_kill_house_vet_accepted = kill_house_requests.filter(vet_state='pending') kill_house_requests_without_kill_house_vet_accepted_quantity = \ kill_house_requests_without_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_quantity'))[ 'total'] or 0 kill_house_requests_without_kill_house_vet_accepted_weight = \ kill_house_requests_without_kill_house_vet_accepted.aggregate(total=Sum('accepted_real_weight'))[ 'total'] or 0 kill_house_requests_with_kill_house_assignment = kill_house_requests.filter( assignment_state_archive='True') kill_house_requests_with_kill_house_assignment_quantity = \ kill_house_requests_with_kill_house_assignment.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0 kill_house_requests_with_kill_house_assignment_weight = \ kill_house_requests_with_kill_house_assignment.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 kill_house_requests_without_kill_house_assignment = kill_house_requests.filter( assignment_state_archive='True') kill_house_requests_without_kill_house_assignment_quantity = \ kill_house_requests_without_kill_house_assignment.aggregate(total=Sum('accepted_real_quantity'))[ 'total'] or 0 kill_house_requests_without_kill_house_assignment_weight = \ kill_house_requests_without_kill_house_assignment.aggregate(total=Sum('accepted_real_weight'))['total'] or 0 return Response( { "poultry_requests": len(poultry_requests), "poultry": poultry, "poultry_requests_quantity": poultry_requests_quantity, "poultry_requests_weight": poultry_requests_weight, "out_poultry_request": len(out_poultry_request), "out_poultry_request_quantity": out_poultry_request_quantity, "out_poultry_request_weight": out_poultry_request_weight, "province_kill_requests": len(province_kill_requests), "province_kill_requests_quantity": province_kill_requests_quantity, "province_kill_requests_weight": province_kill_requests_weight, "province_kill_requests_buyers": province_kill_requests_buyers, "kill_house_requests": len(kill_house_requests), "kill_house_request_quantity": kill_house_request_quantity, "kill_house_request_weight": kill_house_request_weight, "kill_house_requests_with_quarantine_code": len(kill_house_requests_with_quarantine_code), "kill_house_requests_with_quarantine_code_quantity": kill_house_requests_with_quarantine_code_quantity, "kill_house_requests_with_quarantine_code_weight": kill_house_requests_with_quarantine_code_weight, "kill_house_requests_without_quarantine_code": len(kill_house_requests_without_quarantine_code), "kill_house_requests_without_quarantine_code_quantity": kill_house_requests_without_quarantine_code_quantity, "kill_house_requests_without_quarantine_code_weight": kill_house_requests_without_quarantine_code_weight, "kill_house_requests_with_kill_house_vet_accepted": len( kill_house_requests_with_kill_house_vet_accepted), "kill_house_requests_with_kill_house_vet_accepted_quantity": kill_house_requests_with_kill_house_vet_accepted_quantity, "kill_house_requests_with_kill_house_vet_accepted_weight": kill_house_requests_with_kill_house_vet_accepted_weight, "kill_house_requests_without_kill_house_vet_accepted": len( kill_house_requests_without_kill_house_vet_accepted), "kill_house_requests_without_kill_house_vet_accepted_quantity": kill_house_requests_without_kill_house_vet_accepted_quantity, "kill_house_requests_without_kill_house_vet_accepted_weight": kill_house_requests_without_kill_house_vet_accepted_weight, "kill_house_requests_with_kill_house_assignment": len(kill_house_requests_with_kill_house_assignment), "kill_house_requests_with_kill_house_assignment_quantity": kill_house_requests_with_kill_house_assignment_quantity, "kill_house_requests_with_kill_house_assignment_weight": kill_house_requests_with_kill_house_assignment_weight, "kill_house_requests_without_kill_house_assignment": len( kill_house_requests_without_kill_house_assignment), "kill_house_requests_without_kill_house_assignment_quantity": kill_house_requests_without_kill_house_assignment_quantity, "kill_house_requests_without_kill_house_assignment_weight": kill_house_requests_without_kill_house_assignment_weight, }) def archive_poultry_hatching_with_cron_job(): hatching = PoultryHatching.objects.filter(Q(left_over=0) | Q(chicken_age__gt=80), trash=False, allow_hatching='pending', state='pending', archive=False).only('allow_hatching', 'left_over', 'quantity', 'state', 'archive') now_date = datetime.datetime.now() for hatch in hatching: if hatch.left_over > (hatch.quantity * percent_of_losses): hatch.violation = True hatch.allow_hatching = 'True' hatch.state = 'complete' hatch.archive = True hatch.archive_date = datetime.datetime.now() if hatch.first_date_input_archive is None: hatch.first_date_input_archive = now_date else: hatch.second_date_input_archive = now_date hatch.input_archiver = 'automatic-archive' hatch.last_change = { "date": str(now_date), "full_name": 'automatic-archive', "role": 'automatic-archive1', "type": "automatic-archive" } hatch.save() def archive_poultry_hatching_with_archive_percent_cron_job(): now_date = datetime.datetime.now() archive_percent = HatchingArchivePercent.objects.filter(trash=False, active=True).first() if archive_percent: hatchings = PoultryHatching.objects.filter( state='pending', archive=False, allow_hatching='pending', trash=False, ).annotate( allowed_left_over=ExpressionWrapper( F('quantity') * (archive_percent.percent / 100), output_field=FloatField() ) ).filter( left_over__lte=F('allowed_left_over') ) Poultry.objects.filter( id__in=hatchings.values_list('poultry__id', flat=True), order_limit=True ).update(order_limit=False) for hatching in hatchings: if hatching.left_over > (hatching.quantity * percent_of_losses): hatching.violation = True hatching.allow_hatching = 'True' hatching.state = 'complete' hatching.archive = True hatching.unknown = False hatching.archive_date = datetime.datetime.now() if hatching.first_date_input_archive is None: hatching.first_date_input_archive = now_date else: hatching.second_date_input_archive = now_date hatching.input_archiver = 'automatic-archive' hatching.last_change = { "date": str(now_date), "full_name": 'automatic-archive', "role": 'automatic-archive1', "type": "automatic-archive" } hatching.save() @api_view(["GET"]) @permission_classes([AllowAny]) @csrf_exempt def archive_poultry_hatching_with_archive_percent(request): now_date = datetime.datetime.now() archive_percent = HatchingArchivePercent.objects.filter(trash=False, active=True).first() if archive_percent: hatchings = PoultryHatching.objects.filter( state='pending', archive=False, allow_hatching='pending', trash=False, ).annotate( allowed_left_over=ExpressionWrapper( F('quantity') * (archive_percent.percent / 100), output_field=FloatField() ) ).filter( left_over__lte=F('allowed_left_over') ) Poultry.objects.filter( id__in=hatchings.values_list('poultry__id', flat=True), order_limit=True ).update(order_limit=False) for hatching in hatchings: hatching.allow_hatching = 'True' hatching.state = 'complete' hatching.archive = True hatching.unknown = False hatching.archive_date = datetime.datetime.now() if hatching.first_date_input_archive is None: hatching.first_date_input_archive = now_date else: hatching.second_date_input_archive = now_date hatching.input_archiver = 'automatic-archive' hatching.last_change = { "date": str(now_date), "full_name": 'automatic-archive', "role": 'automatic-archive1', "type": "automatic-archive" } hatching.save() class PoultryLocationViewSet(viewsets.ModelViewSet): queryset = Poultry.objects.filter( trash=False, Long__isnull=False ).select_related( 'user', 'address', 'address__city' ).only( 'id', 'unit_name', 'Lat', 'Long', 'user__fullname', 'user__mobile', 'address__address', 'address__city__name', 'breeding_unique_id' ).prefetch_related( Prefetch('poultry_hatching_user', queryset=PoultryHatching.objects.filter( state__in=('pending', 'complete'), archive=False, allow_hatching='pending', trash=False ).only( 'left_over', 'chicken_age', 'date', 'licence_number', 'poultry_id', 'killed_quantity', 'total_losses' ) ) ) serializer_class = PoultryLocationSerializer permission_classes = [AllowAny] filter_backends = [DjangoFilterBackend] filterset_class = PoultryManageFilterSet @staticmethod def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float: radius = 6378137.0 dlat = math.radians(lat2 - lat1) dlon = math.radians(lon2 - lon1) lat1_rad = math.radians(lat1) lat2_rad = math.radians(lat2) a = math.sin(dlat / 2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon / 2) ** 2 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) return radius * c def filter_nearby_poultries(self, poultries: List[Dict], center_lat: float, center_lon: float, radius: float) -> \ List[Dict]: nearby_poultries = [ poultry for poultry in poultries if self.haversine_distance(center_lat, center_lon, poultry['Lat'], poultry['Long']) <= radius ] return nearby_poultries def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) value = request.GET.get('value') if value: if value != 'undefined' and value.strip(): queryset = queryset.filter( build_query(self.filterset_class, value) ) serializer = self.get_serializer(queryset, many=True) data = serializer.data center_lat = request.query_params.get('center_lat') center_lon = request.query_params.get('center_lon') radius = request.query_params.get('radius') if center_lat and center_lon and radius: try: center_lat = float(center_lat) center_lon = float(center_lon) radius = float(radius) if radius > 100: radius_meters = radius else: radius_meters = radius * 1000 data = self.filter_nearby_poultries(data, center_lat, center_lon, radius_meters) except (ValueError, TypeError): pass return Response(data) class DashboardOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestoutProvinceSerializer permission_classes = [TokenHasReadWriteScope] pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = DashboardPoultryRequestFilterSet def list(self, request, *args, **kwargs): value = request.GET.get('value') search = request.GET.get('search') user = SystemUserProfile.objects.get(user=request.user, trash=False) state = request.GET.get('state') date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if request.GET['role'] == 'VetFarm': vet_farms = VetFarm.objects.filter(vet__user=user, trash=False) poultries = Poultry.objects.filter( pk__in=vet_farms.values('poultry') ) if state == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True), poultry__in=poultries, send_date__date__gte=date1, send_date__date__lte=date2, trash=False).order_by('-send_date') elif request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(user=user) if state == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True), poultry__city_operator=city_operator.unit_name, send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: if state == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True), poultry__address__city=user.city, send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') else: if request.GET['state'] == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=True), send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') if value and search == 'filter': if value != 'undefined' and value.strip(): poultry_requests = poultry_requests.filter( build_query(self.filterset_class, value) ) index_weight = poultry_requests.aggregate(total=Sum('Index_weight'))[ 'total'] or 0 quantity = poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 has_code = len(poultry_requests.filter(quarantine_code__isnull=False)) hasnt_code = len(poultry_requests.filter(quarantine_code__isnull=True)) hatching = poultry_requests.values_list('hatching__id', flat=True).distinct() hatchings = PoultryHatching.objects.filter(trash=False, id__in=hatching) left_over = hatchings.aggregate(total=Sum('left_over'))[ 'total'] or 0 quantity_hatching = hatchings.aggregate(total=Sum('quantity'))[ 'total'] or 0 poultry_request_aggregates = poultry_requests.aggregate( total_weight=Sum(F('quantity') * F('Index_weight')), ) dict1 = { 'lenBar': len(poultry_requests), 'indexWeight': round(index_weight / len(poultry_requests) if len(poultry_requests) > 0 else 0), 'quantity': quantity, # 'weight': int(quantity * index_weight), 'weight': poultry_request_aggregates['total_weight'] or 0, 'hasCode': has_code, 'hasntCode': hasnt_code, 'leftOver': left_over, 'hatchingQuantity': quantity_hatching, } return Response(dict1, status=status.HTTP_200_OK) class ParentCompanyDashboardOutProvincePoultryRequestViewSet(viewsets.ModelViewSet): queryset = PoultryRequest.objects.filter(out=True, trash=False) serializer_class = PoultryRequestoutProvinceSerializer permission_classes = [AllowAny] pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = DashboardPoultryRequestFilterSet def list(self, request, *args, **kwargs): value = request.GET.get('value') search = request.GET.get('search') state = request.GET.get('state') date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if request.GET['state'] == 'pending': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False) | Q(state_process='pending', province_state='pending', final_state='pending', wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') elif state == 'accepted': poultry_requests = PoultryRequest.objects.filter( Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=True) | Q(state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False), send_date__date__gte=date1, send_date__date__lte=date2, out=True, out_province_request_cancel=False, trash=False).order_by('-send_date') else: poultry_requests = PoultryRequest.objects.filter( Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=False) | Q(state_process='rejected', province_state='rejected', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=False) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='pending', province_state='pending', final_state='pending', has_wage=True, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=False, wage_pay=False, out_province_request_cancel=True) | Q( state_process='accepted', province_state='accepted', final_state='archive', has_wage=True, wage_pay=False, out_province_request_cancel=True), send_date__date__gte=date1, send_date__date__lte=date2, out=True, trash=False).order_by('-send_date') if value and search == 'filter': if value != 'undefined' and value.strip(): poultry_requests = poultry_requests.filter( build_query(self.filterset_class, value) ) index_weight = poultry_requests.aggregate(total=Sum('Index_weight'))[ 'total'] or 0 quantity = poultry_requests.aggregate(total=Sum('quantity'))[ 'total'] or 0 has_code = len(poultry_requests.filter(quarantine_code__isnull=False)) hasnt_code = len(poultry_requests.filter(quarantine_code__isnull=True)) hatching = poultry_requests.values_list('hatching__id', flat=True).distinct() hatchings = PoultryHatching.objects.filter(trash=False, id__in=hatching) left_over = hatchings.aggregate(total=Sum('left_over'))[ 'total'] or 0 quantity_hatching = hatchings.aggregate(total=Sum('quantity'))[ 'total'] or 0 dict1 = { 'lenBar': len(poultry_requests), 'indexWeight': round(index_weight / len(poultry_requests) if len(poultry_requests) > 0 else 0), 'quantity': quantity, 'weight': int(quantity * index_weight), 'hasCode': has_code, 'hasntCode': hasnt_code, 'leftOver': left_over, 'hatchingQuantity': quantity_hatching, } return Response(dict1, status=status.HTTP_200_OK) class DashboardChainAllocationViewSet(viewsets.ModelViewSet): queryset = ChainAllocation.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = ChainAllocationSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainAllocationFilterSet filterset_fields = [ 'poultry_hatching__poultry__breeding_unique_id', 'poultry_hatching__poultry__user__mobile', 'poultry_hatching__poultry__user__fullname', 'poultry_hatching__poultry__user__first_name', 'poultry_hatching__poultry__user__last_name', 'poultry_hatching__poultry__unit_name', 'chain_company__name', ] def list(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user, trash=False) date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if request.GET['role'] == "ChainCompany": if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(chain_company__user=user, date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') elif request.GET['role'] in ['CityJahad', 'CityPoultry']: if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(poultry_hatching__poultry__address__city=user.city, date__date__gte=date1, date__date__lte=date2, state='accepted', trash=False).order_by('-id') elif request.GET['role'] == "CityOperator": city_operator = CityOperator.objects.get(user=user, trash=False) if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter( poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter( poultry_hatching__poultry__city_operator=city_operator.unit_name, date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') elif request.GET['role'] == "VetFarm": vet = Vet.objects.get(user=user, trash=False) poultry_ids = VetFarm.objects.filter(vet=vet, trash=False).select_related('poultry').only( 'poultry').values_list('poultry', flat=True).distinct() poultry = Poultry.objects.filter(id__in=poultry_ids) if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, poultry_hatching__poultry__in=poultry, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, poultry_hatching__poultry__in=poultry, state='accepted', trash=False).order_by('-id') else: if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') index_weight = chain_allocations.aggregate(total=Sum('index_weight'))[ 'total'] or 0 weight = chain_allocations.aggregate(total=Sum('weight'))[ 'total'] or 0 quantity = chain_allocations.aggregate(total=Sum('quantity'))[ 'total'] or 0 has_code = len(chain_allocations.filter(quarantine_code__isnull=False)) hasnt_code = len(chain_allocations.filter(quarantine_code__isnull=True)) dict1 = { 'lenBar': len(chain_allocations), 'indexWeight': round(index_weight / len(chain_allocations) if len(chain_allocations) > 0 else 0), 'quantity': quantity, 'weight': int(weight), 'hasCode': has_code, 'hasntCode': hasnt_code, } return Response(dict1, status=status.HTTP_200_OK) class ParentCompanyDashboardChainAllocationViewSet(viewsets.ModelViewSet): queryset = ChainAllocation.objects.all() permission_classes = [AllowAny] serializer_class = ChainAllocationSerializer pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = ChainAllocationFilterSet filterset_fields = [ 'poultry_hatching__poultry__breeding_unique_id', 'poultry_hatching__poultry__user__mobile', 'poultry_hatching__poultry__user__fullname', 'poultry_hatching__poultry__user__first_name', 'poultry_hatching__poultry__user__last_name', 'poultry_hatching__poultry__unit_name', 'chain_company__name', ] def list(self, request, *args, **kwargs): date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'state' in request.GET: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('rejected', 'deleted'), trash__in=(False, True)).order_by('-id') else: chain_allocations = ChainAllocation.objects.filter(date__date__gte=date1, date__date__lte=date2, state__in=('accepted', 'pending'), trash=False).order_by('-id') index_weight = chain_allocations.aggregate(total=Sum('index_weight'))[ 'total'] or 0 weight = chain_allocations.aggregate(total=Sum('weight'))[ 'total'] or 0 quantity = chain_allocations.aggregate(total=Sum('quantity'))[ 'total'] or 0 has_code = len(chain_allocations.filter(quarantine_code__isnull=False)) hasnt_code = len(chain_allocations.filter(quarantine_code__isnull=True)) dict1 = { 'lenBar': len(chain_allocations), 'indexWeight': round(index_weight / len(chain_allocations) if len(chain_allocations) > 0 else 0), 'quantity': quantity, 'weight': int(weight), 'hasCode': has_code, 'hasntCode': hasnt_code, } return Response(dict1, status=status.HTTP_200_OK) class DashboardTotalPoultryViewSet(viewsets.ModelViewSet): queryset = Poultry.objects.all() serializer_class = PoultrySerializer permission_classes = [AllowAny] def list(self, request, *args, **kwargs): poultreis = Poultry.objects.filter(trash=False).select_related('user', 'address__province', 'address__city') if 'role' in request.GET: user = SystemUserProfile.objects.get(key=request.GET['key']) if request.GET['role'] == 'CityOperator': city_operator = CityOperator.objects.get(trash=False, user=user) poultrys = poultreis.filter(poultry__city_operator=city_operator.unit_name) elif request.GET['role'] in ['CityJahad', 'CityPoultry']: poultrys = poultreis.filter(poultry__user__city=user.city) else: poultrys = poultreis else: poultrys = poultreis all_hatching_pending = 0 all_total_quantity = 0 all_poultry_request = 0 all_kill_request = 0 all_kill_request_quantity = 0 all_kill_request_weight = 0 all_kill_request_has_assigment = 0 all_kill_request_quantity_assigment = 0 all_kill_request_weight_assigment = 0 all_total_quantity_poultry_hatching_pending = 0 all_total_left_over_poultry_hatching_pending = 0 all_total_quantity_poultry_request = 0 all_len_out_poultry_request = 0 all_total_out_quantity_poultry_request = 0 all_total_out_weight_poultry_request = 0 all_period = 0 len_werhouse_enter = 0 all_werhouse_enter_quantity = 0 all_werhouse_enter_weight = 0 all_all_weight_loss = 0 for poultry in poultrys: user_mobile = poultry.user.mobile if poultry.user else '-' user_name = poultry.user.fullname if poultry.user else '-' city_operator = poultry.city_operator if poultry.city_operator else '-' health_certificate_number = poultry.health_certificate_number if poultry.health_certificate_number else '-' epidemiological_code = poultry.epidemiological_code if poultry.epidemiological_code else '-' vet_farm = VetFarm.objects.filter(poultry=poultry, trash=False).select_related('vet__user').last() vet_name = '-' mobile_vet = '-' if vet_farm: vet_name = vet_farm.vet.user.fullname mobile_vet = vet_farm.vet.user.mobile poultry_hatching = PoultryHatching.objects.filter(poultry=poultry, trash=False).only('quantity', 'left_over' ) if poultry_hatching: poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending', archive=False).last() if poultry_hatching_pending: all_hatching_pending += 1 hatching = 'ندارد' if not poultry_hatching_pending else f'دارد' if poultry_hatching_pending: period = poultry_hatching_pending.period else: period = poultry_hatching.last().period all_period += period poultry_hatching_pending1 = poultry_hatching.filter(state='pending', allow_hatching='pending', archive=False) total_quantity = \ poultry_hatching.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_quantity_poultry_hatching_pending = \ poultry_hatching_pending1.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_left_over_poultry_hatching_pending = \ poultry_hatching_pending1.aggregate(total=Sum('left_over'))[ 'total'] or 0 all_total_quantity += total_quantity all_total_quantity_poultry_hatching_pending += total_quantity_poultry_hatching_pending all_total_left_over_poultry_hatching_pending += total_left_over_poultry_hatching_pending poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry, state_process__in=('accepted', 'pending'), province_state__in=('accepted', 'pending')).only( 'quantity', 'Index_weight') kill_request = KillHouseRequest.objects.filter(trash=False, province_request__poultry_request__in=poultry_request).only( 'accepted_real_quantity', 'accepted_real_weight') out_poultry_request = poultry_request.filter(out=True, out_province_request_cancel=False).only( 'quantity', 'Index_weight' ) total_out_quantity_poultry_request = \ out_poultry_request.aggregate(total=Sum('quantity'))[ 'total'] or 0 total_out_weight_poultry_request = \ out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[ 'total'] or 0 all_total_out_quantity_poultry_request += total_out_quantity_poultry_request all_total_out_weight_poultry_request += total_out_weight_poultry_request all_len_out_poultry_request += len(out_poultry_request) total_quantity_poultry_request = \ poultry_request.aggregate(total=Sum('quantity'))[ 'total'] or 0 all_total_quantity_poultry_request += total_quantity_poultry_request all_poultry_request += len(poultry_request) all_kill_request += len(kill_request) kill_request_quantity = kill_request.aggregate( total=Sum('accepted_real_quantity'))[ 'total'] or 0 all_kill_request_quantity += kill_request_quantity kill_request_weight = kill_request.aggregate( total=Sum('accepted_real_weight'))[ 'total'] or 0 all_kill_request_weight += int(kill_request_weight) kill_request_has_assigment = kill_request.filter(assignment_state_archive='True').only( 'accepted_real_quantity', 'accepted_real_weight') all_kill_request_has_assigment += len(kill_request_has_assigment) kill_request_quantity_assigment = kill_request_has_assigment.aggregate( total=Sum('accepted_real_quantity'))[ 'total'] or 0 all_kill_request_quantity_assigment += kill_request_quantity_assigment kill_request_weight_assigment = kill_request_has_assigment.aggregate( total=Sum('accepted_real_weight'))[ 'total'] or 0 all_kill_request_weight_assigment += int(kill_request_weight_assigment) werhouse_enter = kill_request.filter(ware_house_confirmation=True).only( 'ware_house_accepted_real_quantity', 'ware_house_accepted_real_weight', 'weight_loss') werhouse_enter_quantity = werhouse_enter.aggregate( total=Sum('ware_house_accepted_real_quantity'))[ 'total'] or 0 werhouse_enter_weight = werhouse_enter.aggregate( total=Sum('ware_house_accepted_real_weight'))[ 'total'] or 0 all_weight_loss = werhouse_enter.aggregate( total_quantity=Sum('weight_loss')).get( 'total_quantity', 0) or 0 all_all_weight_loss += all_weight_loss all_weight_loss = round(int(all_weight_loss) / len(werhouse_enter), 2) if len(werhouse_enter) > 0 else 0 len_werhouse_enter += len(werhouse_enter) all_werhouse_enter_quantity += werhouse_enter_quantity all_werhouse_enter_weight += int(werhouse_enter_weight) list1 = [ poultry.unit_name, user_name, user_mobile, poultry.breeding_unique_id, epidemiological_code, health_certificate_number, poultry.number_of_halls, poultry.total_capacity, poultry.user.province.name + '/' + poultry.user.city.name if poultry.user.city and poultry.user.province is not None else '-', city_operator, vet_name + '/' + mobile_vet, hatching, period, total_quantity, round(total_quantity / period) if period > 0 else 0, len(poultry_request), total_quantity_poultry_request, len(kill_request), kill_request_quantity, int(kill_request_weight), round(kill_request_weight / kill_request_quantity, 1) if kill_request_weight > 0 else 0, len(kill_request_has_assigment), kill_request_quantity_assigment, int(kill_request_weight_assigment), round(kill_request_weight_assigment / kill_request_quantity_assigment, 1) if kill_request_weight_assigment > 0 else 0, len(out_poultry_request), total_out_quantity_poultry_request, int(total_out_weight_poultry_request), str(round(total_out_weight_poultry_request / total_out_quantity_poultry_request, 1)) if total_out_quantity_poultry_request > 0 else 0, len(werhouse_enter), werhouse_enter_quantity, int(werhouse_enter_weight), f'%{all_weight_loss}', ] value_header_list = [ all_period, all_total_quantity, all_hatching_pending, all_total_quantity_poultry_hatching_pending, all_total_left_over_poultry_hatching_pending, all_poultry_request, all_total_quantity_poultry_request, all_kill_request, all_kill_request_quantity, all_kill_request_weight, (round(all_kill_request_weight / all_kill_request_quantity, 1)) if all_kill_request_quantity > 0 else 0, all_kill_request_has_assigment, all_kill_request_quantity_assigment, all_kill_request_weight_assigment, str(round(all_kill_request_weight_assigment / all_kill_request_quantity_assigment, 1)) if all_kill_request_quantity_assigment > 0 else 0, all_len_out_poultry_request, all_total_out_quantity_poultry_request, int(all_total_out_weight_poultry_request), str(round(all_total_out_weight_poultry_request / all_total_out_quantity_poultry_request, 1)) if all_total_out_quantity_poultry_request > 0 else 0, len_werhouse_enter, all_werhouse_enter_quantity, all_werhouse_enter_weight, f'%{round(int(all_all_weight_loss) / len_werhouse_enter, 2) if len_werhouse_enter > 0 else 0}', ] class GetAllPoultryViewSet(APIView): permission_classes = [TokenHasReadWriteScope] def get(self, request): user = SystemUserProfile.objects.get(user=request.user, trash=False) role = request.GET.get('role') min_age = int(request.GET.get('min_age', 0)) max_age = int(request.GET.get('max_age', min_age)) filters = { 'allow_hatching': 'pending', 'left_over__gt': 0, 'state': 'pending', 'archive': False, 'trash': False } if role == 'CityOperator': city_operator = CityOperator.objects.get(user=user) filters['poultry__city_operator'] = city_operator.unit_name elif role == 'Poultry': filters['poultry__user'] = user elif role == 'PoultryScience': poultry_science = PoultryScience.objects.filter(user=user).values_list('poultry__id', flat=True).distinct() filters['poultry__id__in'] = poultry_science if 'chain' in request.GET: if request.GET['chain'] == 'true' or request.GET['chain']: filters['InteractTypeName'] = 'در مشارکت با زنجیره' poultry_hatchings = PoultryHatching.objects.filter(**filters).values( 'poultry', 'has_chain_company', 'key' ).annotate( last_hatching_remain_quantity=Max('left_over') ) age_range = ChickenAgeRange.objects.filter(trash=False).first() if 'min_age' in request.GET or 'direct_buying' in request.GET: if age_range and age_range.active: poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(age_range.minimum, age_range.maximum)) elif min_age: poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(min_age, max_age)) poultry_remain_dict = { poultry_hatching['poultry']: { 'last_hatching_remain_quantity': poultry_hatching['last_hatching_remain_quantity'], 'chain_company': { "chain_company": poultry_hatching['has_chain_company'], "hatching_key": poultry_hatching['key'], }, 'allow_sell_free': ProvinceAllowPoultrySellFree.objects.filter( poultry_id=poultry_hatching['poultry'] ).values_list('allow', flat=True).first() or False } for poultry_hatching in poultry_hatchings } poultry = Poultry.objects.filter(id__in=poultry_remain_dict.keys()).select_related('user', 'address').order_by( 'id') serializer = GetAllPoultrySerializer(poultry, many=True, context={'poultry_remain_dict': poultry_remain_dict}) return Response(serializer.data, status=status.HTTP_200_OK) class PoultryPredictionViewSet(viewsets.ModelViewSet): queryset = PoultryPrediction.objects.all() permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryPredictionSerializer class HatchingIncreaseRequestViewSet(viewsets.ModelViewSet): queryset = HatchingIncreaseRequest.objects.all() serializer_class = HatchingIncreaseRequestSerializer permission_classes = [TokenHasReadWriteScope] filterset_class = HatchingIncreaseRequestFilterSet pagination_class = CustomPagination def list(self, request, *args, **kwargs): value = request.GET.get('value') search = request.GET.get('search') query = HatchingIncreaseRequest.objects.filter(trash=False).order_by('-date') if value and search == 'filter': if value != 'undefined' and value.strip(): query = query.filter( build_query(self.filterset_class, value) ) page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(query) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) ser_data = self.serializer_class(query, many=True) return Response(ser_data.data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(trash=False, user=request.user) hatching_key = request.data["hatching_key"] hatching = PoultryHatching.objects.get(trash=False, key=hatching_key) request.data.pop('hatching_key') serializer = self.serializer_class(data=request.data) if serializer.is_valid(): hatching_increase = serializer.create(validated_data=request.data) hatching_increase.hatching = hatching hatching_increase.registerer_name = user.fullname hatching_increase.registerer_mobile = user.mobile hatching_increase.hatching_left_over = hatching.left_over hatching_increase.hatching_quantity = hatching.quantity hatching_increase.hatching_losses = hatching.total_losses hatching_increase.hatching_kill_quantity = hatching.killed_quantity hatching_increase.save() calculate_hatching_increase(hatching) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status.HTTP_403_FORBIDDEN) def update(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(trash=False, user=request.user) data = request.data query = HatchingIncreaseRequest.objects.get(trash=False, key=data['key']) query.quantity = data['quantity'] query.message = data['message'] query.registerer_name = user.fullname query.registerer_mobile = user.mobile query.registerer_role = data['role'] query.date = datetime.datetime.now() query.save() calculate_hatching_increase(query.hatching) return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) def destroy(self, request, *args, **kwargs): query = HatchingIncreaseRequest.objects.get(trash=False, key=request.GET['key']) hatching = query.hatching if hatching.left_over < query.quantity: return Response({'result': 'به علت کم بودن حجم مانده در سالن اجازه حذف ندارید!'}, status=status.HTTP_403_FORBIDDEN) query.trash = True query.save() calculate_hatching_increase(hatching) return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK) class ChickenCommissionPricesViewSet(viewsets.ModelViewSet): queryset = ChickenCommissionPrices.objects.all() serializer_class = ChickenCommissionPricesSerializer permission_classes = [TokenHasReadWriteScope] pagination_class = CustomPagination def list(self, request, *args, **kwargs): ChickenCommissionPrices.objects.get_or_create(date__date=datetime.date.today(), defaults={'date': datetime.datetime.now(), 'kill_house_price': kill_house_price}) create_update_chicken_commission_prices() query = ChickenCommissionPrices.objects.filter(trash=False).order_by('-date') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(query) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) ser_data = self.serializer_class(query, many=True) return Response(ser_data.data, status=status.HTTP_200_OK) class GetAllPoultryFoIncreaseHatchingViewSet(APIView): permission_classes = [TokenHasReadWriteScope] def get(self, request): user = SystemUserProfile.objects.get(user=request.user, trash=False) role = request.GET.get('role') min_age = int(request.GET.get('min_age', 0)) max_age = int(request.GET.get('max_age', min_age)) filters = { 'allow_hatching': 'pending', 'state': 'pending', 'archive': False, 'trash': False } if role == 'CityOperator': city_operator = CityOperator.objects.get(user=user) filters['poultry__city_operator'] = city_operator.unit_name elif role == 'Poultry': filters['poultry__user'] = user if 'chain' in request.GET: if request.GET['chain'] == 'true' or request.GET['chain']: filters['InteractTypeName'] = 'در مشارکت با زنجیره' poultry_hatchings = PoultryHatching.objects.filter(**filters).values( 'poultry', 'has_chain_company', 'key' ).annotate( last_hatching_remain_quantity=Max('left_over') ) age_range = ChickenAgeRange.objects.filter(trash=False).first() if 'min_age' in request.GET or 'direct_buying' in request.GET: if age_range and age_range.active: poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(age_range.minimum, age_range.maximum)) elif min_age: poultry_hatchings = poultry_hatchings.filter(chicken_age__range=(min_age, max_age)) poultry_remain_dict = { poultry_hatching['poultry']: { 'last_hatching_remain_quantity': poultry_hatching['last_hatching_remain_quantity'], 'chain_company': { "chain_company": poultry_hatching['has_chain_company'], "hatching_key": poultry_hatching['key'], }, 'allow_sell_free': ProvinceAllowPoultrySellFree.objects.filter( poultry_id=poultry_hatching['poultry'] ).values_list('allow', flat=True).first() or False } for poultry_hatching in poultry_hatchings } poultry = Poultry.objects.filter(id__in=poultry_remain_dict.keys()).select_related('user', 'address').order_by( 'id') serializer = GetAllPoultrySerializer(poultry, many=True, context={'poultry_remain_dict': poultry_remain_dict}) return Response(serializer.data, status=status.HTTP_200_OK) class PoultryRequestQuarantineCodeViewSet(viewsets.ModelViewSet): queryset = PoultryRequestQuarantineCode.objects.all() serializer_class = PoultryRequestQuarantineCodeSerializer permission_classes = [TokenHasReadWriteScope] def list(self, request, *args, **kwargs): poultry_request_key = request.GET.get('poultry_request_key') codes = PoultryRequestQuarantineCode.objects.filter(poultry_request__key=poultry_request_key, trash=False).order_by('id') serializer = self.serializer_class(codes, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): user = SystemUserProfile.objects.get(user=request.user) poultry_request = PoultryRequest.objects.get(key=request.data['poultry_request_key']) request.data.pop('poultry_request_key') if PoultryRequestQuarantineCode.objects.filter(quarantine_code=request.data['quarantine_code'], trash=False).exists(): return Response({"result": "این کد قبلا وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) serializer = self.serializer_class(data=request.data) if serializer.is_valid(): code = serializer.create(validated_data=request.data) code.registrar = user.fullname code.register_date = datetime.datetime.now() code.poultry_request = poultry_request code.save() get_gid_poultry_request_quarantine_code(code.id) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors) def update(self, request, pk=None, *args, **kwargs): code_key = request.data.pop('request_code_key') code = PoultryRequestQuarantineCode.objects.get(key=code_key) if 'quarantine_code' in request.data.keys(): if code.quarantine_code != request.data['quarantine_code']: if PoultryRequestQuarantineCode.objects.filter( quarantine_code=request.data['quarantine_code'], trash=False).exists(): return Response({"result": "این کد قبلا وارد شده است!"}, status=status.HTTP_403_FORBIDDEN) serializer = self.serializer_class(code) serializer.update(instance=code, validated_data=request.data) get_gid_poultry_request_quarantine_code(code.id) return Response(serializer.data, status=status.HTTP_200_OK) def destroy(self, request, *args, **kwargs): code_key = request.GET.get('request_code_key') code = PoultryRequestQuarantineCode.objects.get(key=code_key) code.trash = True code.save() return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK) class EvacuationHatchingDetailViewSet(viewsets.ModelViewSet): queryset = EvacuationHatchingDetail.objects.filter(trash=False) serializer_class = EvacuationHatchingDetailSerializer permission_classes = [TokenHasReadWriteScope] pagination_class = CustomPagination filter_backends = [DjangoFilterBackend] filterset_class = EvacuationHatchingDetailFilterSet filterset_fields = [ 'hatching__key', 'hatching__poultry__breeding_unique_id', 'PartIdCode', 'RequestId', 'MoReportId', 'ReportType', 'ReportStatus', 'GoodCount', 'IsDeleted', 'IsPersisted', 'AllowInsert', 'AllowUpdate', 'ExternalId', 'StringId', ] class HatchingDetailView(APIView): permission_classes = [TokenHasReadWriteScope] def get(self, request): hatching = PoultryHatching.objects.filter( trash=False, key=request.GET['key'] ).select_related('poultry').first() ser_data = PoultryHatchingForDetailsSerializer(hatching).data kill_requests = KillHouseRequest.objects.filter( trash=False, province_request__poultry_request__hatching=hatching, ware_house_confirmation=True ).select_related( 'killhouse_user', 'killer', 'province_request', 'province_request__poultry_request', 'kill_request' ).order_by('-create_date') ser_data_kill_request = KillHouseRequestForHatchingDetailSerializer(kill_requests, many=True).data poultry_requests = PoultryRequest.objects.filter(hatching=hatching, trash=False, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), out=True, out_province_request_cancel=False, temporary_trash=False, temporary_deleted=False) ser_data_poultry_request = PoultryRequestForHatchingDetailSerializer(poultry_requests, many=True).data chain_allocation = ChainAllocation.objects.filter(trash=False, state='accepted', poultry_hatching=hatching) ser_data_chain_allocation = ChainAllocationForHatchingDetailSerializer(chain_allocation, many=True).data bar_diffrent_requests = BarDifferenceRequest.objects.filter(trash=False, hatching=hatching, state='accepted').order_by('-id') bar_diffrent_requests_serializer_data = BarDifferenceRequestSerializer(bar_diffrent_requests, many=True).data evacuation_reports = [] if hatching: details_qs = hatching.evacuation_details.filter(trash=False).order_by('-ReportDate', '-create_date') evacuation_reports = EvacuationHatchingDetailSerializer(details_qs, many=True).data date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else None date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else None poultry_hatching_licence_number = hatching.licence_number response = requests.post( f'https://rsibackend.rasadyar.com/app/send_different_bar_with_licence_number/?' f'licence_number={poultry_hatching_licence_number}' f'&date1={date1}&date2={date2}', headers={'Content-Type': 'application/json'} ) kill_requests_non_receipt = KillHouseRequest.objects.filter( trash=False, province_request__poultry_request__hatching=hatching, non_receipt=True, main_non_receipt=True ).select_related( 'killhouse_user', 'killer', 'province_request', 'province_request__poultry_request', 'kill_request' ).order_by('-create_date') ser_data_non_receipt_kill_request = KillHouseRequestForHatchingDetailSerializer(kill_requests_non_receipt, many=True).data filters = { 'archive_wage': False, 'state__in': ('pending', 'accepted'), 'first_car_allocated_quantity': 0, 'return_to_province': False } return_province_kill_requests = ProvinceKillRequest.objects.filter( trash=True, return_trash=True, **filters, province_request__poultry_request__hatching=hatching).order_by('id') return_province_kill_requests_serializer = ReturnProvinceKillRequestSerializer(return_province_kill_requests, many=True).data kill_house_requests_return = KillHouseRequest.objects.filter( trash=True, return_trash=True, province_request__poultry_request__hatching=hatching) kill_house_requests_return_serializer = KillHouseRequestForBarManagementSerializer(kill_house_requests_return, many=True).data bar_requests = BarDifferenceRequest.objects.filter(trash=False, state='accepted').order_by('id') bar_request_serilizer = BarDifferenceRequestSerializer(bar_requests, many=True).data hatching_increase = HatchingIncreaseRequest.objects.filter(trash=False).order_by('-date') hatching_increase_serilizer = HatchingIncreaseRequestSerializer(hatching_increase, many=True).data result = { **ser_data, "bars": ser_data_kill_request, 'outBars': ser_data_poultry_request, 'chainAllocation': ser_data_chain_allocation, "differentBars": response.json(), "nonReceipt": ser_data_non_receipt_kill_request, "returnProvinceRequest": return_province_kill_requests_serializer, "returnKillHouseRequest": kill_house_requests_return_serializer, "killingDifference": bar_request_serilizer, "hatchingIncrease": hatching_increase_serilizer, "bar_diffrent_requets": bar_diffrent_requests_serializer_data, "evacuation_reports": evacuation_reports, } return Response(result) @api_view(["GET"]) @permission_classes([AllowAny]) @csrf_exempt def bulk_test_data(request): count = int(request.query_params.get('count', 1000000)) # پیش‌فرض 1 میلیون result = [] for i in range(count): data = { "id": i + 1, "unit_name": 'nn', "Lat": 34.88681445023634 + random.uniform(-0.1, 0.1), "Long": 48.32817003380081 + random.uniform(-0.1, 0.1), "user": { "fullname": 'sdfsd', "mobile": 'sdfsd' }, "hatching": [ { "quantity": random.randint(10000, 50000), "left_over": random.randint(10000, 50000), "period": random.randint(1, 30), "chicken_age": random.randint(1, 100), "date": (datetime.datetime.now() - timedelta(days=random.randint(1, 365))).isoformat(), "violation": random.choice([True, False]), "archive": False, "licence_number": str(random.randint(1000000000, 9999999999)), "samasat_discharge_percentage": random.randint(0, 100), "chicken_breed": random.choice(["آربراکرز (آپلاس)", "راس", "کاب", "هوبارد"]), "total_killed_weight": round(random.uniform(0, 1000), 2), "killed_quantity": random.randint(0, 1000), "PersonTypeName": random.choice(["حقیقی", "حقوقی"]), "InteractTypeName": random.choice(["مالک", "مستأجر"]), "UnionTypeName": random.choice(["تعاونی", "خصوصی", "دولتی"]), "CertId": str(random.randint(100000000000, 999999999999)) } ], "address": { "city": { "name": 'همدان' }, "address": 'sdasdasdasd' }, "breeding_unique_id": str(random.randint(100000000000, 999999999999)) } result.append(data) return Response(result) @api_view(["GET"]) @permission_classes([AllowAny]) @csrf_exempt def get_hatching_for_bazrasi(request): active = request.GET['active'] poultry = Poultry.objects.filter(trash=False, breeding_unique_id=request.GET['code']).first() if poultry: poultry_hatching = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id') if active == 'true': poultry_hatching = poultry_hatching.filter(state='pending', allow_hatching='pending', archive=False) else: poultry_hatching = poultry_hatching.filter(archive=True).last() poultry_hatching = [poultry_hatching] if poultry_hatching else [] ser_data = PoultryHatchingForBazrasiSerializer(poultry_hatching, many=True).data return Response(ser_data, status.HTTP_200_OK) return Response({'result': "مرغدار وجود ندارد!"}, status.HTTP_403_FORBIDDEN) @api_view(["GET"]) @permission_classes([AllowAny]) @csrf_exempt def get_poultry_for_bazrasi(request): breeding_unique_id = request.GET.get('code') or request.GET.get('breeding_unique_id') if not breeding_unique_id: return Response({'result': "شناسه یکتا مرغدار ارسال نشده است!"}, status=status.HTTP_400_BAD_REQUEST) poultry = Poultry.objects.filter( trash=False, breeding_unique_id=breeding_unique_id ).select_related( 'user', 'address', 'address__city', 'address__province' ).first() if not poultry: return Response({'result': "مرغدار وجود ندارد!"}, status=status.HTTP_404_NOT_FOUND) active_hatchings = PoultryHatching.objects.filter( trash=False, poultry=poultry, state='pending', allow_hatching='pending', archive=False ).select_related( 'chain_company', 'poultry' ).order_by('id') poultry_serializer = PoultryDetailForPoultryAndHatchingForPoultryScienceSerializer(poultry) hatchings_serializer = PoultryHatchingForPoultryAndHatchingForPoultryScienceSerializer(active_hatchings, many=True) result = { 'poultry': poultry_serializer.data, 'active_hatchings': hatchings_serializer.data } return Response(result, status=status.HTTP_200_OK) class PoultryRequestForDirectBuyingViewSet(GenericAPIView): permission_classes = [TokenHasReadWriteScope] serializer_class = PoultryRequestForDirectBuyingSerializer filterset_class = PoultryRequestDirectBuyingFilterSet pagination_class = CustomPagination def get_queryset(self): user = SystemUserProfile.objects.select_related("user").get(user=self.request.user, trash=False) role = self.request.GET.get('role') date1, date2 = self.request.GET.get('date1'), self.request.GET.get('date2') now = datetime.datetime.now() categories = {c.name: c for c in IndexWeightCategory.objects.filter(trash=False).only('name')} light, average, heavy = categories.get("سبک"), categories.get("متوسط"), categories.get("سنگین") show_market = ShowMarketRequest.objects.filter(trash=False, allow=True).first() now_time = now.time().replace(second=0, microsecond=0) filters = Q( state_process='accepted', province_state='accepted', temporary_trash=False, trash=False, out=False, final_state='pending', market=True ) if date1 and date2: filters &= Q(send_date__date__gte=date1, send_date__date__lte=date2) else: filters &= Q(send_date__date=now.date()) queryset = PoultryRequest.objects.select_related( "poultry__user__city", "hatching" ).filter(filters) if role == "KillHouse" and show_market: kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() if not ( kill_house and kill_house.market_buying and show_market.start_time < now_time < show_market.end_time): return PoultryRequest.objects.none() breed = self.request.GET.get('breed') city = self.request.GET.get('city') remain = self.request.GET.get('remain') min_amount = self.request.GET.get('min_amount') max_amount = self.request.GET.get('max_amount') weight = self.request.GET.get('weight') min_age = self.request.GET.get('min_age') max_age = self.request.GET.get('max_age') value = self.request.GET.get('value') search = self.request.GET.get('search') if breed: queryset = queryset.filter(chicken_breed__in=breed.split(',')) if city: queryset = queryset.filter(poultry__user__city__name__in=city.split(',')) if remain == 'true': queryset = queryset.filter(remain_quantity__gt=0) if min_amount: queryset = queryset.filter(amount__gte=min_amount) if max_amount: queryset = queryset.filter(amount__lte=max_amount) if weight and (light and average and heavy): if weight == 'سبک': queryset = queryset.filter(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value) elif weight == 'متوسط': queryset = queryset.filter(Index_weight__gte=average.min_value, Index_weight__lt=average.max_value) elif weight == 'سنگین': queryset = queryset.filter(Index_weight__gte=heavy.min_value, Index_weight__lte=heavy.max_value) if min_age: queryset = queryset.filter(hatching__chicken_age__gte=min_age) if max_age: queryset = queryset.filter(hatching__chicken_age__lte=max_age) if value and search == 'filter' and value.strip() and value != 'undefined': queryset = queryset.filter(build_query(self.filterset_class, value)) return queryset def get(self, request): queryset = self.get_queryset() page_size = request.query_params.get('page_size') if page_size: self.pagination_class.page_size = int(page_size) page = self.paginate_queryset(queryset) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.serializer_class(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class PoultryHatchingForDirectBuyingViewSet(APIView): permission_classes = [TokenHasReadWriteScope] def get(self, request): result = None hatching = PoultryHatching.objects.get(key=request.GET['hatching_key']) poultry_requests = PoultryRequest.objects.filter(hatching=hatching, state_process__in=('pending', 'accepted'), province_state__in=('pending', 'accepted'), trash=False, temporary_trash=False, out=False).order_by('send_date') poultry_requests_info = poultry_requests.aggregate( avg_weight=Avg('Index_weight'), min_age=Min('killing_age'), max_age=Max('killing_age') ) kill_house_requests = KillHouseRequest.objects.filter(trash=False, province_request__poultry_request__in=poultry_requests) kill_house_requests_info = kill_house_requests.aggregate( avg_weight_losse=Avg('weight_loss') ) completed_bars = kill_house_requests.filter(assignment_state_archive='True') receive_bars_percent = ( completed_bars.count() / kill_house_requests.count()) * 100 if kill_house_requests else 0 if poultry_requests: result = { 'min_age': poultry_requests_info['min_age'] or 1, 'max_age': poultry_requests_info['max_age'] or 1, 'now_age': hatching.chicken_age, 'avg_weight': round(poultry_requests_info['avg_weight'] or 0, 2) or 0, 'avg_weight_losse': round(kill_house_requests_info['avg_weight_losse'] or 0, 2) or 0, 'receive_bars_percent': round(receive_bars_percent, 2), } return Response(result, status=status.HTTP_200_OK) class PoultryHatchingChartForDirectBuyingViewSet(APIView): permission_classes = [TokenHasReadWriteScope] def get(self, request): user = SystemUserProfile.objects.get(user=self.request.user, trash=False) today = datetime.date.today() now = datetime.datetime.now() role = request.GET.get('role') show_market = ShowMarketRequest.objects.filter(trash=False, allow=True).first() now_time = now.time().replace(second=0, microsecond=0) index_weight_category = IndexWeightCategory.objects.filter(trash=False).order_by('id') light = index_weight_category.filter(name='سبک').first() average = index_weight_category.filter(name='متوسط').first() heavy = index_weight_category.filter(name='سنگین').first() light_min_value = light.min_value light_max_value = light.max_value average_min_value = average.min_value average_max_value = average.max_value heavy_min_value = heavy.min_value heavy_max_value = heavy.max_value if show_market and role == 'KillHouse': kill_house = KillHouse.objects.filter(trash=False, kill_house_operator__user=user).first() if show_market.start_time < \ now_time < show_market.end_time: if kill_house.market_buying: queryset = ( PoultryRequest.objects.filter( send_date__date=today, state_process='accepted', province_state='accepted', temporary_trash=False, trash=False, out=False, final_state='pending', market=True, ) .values("poultry__user__city__name") .annotate( total_quantity=Sum('quantity'), light_quantity=Sum( Case( When(Q(Index_weight__gte=light_min_value, Index_weight__lt=light_max_value), then="quantity"), output_field=IntegerField(), ) ), average_quantity=Sum( Case( When(Q(Index_weight__gte=average_min_value, Index_weight__lt=average_max_value), then="quantity"), output_field=IntegerField(), ) ), heavy_quantity=Sum( Case( When(Q(Index_weight__gte=heavy_min_value, Index_weight__lt=heavy_max_value), then="quantity"), output_field=IntegerField(), ) ), ) ) result = [ { "city": row["poultry__user__city__name"], "total_quantity": row["total_quantity"] or 0, "category": [ { "name": light.name, "min_value": light.min_value, "max_value": light.max_value, "quantity": row['light_quantity'] or 0, }, { "name": average.name, "min_value": average.min_value, "max_value": average.max_value, "quantity": row['average_quantity'] or 0, }, { "name": heavy.name, "min_value": heavy.min_value, "max_value": heavy.max_value, "quantity": row['heavy_quantity'] or 0, } ] } for row in queryset ] else: result = [] else: result = [] else: queryset = ( PoultryRequest.objects.filter( send_date__date=today, state_process='accepted', province_state='accepted', temporary_trash=False, trash=False, out=False, final_state='pending', market=True, ) .values("poultry__user__city__name") .annotate( total_quantity=Sum('quantity'), light_quantity=Sum( Case( When(Q(Index_weight__gte=light_min_value, Index_weight__lt=light_max_value), then="quantity"), output_field=IntegerField(), ) ), average_quantity=Sum( Case( When(Q(Index_weight__gte=average_min_value, Index_weight__lt=average_max_value), then="quantity"), output_field=IntegerField(), ) ), heavy_quantity=Sum( Case( When(Q(Index_weight__gte=heavy_min_value, Index_weight__lt=heavy_max_value), then="quantity"), output_field=IntegerField(), ) ), ) ) result = [ { "city": row["poultry__user__city__name"], "total_quantity": row["total_quantity"] or 0, "category": [ { "name": light.name, "min_value": light.min_value, "max_value": light.max_value, "quantity": row['light_quantity'] or 0, }, { "name": average.name, "min_value": average.min_value, "max_value": average.max_value, "quantity": row['average_quantity'] or 0, }, { "name": heavy.name, "min_value": heavy.min_value, "max_value": heavy.max_value, "quantity": row['heavy_quantity'] or 0, } ] } for row in queryset ] return Response(result, status=status.HTTP_200_OK) class ManagementHatchingAgeRangeViewSet(viewsets.ModelViewSet): queryset = ManagementHatchingAgeRange.objects.all().order_by('from_age') serializer_class = ManagementHatchingAgeRangeSerializer permission_classes = [TokenHasReadWriteScope]