Files
2026-01-18 11:45:53 +03:30

10384 lines
570 KiB
Python

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]