Files
2026-01-18 11:42:00 +03:30

453 lines
24 KiB
Python

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