Files
Rasadyar_Marzaki/panel/KillHouse/views.py
2026-01-18 11:45:53 +03:30

19755 lines
1.1 MiB
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# import random
import random
import string
import threading
from datetime import datetime, timedelta
import jdatetime
import requests
from django.contrib.auth.models import User, Group
from django.db.models import Case, When, Avg
from django.http import JsonResponse, HttpResponse
from django.http import QueryDict
from django.shortcuts import get_object_or_404
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from django_filters.rest_framework import DjangoFilterBackend
from oauth2_provider.contrib.rest_framework import (
TokenHasReadWriteScope,
)
from rest_framework import status
from rest_framework import viewsets
from rest_framework.decorators import permission_classes, api_view
from rest_framework.generics import GenericAPIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView
from authentication.arvan_image.arvan_storage import upload_object_resize
from authentication.models import UserProfile, SystemUserProfile, City, Province, SystemAddress
from authentication.serializer.serializer import SystemUserProfileSerializer
from authentication.sms_management import kill_request_province_sms, province_kill_request_to_kill_house_sms, \
kill_request_delete_province_sms, province_kill_request_accept_sms, document_discrepancy_sms, export_code_sms, \
car_allocation_vet_farm_sms, delete_car_allocation_vet_farm_sms, send_sms_for_bar_difference_request, \
confirm_price_poultry_request_direct_buying_sms, send_sms_fro_kill_request_market, send_sms_for_sale_bar
from authentication.views import ARTA_URL_CHANGE_MOBILE_NUMBER
from bot_eata import bot_eitaa_for_each_province_kill_request, bot_eitaa_for_each_delete_province_kill_request, \
send_single_bar_to_eitaa
from deposit_id import market_code_state
from general_urls import base_url_sms, base_url_for_sms_report
from panel.KillHouse.helpers import kill_house_requests_product_warehousing, kill_house_free_buying_product_warehousing, \
kill_house_free_sale_product_warehousing, get_finance_info, generate_unique_bar_code, \
send_ticket_for_bar_difference_request, market_poultry_request_remain_quantity, market_kill_request_share_quantity, \
calculate_governmental_quota, check_kill_house_remain_limitation_weight
from panel.KillHouse.serializers import (
KillHouseSerializer,
KillHouseRequestSerializer,
KillRequestSerializer,
KillHouseAssignmentInformationSerializer,
KillHouseCheckRequestSerializer,
KillHouseADDCARSerializer,
VetSerializer,
VetCheckRequestSerializer,
ProvinceKillRequestSerializer,
KillHouseRequestExchangeSerializer,
KillHouseRequestExchangeReserveSerializer,
KillHouseRequestExchangeAddCarSerializer,
KillHouseDriverSerializer,
KillHouseOperatorSerializer,
KillHouseRequestActionSerializer,
KillHouseRequestActionWinnerSerializer, DriverRequestCancelSerializer, KillHouseVetSerializer,
KillHouseComplaintSerializer, CheckKillHouseComplaintSerializer, CheckUnusualCasualtiesSerializer,
KillHousePercentageSerializer, KillHouseAssignmentImagesSerializer, KillRequestFactorSerializer,
KillRequestFactorPaymentSerializer, AutomaticKillRequestSerializer, KillHouseCreditorsSerializer,
KillHouseAllowVetSerializer, KillHouseWareHouseSerializer, KillHouseFreeBarInformationSerializer,
KillHouseRequestForBarManagementSerializer, ProvinceKillRequestProvinceWageSerializer,
KillHouseForProvinceWageSerializer, KillHouseforPurchaseRequestSerializer, KillHousePurchaseRequestSerializer,
KillHouseForAutomaticStewardAllocationSerializer, KillHouseForTotalReportAutomaticStewardAllocationSerializer,
PoultryRequestLetterForProvinceVetSerializer,
ProvinceKillRequestForKillingInformationDiscrepancyReportSerializer, KillHouseRequestForDiffrentBarInfoSerializer,
PoultryRequestForTotalInformationSerializer, PoultryRequestForTotalInformationInTableSerializer,
KillHouseWareHouseForDailyBroadCastOInDetailsSerializer, KillHouseAssignmentInformationForCompletedLoadsSerializer,
KillHouseFreeSaleBarInformationSerializer, KillHouseWageForTotalDashbordSerializer,
KillHouseForProvinceWageWithDateSerializer, SlaughterHouseTransactionSerializer, KillHouseWageSerializer,
KillHouseForFreeBarWageSerializer, KillHouseForFreeBarWageWithDateSerializer,
KillHouseForTotalProvinceWageTransactionSerializer, KillHouseForTotalProvinceWageTransactionWithDAteSerializer,
KillHouseForKillHouseRequestWageWithDateSerializer, KillHouseForKillHouseRequestWageSerializer,
KillHouseFreeBarInformationForWageTotalSerializer,
TotalWageInformationKillHouseExclusiveKillerSerializer, KillHouseLetterForProvinceSerializer,
PoultryRequestoutProvinceSerializer, BarDocumentStatusSerializer, GeneralKillHouseSerializer,
VetKillHouseSerializer, VetFarmListSerializer, KillHouseForKillHouseVetKillHouseSerializer,
KillHouseForFreeSaleBarInformationViewSetSerializer,
KillHouseForFreeSaleBarInformationViewSetWithDateSerializer, KillHouseForNewWageInormationSerializer,
KillHouseRequestForInputBarsSerializer, PosKillHouseSerializer, KillHouseForProvinceWareHouseDashboardSerializer,
ParentCompanyKillHouseForNewWageInormationSerializer, KillHouseForColdHouseSerializer,
KillHouseColdHousesSerializer, BarDifferenceRequestSerializer, distributionKillHouseSerializer,
KillHouseForPerformanceDashboardSerializer, DirectBuyingPaymentSerializer, KillRequestForDirectBuyingSerializer,
ProvinceKillRequestForDirectBuyingSerializer, KillHouseForCommonlyUsedSerializer, KillHouseMarketInfoSerializer,
KillHouseForColdHouseAllocationSerializer, KillHouseForSegmentationSerializer,
KillHouseComparativeInformationSerializer, KillRequestForDirectBuyingTrueSerializer,
ReturnProvinceKillRequestSerializer, TotalKillHouseRemainWeightViewSetSerializer,
TotalKillHouseWarehouseArchiveDashboardSerializer, PspKillHouseSerializer
)
from panel.ProvinceOperator.serializers import ProvinceFactorToKillHouseSerializer, StewardAllocationSerializer
from panel.ProvinceOperator.views import ARVAN_Kill_house_Factor_URL
from panel.ReportingPanel.helper import kill_house_request_filterset_fields, \
poultry_request_new_fields
from panel.ReportingPanel.views import get_gid_out_province
from panel.VetFarm.serializers import VetFarmSerializer
from panel.admin import PROJECT_API_KEY
from panel.filterset import KillHouseDriverFilterSet, VetFilterSet, KillHouseRequestFilterSet, \
ProvinceKillRequestFilterSet, KillHouseFilterSet, KillRequestFilterSet, PoultryRequestFilterSet, \
KillHouseFreeBarInformationFilterSet, DashboardEnterLoadInformationFilterSet, \
DashboardKillHouseFreeBarInformationFilterSet, VetFarmAndKillHouseFilterSet, ProvinceKillRequestNewFilterSet, \
DashboardKillRequestFilterSet, KillHouseFreeSaleBarInformationFilterSet, \
BarDifferenceRequestFilterSet, DirectBuyingPaymentFilterSet, ReturnProvinceKillRequestFilterSet
from panel.helper import build_query
from panel.models import (
KillHouse,
KillHouseRequest,
KillRequest,
ProvinceCheckOperatorRequest,
KillHouseCheckRequest,
KillHouseAssignmentInformation,
ProvinceFactorToKillHouse,
KillHouseADDCAR,
Vet,
VetCheckRequest,
ProvinceKillRequest,
KillHouseRequestExchange,
KillHouseRequestExchangeReserve,
PoultryRequestExchange,
KillHouseRequestExchangeAddCar,
PoultryRequest,
KillHouseDriver,
KillHouseOperator,
VetFarm,
KillHouseRequestAction,
KillHouseRequestActionWinner, DriverRequestCancel, KillHouseVet, PercentageOfLosses, KillHouseComplaint,
CheckKillHouseComplaint, ProvinceFactorToKillHouseForPoultry, CheckUnusualCasualties, KillHousePercentage,
TotalPoultryRequestQuantity, KillHouseAssignmentImages, VetSupervisor, KillRequestFactor, KillRequestFactorPayment,
Pricing, AutomaticKillRequest, KillHouseCreditors, ShareOfAllocation, ProvinceOperator, SmsLicense,
KillHouseAllowVet, Wallet, ProvinceAllowKillHouseRegisterCar, PoultryHatching, Poultry,
AutoAcceptProvinceKillRequest, KillHouseWareHouse, KillHouseFreeBarInformation, Guilds,
CityOperator, PoultryRequestAuction, ProvinceAllowKillHouseChooseStewardGuilds, KillHouseHourLimit,
ProvinceAllowKillHouseDirectBuying, KillHousePurchaseRequest, Steward, StewardAllocation, StewardWareHouse,
ColdHouseAllocations, KillHouseFreeSaleBarInformation, OperationLimitation,
EvacuationPermit, TimeRange, SlaughterHouseTransaction, WageType, PercentageOfWageType,
InternalTransaction, BarDocumentStatus, VetFarmAggregatePermission, OutProvinceCarcassesBuyer, RolesProducts,
AutomaticDirectBuyingPermission, FreeSaleWithinprovince, CityOperatorCheckRequest, POSMachine, ColdHouse,
BarDifferenceRequest, ChickenAgeRange, RequestLimitation, PriceConfirmation, DirectBuyingPayment,
DirectBuyingVerification, FinePermission, IndexWeightCategory, PosSegmentation, RestrictionCarcassDistribution,
AllowRegisterCodeForKillHouseFreeSaleBarInformation, ProductsTransactions,
LimitationForDirectPurchaseAndBarInformation, WarehouseArchive
)
# آدرس پایه مربوط به ذخیره عکس در گالری مربوط به کشتارگاه در استوریج آروان
from panel.poultry.helpers import poultry_prediction, create_update_chicken_commission_prices
from panel.poultry.serializers import PoultryRequestSerializer, PoultryRequestForKillingInformationSerializer
from ticket.bucket import upload_to_liara
from ticket.helper import send_image_to_server
ARVAN_Kill_house_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/'
ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/"
class CustomPagination(PageNumberPagination):
page_size = 10
from django.db.models import Q
def get_exclusive_killer_operation(kill_houses):
for kill_house in kill_houses:
total_unpaid_wage = 0
total_paid_wage = 0
province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house,
state__in=('pending', 'accepted'), trash=False,
return_to_province=False,
first_car_allocated_quantity=0,
archive_wage=False,
)
kill_house_requests = KillHouseRequest.objects.filter(
Q(Q(killer=kill_house) & Q(killhouse_user=kill_house)) | Q(
Q(killer__isnull=True) & Q(killhouse_user=kill_house)) | Q(
Q(killer__isnull=True) | Q(killer=kill_house)),
# killhouse_user=kill_house,
archive_wage=False,
trash=False
)
kill_house_requests = kill_house_requests.filter(Q(killer=kill_house) | Q(killhouse_user=kill_house))
free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, archive_wage=False,
trash=False)
total_unpaid_wage += province_kill_requests.aggregate(total=Sum('total_wage_amount'))[
'total'] or 0
total_unpaid_wage += free_bars.aggregate(total=Sum('total_wage_amount'))[
'total'] or 0
total_unpaid_wage += \
kill_house_requests.aggregate(total=Sum(F('accepted_real_weight') * F('province_kill_request__wage')))[
'total'] or 0
slaughter_transactions = InternalTransaction.objects.filter(
kill_house=kill_house, status='completed',
trash=False)
total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
total_amount = total_unpaid_wage - total_paid_wage
kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True, kill_house=kill_house).first()
if kill_house_purchase:
if total_amount >= kill_house_purchase.limitation_number:
kill_house.show_exclusive = False
kill_house.save()
else:
kill_house.show_exclusive = True
kill_house.save()
else:
kill_house.show_exclusive = True
kill_house.save()
def update_kill_house_requests(province_kill_request, poultry_request):
# gate_way_percentage = PaymentGatewayPercentage.objects.get(trash=False)
kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_request, trash=False)
total_kill_house_requests_quantity = kill_house_requests.aggregate(total_quantity=Sum('accepted_real_quantity'))[
'total_quantity']
total_kill_house_requests_weight = kill_house_requests.aggregate(total_weight=Sum('accepted_real_weight'))[
'total_weight']
total_first_allocated_cars = kill_house_requests.aggregate(total_weight=Sum('quantity'))[
'total_weight']
province_kill_request.total_killed_quantity = total_kill_house_requests_quantity or province_kill_request.main_quantity
province_kill_request.first_car_allocated_quantity = total_first_allocated_cars or 0
province_kill_request.total_killed_weight = total_kill_house_requests_weight or int(
province_kill_request.main_quantity * poultry_request.Index_weight)
province_kill_request.total_wage_amount = province_kill_request.total_killed_weight * province_kill_request.wage
province_kill_request.save()
union_percent = province_kill_request.union_share_percent / 100 if province_kill_request.union_share_percent > 0 else 0
company_percent = province_kill_request.company_share_percent / 100 if province_kill_request.company_share_percent > 0 else 0
guilds_percent = province_kill_request.guilds_share_percent / 100 if province_kill_request.guilds_share_percent > 0 else 0
city_share_percent = province_kill_request.city_share_percent / 100 if province_kill_request.city_share_percent > 0 else 0
wallet_share_percent = province_kill_request.wallet_share_percent / 100 if province_kill_request.wallet_share_percent > 0 else 0
other_share_percent = province_kill_request.other_share_percent / 100 if province_kill_request.other_share_percent > 0 else 0
province_kill_request.union_share = int(union_percent * province_kill_request.total_wage_amount)
province_kill_request.company_share = int(company_percent * province_kill_request.total_wage_amount)
province_kill_request.guilds_share = int(guilds_percent * province_kill_request.total_wage_amount)
province_kill_request.city_share = int(city_share_percent * province_kill_request.total_wage_amount)
province_kill_request.wallet_share = int(wallet_share_percent * province_kill_request.total_wage_amount)
province_kill_request.other_share = int(other_share_percent * province_kill_request.total_wage_amount)
province_kill_request.save()
def update_province_kill_requests(poultry_hatching):
province_kill_requests = ProvinceKillRequest.objects.filter(
trash=False,
state__in=('pending', 'accepted'),
return_to_province=False,
province_request__poultry_request__hatching=poultry_hatching
)
total_killed_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total']
total_extra_quantity = province_kill_requests.aggregate(total=Sum('extra_killed_quantity'))['total']
free_filter = Q(province_request__poultry_request__free_sale_in_province=True, state__in=('pending', 'accepted'),
trash=False)
governmental_filter = ~free_filter
total_free_quantity = \
province_kill_requests.filter(free_filter, province_request__poultry_request__export=False).aggregate(
total=Sum('total_killed_quantity'))[
'total']
total_free_weight = \
province_kill_requests.filter(free_filter, province_request__poultry_request__export=False).aggregate(
total=Sum('total_killed_weight'))['total']
total_governmental_quantity = \
province_kill_requests.filter(governmental_filter, province_request__poultry_request__export=False).aggregate(
total=Sum('total_killed_quantity'))['total']
total_governmental_weight = \
province_kill_requests.filter(governmental_filter, province_request__poultry_request__export=False).aggregate(
total=Sum('total_killed_weight'))['total']
total_export_quantity = \
province_kill_requests.filter(province_request__poultry_request__export=True).aggregate(
total=Sum('total_killed_quantity'))['total']
total_export_weight = \
province_kill_requests.filter(province_request__poultry_request__export=True).aggregate(
total=Sum('total_killed_weight'))['total']
poultry_hatching.free_killed_quantity = total_free_weight or 0
poultry_hatching.free_quantity = total_free_quantity or 0
poultry_hatching.governmental_killed_quantity = total_governmental_weight or 0
poultry_hatching.governmental_quantity = total_governmental_quantity or 0
poultry_hatching.export_killed_weight = total_export_weight or 0
poultry_hatching.export_killed_quantity = total_export_quantity or 0
poultry_hatching.extra_killed_quantity = total_extra_quantity or 0
poultry_hatching.killed_quantity = total_killed_quantity or 0
poultry_hatching.save()
class BarDocumentStatusViewset(viewsets.ModelViewSet):
queryset = BarDocumentStatus.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = BarDocumentStatusSerializer
def list(self, request, *args, **kwargs):
bar_documents_status = BarDocumentStatus.objects.filter(trash=False).order_by('priority_id')
serializer = self.serializer_class(bar_documents_status, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
if 'priority_list' in request.data:
priority_list = request.data['priority_list']
priorities = {item['key']: item['value'] for item in priority_list}
bar_documents_status = BarDocumentStatus.objects.filter(trash=False).order_by('priority_id')
for document in bar_documents_status:
priority_id = priorities.get(str(document.key))
if priority_id is not None:
document.priority_id = priority_id
document.save()
return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK)
bar_documents_status = BarDocumentStatus.objects.get(key=request.data['bar_documents_status_key'], trash=False)
request.data.pop('bar_documents_status_key')
serializer = self.serializer_class(bar_documents_status)
serializer.update(instance=bar_documents_status, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
bar_documents_status = BarDocumentStatus.objects.get(id=pk, trash=False)
if KillHouseRequest.objects.filter(bar_document_status=bar_documents_status,
trash=False).exists():
return Response({"result": "به علت استفاده ار این وضعیت سند بر روی بار امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
bar_documents_status.delete()
return Response({"result": "با موفقیت حذف شد."},
status=status.HTTP_200_OK)
class KillHouseCreditorsViewSet(viewsets.ModelViewSet):
queryset = KillHouseCreditors.objects.all()
serializer_class = KillHouseCreditorsSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
creditors = KillHouseCreditors.objects.filter(kill_house__system_address__province=user.province).order_by('id')
serializer_request = self.serializer_class(creditors, many=True)
return Response(serializer_request.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
creditors = KillHouseCreditors.objects.get(key=request.data["key"], trash=False)
request.data.pop('key')
amount = request.data['amount']
request.data.pop('amount')
creditors.amount -= float(amount)
creditors.save()
serializer = self.serializer_class(creditors)
serializer.update(instance=creditors, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به اپراتور کشتارگاه
class KillHouseOperatorViewSet(viewsets.ModelViewSet):
queryset = KillHouseOperator.objects.all()
serializer_class = KillHouseOperatorSerializer
permission_classes = [TokenHasReadWriteScope]
def retrieve(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'profile' in request.GET:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house_operator_serializer = KillHouseOperatorSerializer(kill_house_operator)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False)
kill_house_serializer = KillHouseSerializer(kill_house, many=True)
profile_info = {
# 'profile': user_serializer.data,
'kill_house_operator': kill_house_operator_serializer.data,
'kill_house': kill_house_serializer.data
}
return Response(profile_info, status=status.HTTP_200_OK)
class KillHouseForKillHouseRequestWageViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForKillHouseRequestWageSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] == 'ProvinceOPerator':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
archive_wage=False,
province_kill_request__union_share__gt=0,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_kill_request__company_share__gt=0,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_kill_request__guilds_share__gt=0,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
else:
if request.GET['role'] == 'ProvinceOPerator':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
province_kill_request__union_share__gt=0,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
province_kill_request__company_share__gt=0,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
province_kill_request__guilds_share__gt=0,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=KillHouseRequest.objects.filter(
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
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 (self.filterset_class(
data=query,
queryset=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_houses = ps.filter()
else:
kill_houses = kill_houses
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_houses)
if page is not None:
if 'date1' in request.GET:
serializer = KillHouseForKillHouseRequestWageWithDateSerializer(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 = KillHouseForProvinceWageWithDateSerializer(kill_houses, many=True,
context={'request': request})
else:
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForNewWageInormationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForNewWageInormationSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
'kill_house', flat=True)
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).exclude(id__in=kill_house_ids).order_by(
'id')
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForColdHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForColdHouseSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
kill_houses = KillHouse.objects.filter(out_province=False, trash=False,
pk__in=ColdHouse.objects.filter(kill_house__isnull=False).values_list(
'kill_house', flat=True)).order_by('id')
if 'search' in request.GET:
if request.GET['search'] == 'filter':
kill_houses_list = []
if request.GET['value'] != "":
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (self.filterset_class(
data=query,
queryset=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_houses_list = ps.filter()
kill_houses = [] if len(kill_houses_list) == 0 else kill_houses_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(kill_houses)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseColdHousesViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseColdHousesSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
serializer = self.get_serializer(kill_houses)
return Response(serializer.data, status=status.HTTP_200_OK)
class ParentCompanyKillHouseForNewWageInormationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = ParentCompanyKillHouseForNewWageInormationSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
serializer = self.get_serializer(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForProvinceWareHouseDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
serializer_class = KillHouseForProvinceWareHouseDashboardSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.GET.get('role')
kill_house_filters = {'out_province': False, 'active': True, 'trash': False}
if role in ['CityJahad']:
kill_house_filters['kill_house_operator__user__city'] = user.city
kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by(
'id')
kill_houses = kill_houses.annotate(
allocation_count=Count(
'kill_house_steward_allocation',
filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted'])
)
).order_by(
'-allocation_count'
)
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForTotalProvinceWareHouseDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
serializer_class = KillHouseForProvinceWareHouseDashboardSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.GET.get('role')
kill_house_filters = {'out_province': False, 'active': True, 'trash': False}
if role in ['CityJahad']:
kill_house_filters['kill_house_operator__user__city'] = user.city
kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by(
'id')
kill_houses = kill_houses.annotate(
allocation_count=Count(
'kill_house_steward_allocation',
filter=Q(kill_house_steward_allocation__receiver_state__in=['pending', 'accepted'])
)
).order_by(
'-allocation_count'
)
products = RolesProducts.objects.filter(kill_house__in=kill_houses, trash=False, name='مرغ گرم')
# products = RolesProducts.objects.filter(kill_house__in=kill_houses, trash=False)
# product_remain_weight = products.aggregate(total=Sum('total_remain_weight'))[
# 'total'] or 0
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
bars_date1 = date1
bars_date2 = date2
# bars_date1 = date1 - timedelta(days=1)
# bars_date2 = date2 - timedelta(days=1)
kill_house_requests = KillHouseRequest.objects.filter(
input_warehouse__in=kill_houses,
kill_request__recive_date__date__gte=bars_date1,
kill_request__recive_date__date__lte=bars_date2,
temporary_trash=False,
temporary_deleted=False,
trash=False, calculate_status=True, warehouse=True)
kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1,
date__date__lte=date2,
buy_type='carcass') | Q(
create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'),
input_warehouse__in=kill_houses,
trash=False,
temporary_trash=False,
temporary_deleted=False,
calculate_status=True,
warehouse=True).exclude(
entered_message='ورود به انبار مجازی')
kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__in=kill_houses,
date__date__gte=date1,
date__date__lte=date2,
trash=False,
temporary_trash=False,
temporary_deleted=False,
calculate_status=True, warehouse=True)
kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False,
receiver_state__in=('pending', 'accepted'),
date__date__gte=date1,
date__date__lte=date2,
temporary_trash=False,
temporary_deleted=False,
to_cold_house__isnull=True,
calculate_status=True, warehouse=True)
segmentations = PosSegmentation.objects.filter(kill_house__in=kill_houses, trash=False,
date__date__gte=date1,
date__date__lte=date2, warehouse=True)
cold_house_allocations = StewardAllocation.objects.filter(
kill_house__in=kill_houses,
date__date__gte=date1,
date__date__lte=date2,
to_cold_house__isnull=False,
receiver_state__in=('accepted', 'pending'),
trash=False, warehouse=True)
transactions = ProductsTransactions.objects.filter(product__in=products, transaction__paid=True,
transaction__date__date__gte=date1,
transaction__date__date__lte=date2, trash=False,
warehouse=True)
archives = WarehouseArchive.objects.filter(kill_house__in=kill_houses, date__date__gte=date1,
date__date__lte=date2, trash=False, warehouse=True)
else:
kill_house_requests = KillHouseRequest.objects.filter(
input_warehouse__in=kill_houses,
temporary_trash=False,
temporary_deleted=False,
trash=False, calculate_status=True, warehouse=True)
kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(
input_warehouse__in=kill_houses,
trash=False,
temporary_trash=False,
temporary_deleted=False,
calculate_status=True, warehouse=True).exclude(entered_message='ورود به انبار مجازی')
kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__in=kill_houses,
trash=False,
temporary_trash=False,
temporary_deleted=False,
calculate_status=True, warehouse=True)
kill_house_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False,
receiver_state__in=('pending', 'accepted'),
temporary_trash=False,
temporary_deleted=False,
to_cold_house__isnull=True,
calculate_status=True, warehouse=True)
segmentations = PosSegmentation.objects.filter(kill_house__in=kill_houses, trash=False, warehouse=True)
cold_house_allocations = StewardAllocation.objects.filter(
kill_house__in=kill_houses,
to_cold_house__isnull=False,
receiver_state__in=('accepted', 'pending'),
trash=False, warehouse=True)
transactions = ProductsTransactions.objects.filter(product__in=products, transaction__paid=True,
trash=False, warehouse=True)
archives = WarehouseArchive.objects.filter(kill_house__in=kill_houses, trash=False, warehouse=True)
total_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
total_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
total_entered_kill_house_requests_carcasses_weight = \
kill_house_requests.filter(ware_house_confirmation=True).aggregate(
total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
total_entered_kill_house_requests_carcasses_governmental_weight = \
kill_house_requests.filter(ware_house_confirmation=True,
province_request__poultry_request__free_sale_in_province=False).aggregate(
total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
total_entered_kill_house_requests_carcasses_free_weight = \
kill_house_requests.filter(ware_house_confirmation=True,
province_request__poultry_request__free_sale_in_province=True).aggregate(
total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
kill_house_free_bar_informations_live = kill_house_free_bar_informations.filter(buy_type='live')
kill_house_free_bar_informations_carcasses = kill_house_free_bar_informations.filter(buy_type='carcass')
total_kill_house_free_bar_quantity = \
kill_house_free_bar_informations_live.aggregate(total=Sum('quantity'))['total'] or 0
total_kill_house_free_bar_weight = \
kill_house_free_bar_informations_live.aggregate(total=Sum('live_weight'))['total'] or 0
total_kill_house_free_bar_carcasses = \
kill_house_free_bar_informations_carcasses.aggregate(total=Sum('number_of_carcasses'))[
'total'] or 0
total_kill_house_free_bar_carcasses_weight = \
kill_house_free_bar_informations_carcasses.aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
total_entered_kill_house_free_bar_carcasses_weight = \
kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
total_kill_house_free_sale__bar_carcasses_weight = \
kill_house_free_Sale_bar_informations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_free_sale__bar_carcasses_governmental_weight = \
kill_house_free_Sale_bar_informations.filter(quota='governmental').aggregate(
total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_free_sale__bar_carcasses_free_weight = \
kill_house_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_allocations_weight = \
kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_allocations_governmental_weight = \
kill_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_allocations_free_weight = \
kill_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
segmentations_weight = \
segmentations.aggregate(total=Sum('weight'))[
'total'] or 0
segmentations_governmental_weight = \
segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[
'total'] or 0
segmentations_free_weight = \
segmentations.filter(quota='free').aggregate(total=Sum('weight'))[
'total'] or 0
cold_house_allocations_weight = \
cold_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
cold_house_allocations_governmental_weight = \
cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
cold_house_allocations_free_weight = \
cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
pos_allocated_weight_info = transactions.aggregate(
pos_allocated_weight=Sum('cur_weight'),
pos_governmental_allocated_weight=Sum('cur_weight',
filter=Q(price_approved=True)),
pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)),
)
archives_info = archives.aggregate(
total_archive_governmental_weight=Sum('weight', filter=Q(quota='governmental')),
total_archive_free_weight=Sum('weight', filter=Q(quota='free')),
)
pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0
pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0
pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0
total_archive_governmental_weight = archives_info['total_archive_governmental_weight'] or 0
total_archive_free_weight = archives_info['total_archive_free_weight'] or 0
total_governmental_input_weight = total_entered_kill_house_requests_carcasses_governmental_weight
total_free_input_weight = total_entered_kill_house_requests_carcasses_free_weight + total_entered_kill_house_free_bar_carcasses_weight
total_governmental_output_weight = total_kill_house_free_sale__bar_carcasses_governmental_weight + segmentations_governmental_weight + total_kill_house_allocations_governmental_weight + cold_house_allocations_governmental_weight + int(pos_governmental_allocated_weight / 1000)
total_free_output_weight = total_kill_house_free_sale__bar_carcasses_free_weight + total_kill_house_allocations_free_weight + segmentations_free_weight + cold_house_allocations_free_weight + int(pos_free_allocated_weight / 1000)
total_governmental_remain_weight = (
total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight if (
total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight > 0 else 0
last_total_governmental_remain_weight = (
(
total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight) * -1 if (
total_governmental_input_weight - total_governmental_output_weight) - total_archive_governmental_weight < 0 else 0
total_free_remain_weight = (total_free_input_weight - total_free_output_weight) - total_archive_free_weight if (
total_free_input_weight - total_free_output_weight) - total_archive_free_weight > 0 else 0
last_total_free_remain_weight = ((
total_free_input_weight - total_free_output_weight) - total_archive_free_weight) * -1 if (
total_free_input_weight - total_free_output_weight) - total_archive_free_weight < 0 else 0
last_total_remain_weight = last_total_governmental_remain_weight + last_total_free_remain_weight
warehouse_total_weight = total_kill_house_requests_weight + total_kill_house_free_bar_weight + total_kill_house_free_bar_carcasses_weight
warehouse_total_entered_carcasses_weight = total_entered_kill_house_requests_carcasses_weight + total_entered_kill_house_free_bar_carcasses_weight
result = {
"product_remain_weight": int(total_governmental_remain_weight + total_free_remain_weight),
"warehouse_total_quantity": int(
total_kill_house_requests_quantity + total_kill_house_free_bar_quantity + total_kill_house_free_bar_carcasses),
"warehouse_total_weight": int(warehouse_total_weight),
"warehouse_total_entered_carcasses_weight": int(warehouse_total_entered_carcasses_weight),
"total_kill_house_allocations_weight": int(total_kill_house_allocations_weight),
"total_kill_house_free_sale_bar_carcasses_weight": int(total_kill_house_free_sale__bar_carcasses_weight),
"segmentations_weight": int(segmentations_weight),
"cold_house_allocations_weight": int(cold_house_allocations_weight),
"total_governmental_input_weight": int(total_governmental_input_weight),
"total_free_input_weight": int(total_free_input_weight),
"total_governmental_output_weight": int(total_governmental_output_weight),
"total_free_output_weight": int(total_free_output_weight),
"total_governmental_remain_weight": int(total_governmental_remain_weight),
"total_free_remain_weight": int(total_free_remain_weight),
"last_total_governmental_remain_weight": int(last_total_governmental_remain_weight),
"last_total_free_remain_weight": int(last_total_free_remain_weight),
"last_total_remain_weight": int(last_total_remain_weight),
"pos_allocated_weight": int(pos_allocated_weight / 1000),
"pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000),
"pos_free_allocated_weight": int(pos_free_allocated_weight / 1000),
"total_archive_governmental_weight": total_archive_governmental_weight,
"total_archive_free_weight": total_archive_free_weight,
}
return Response(result, status=status.HTTP_200_OK)
class KillHouseDistributionInormationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForNewWageInormationSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
role = request.GET.get('role')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
steward_allocations = StewardAllocation.objects.filter(kill_house=kill_house,
receiver_state__in=('pending', 'accepted'),
calculate_status=True, trash=False)
free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house, trash=False,
calculate_status=True)
steward_allocations_weight = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
free_sales_weight = free_sales.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
else:
guild = Guilds.objects.get(user=user, trash=False)
steward_allocations = StewardAllocation.objects.filter(Q(steward=guild) | Q(guilds=guild),
receiver_state__in=('pending', 'accepted'),
calculate_status=True, trash=False)
steward_allocations_weight = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
free_sales_weight = 0
result = {
"steward_allocations_weight": steward_allocations_weight,
"free_sales_weight": free_sales_weight,
}
return Response(result, status=status.HTTP_200_OK)
class KillHouseTotalDashboardForNewWageInormationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForKillHouseRequestWageSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
total_wage_type = WageType.objects.filter(trash=False)
province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first()
free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
free_buying_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-buy', trash=False).first()
free_sell_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-sell', trash=False).first()
province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0
free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0
free_buying_carcesses_weight_wage_type_amount = free_buying_carcesses_weight_wage_type.amount if free_buying_carcesses_weight_wage_type.status == True else 0
free_sell_carcesses_weight_wage_type_amount = free_sell_carcesses_weight_wage_type.amount if free_sell_carcesses_weight_wage_type.status == True else 0
province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False,
archive_wage=False, return_to_province=False,
state__in=('pending', 'accepted'),
first_car_allocated_quantity=0).order_by('id')
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,
trash=False
)
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses,
archive_wage=False,
trash=False)
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__in=kill_houses,
archive_wage=False,
trash=False)
slaughter_transactions = InternalTransaction.objects.filter(
kill_house__in=kill_houses, status='completed',
trash=False)
total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0
total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
total_out_selling_province_carcasses_weight = \
kill_house_free_sale_bar_info.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
total_province_carcasses_weight = total_province_live_weight * 0.75
total_pure_province_carcasses_weight = total_province_carcasses_weight - total_out_selling_province_carcasses_weight
total_out_live_buying_province_carcasses_weight = \
kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
total_out_carcasses_buying_province_carcasses_weight = \
kill_house_free_bar_info.filter(buy_type='carcass').aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
total_pure_province_carcasses_price = total_pure_province_carcasses_weight * province_live_wage_type_amount
total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_wage_type_amount
total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount
total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_wage_type_amount
total_price = total_pure_province_carcasses_price + total_out_selling_province_carcasses_price + total_out_live_buying_province_carcasses_price + total_out_carcasses_buying_province_carcasses_price
result = {
"total_province_live_weight": total_province_live_weight,
"total_province_carcasses_weight": total_province_carcasses_weight,
"total_out_selling_province_carcasses_weight": total_out_selling_province_carcasses_weight,
"total_pure_province_carcasses_weight": total_pure_province_carcasses_weight,
"total_pure_province_carcasses_price": total_pure_province_carcasses_price,
"total_out_selling_province_carcasses_price": total_out_selling_province_carcasses_price,
"total_out_carcasses_buying_province_carcasses_weight": total_out_carcasses_buying_province_carcasses_weight,
"total_out_carcasses_buying_province_carcasses_price": total_out_carcasses_buying_province_carcasses_price,
"total_out_live_buying_province_carcasses_weight": total_out_live_buying_province_carcasses_weight,
"total_out_live_buying_province_carcasses_price": total_out_live_buying_province_carcasses_price,
"total_paid_wage": total_paid_wage,
"total_price": total_price,
"province_live_wage_amount": province_live_wage_type_amount,
"free_buying_live_weight_amount": free_buying_live_weight_wage_type_amount,
"free_buying_carcesses_weight_amount": free_buying_carcesses_weight_wage_type_amount,
"free_sell_carcesses_weight_amount": free_sell_carcesses_weight_wage_type_amount,
}
return Response(result, status=status.HTTP_200_OK)
class KillHouseForProvinceWageViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForProvinceWageSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
if request.GET['type'] == 'unpaid':
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] == 'ProvinceOPerator':
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
union_share__gt=0,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
company_share__gt=0,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
guilds_share__gt=0,
trash=False).values(
'killhouse_user'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
else:
if request.GET['role'] == 'ProvinceOPerator':
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
union_share__gt=0,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
state__in=(
'pending',
'accepted'),
return_to_province=False,
company_share__gt=0,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
guilds_share__gt=0,
trash=False).values(
'killhouse_user'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(
state__in=(
'pending',
'accepted'),
return_to_province=False,
archive_wage=False,
trash=False).values(
'killhouse_user'), trash=False)
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 (self.filterset_class(
data=query,
queryset=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_houses = ps.filter()
else:
kill_houses = kill_houses
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_houses)
if page is not None:
if 'date1' in request.GET:
serializer = KillHouseForProvinceWageWithDateSerializer(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 = KillHouseForProvinceWageWithDateSerializer(kill_houses, many=True,
context={'request': request})
else:
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
# class KillHouseForProvinceWageViewSet(viewsets.ModelViewSet):
# queryset = KillHouse.objects.all()
# serializer_class = KillHouseForProvinceWageSerializer
# pagination_class = CustomPagination
# permission_classes = [TokenHasReadWriteScope]
# filter_backends = [DjangoFilterBackend]
# filterset_class = KillHouseFilterSet
# filterset_fields = [
# 'name',
# 'kill_house_operator__user__fullname',
# 'kill_house_operator__user__mobile',
# 'system_address__city__name',
#
# ]
#
# def list(self, request, *args, **kwargs):
#
# if request.GET['type'] == 'unpaid':
# if 'date1' in request.GET:
# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# state__in=(
# 'pending',
# 'accepted'),
# archive_by_province=False,
# return_to_province=False,
# trash=False).values(
# 'killhouse_user'), trash=False)
# else:
#
# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False,
# state__in=(
# 'pending',
# 'accepted'),
# archive_by_province=False,
# return_to_province=False,
# trash=False).values(
# 'killhouse_user'), trash=False)
#
#
# elif request.GET['type'] == 'paid':
# if 'date1' in request.GET:
# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=True,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# state__in=(
# 'pending',
# 'accepted'),
# archive_by_province=False,
# return_to_province=False,
# trash=False).values(
# 'killhouse_user'), trash=False)
#
# else:
# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=True,
# state__in=(
# 'pending',
# 'accepted'),
# archive_by_province=False,
# return_to_province=False,
# trash=False).values(
# 'killhouse_user'), trash=False)
#
#
# elif request.GET['type'] == 'archive':
# if 'date1' in request.GET:
# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# state__in=(
# 'pending',
# 'accepted'),
# archive_by_province=True,
# return_to_province=False,
# trash=False).values(
# 'killhouse_user'), trash=False)
#
# else:
# kill_houses = KillHouse.objects.filter(pk__in=ProvinceKillRequest.objects.filter(wage_pay=False,
# state__in=(
# 'pending',
# 'accepted'),
# archive_by_province=True,
# return_to_province=False,
# trash=False).values(
# 'killhouse_user'), trash=False)
#
# else:
# if 'date1' in request.GET:
# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
# kill_houses = KillHouse.objects.filter(
# pk__in=ProvinceKillRequest.objects.filter(
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# state__in=('pending', 'accepted'), trash=False).values(
# 'killhouse_user'), trash=False)
# else:
# kill_houses = KillHouse.objects.filter(
# pk__in=ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'), trash=False).values(
# 'killhouse_user'), trash=False)
#
# 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 (self.filterset_class(
# data=query,
# queryset=kill_houses
# )
# ).filter():
# ps = self.filterset_class(data=query, queryset=kill_houses)
# kill_houses = ps.filter()
# else:
# kill_houses = kill_houses
# 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_houses)
# if page is not None:
# if 'date1' in request.GET:
# serializer = KillHouseForProvinceWageWithDateSerializer(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 = KillHouseForProvinceWageWithDateSerializer(kill_houses, many=True,
# context={'request': request})
# else:
#
# serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
# return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForTotalProvinceWageTransactionViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForTotalProvinceWageTransactionSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] == 'ProvinceOperator':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='completed',
payer_type='kill_house',
union_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='completed',
payer_type='kill_house',
company_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='completed',
payer_type='kill_house',
guilds_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'SuperAdmin':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
payer_type='kill_house',
status='completed',
trash=False).exclude(union_share=0, company_share=0, guilds_share=0).values(
'kill_house'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
payer_type='kill_house',
status='completed',
trash=False).values(
'kill_house'), trash=False)
else:
if request.GET['role'] == 'ProvinceOperator':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
status='completed',
payer_type='kill_house',
union_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
status='completed',
payer_type='kill_house',
company_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
status='completed',
payer_type='kill_house',
guilds_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'SuperAdmin':
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
status='completed',
payer_type='kill_house',
trash=False).exclude(union_share=0, company_share=0, guilds_share=0).values(
'kill_house'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=InternalTransaction.objects.filter(
status='completed',
payer_type='kill_house',
trash=False).values(
'kill_house'), trash=False)
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 (self.filterset_class(
data=query,
queryset=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_houses = ps.filter()
else:
kill_houses = kill_houses
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_houses)
if page is not None:
if 'date1' in request.GET:
serializer = KillHouseForTotalProvinceWageTransactionWithDAteSerializer(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 = KillHouseForTotalProvinceWageTransactionWithDAteSerializer(kill_houses, many=True,
context={'request': request})
else:
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForFreeBarWageViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForFreeBarWageSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
type = request.GET['type']
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] == 'ProvinceOperator':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
buy_type=type,
archive_wage=False,
union_share__gt=0,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
buy_type=type,
company_share__gt=0,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
buy_type=type,
guilds_share__gt=0,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
buy_type=type,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
else:
if request.GET['role'] == 'ProvinceOperator':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
buy_type=type,
union_share__gt=0,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Company':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
buy_type=type,
company_share__gt=0,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
elif request.GET['role'] == 'Guilds':
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
buy_type=type,
guilds_share__gt=0,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
else:
kill_houses = KillHouse.objects.filter(pk__in=KillHouseFreeBarInformation.objects.filter(
buy_type=type,
archive_wage=False,
trash=False).values(
'kill_house'), trash=False)
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 (self.filterset_class(
data=query,
queryset=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_houses = ps.filter()
else:
kill_houses = kill_houses
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_houses)
if page is not None:
if 'date1' in request.GET:
serializer = KillHouseForFreeBarWageWithDateSerializer(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 = KillHouseForFreeBarWageWithDateSerializer(kill_houses, many=True,
context={'request': request})
else:
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForFreeSaleBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForFreeSaleBarInformationViewSetSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']:
free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, date__date__gte=date1,
date__date__lte=date2)
else:
free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house__system_address__city=user.city,
trash=False, date__date__gte=date1,
date__date__lte=date2)
else:
if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']:
free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False)
else:
free_sales = KillHouseFreeSaleBarInformation.objects.filter(kill_house__system_address__city=user.city,
trash=False)
kill_houses = KillHouse.objects.filter(pk__in=free_sales.values_list('kill_house', flat=True)).order_by('id')
if 'date1' in request.GET:
serializer = KillHouseForFreeSaleBarInformationViewSetWithDateSerializer(kill_houses, many=True,
context={'request': request})
else:
serializer = self.get_serializer(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به ثبت کشتارگاه
class KillHouseforPurchaseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.filter(trash=False, out_province=False).order_by('id')
serializer_class = KillHouseforPurchaseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
class KillHousePurchaseRequestPermissionViewSet(viewsets.ModelViewSet):
queryset = KillHousePurchaseRequest.objects.all()
serializer_class = KillHousePurchaseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
total_unpaid_wage = 0
total_paid_wage = 0
permission = True
exclusive = False
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_role = Group.objects.get(name='KillHouse')
if kill_house_role in user.role.all():
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
exclusive = True if kill_house.type == 'exclusive' else False
purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first()
if purchase:
if purchase.total_limitation == True:
permission = False
else:
permission = True
else:
permission = True
return Response({
"permission": permission,
"exclusive": exclusive
}, status=status.HTTP_200_OK)
class KillHousePurchaseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHousePurchaseRequest.objects.all()
serializer_class = KillHousePurchaseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def update(self, request, pk=None, *args, **kwargs):
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False)
request.data.pop('kill_house_key')
serializer = self.serializer_class(data=request.data)
purchace = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first()
if purchace:
serializer.update(instance=purchace, validated_data=request.data)
else:
if serializer.is_valid():
purchace = serializer.create(validated_data=request.data)
purchace.kill_house = kill_house
purchace.save()
return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK)
class TotalReportOfKillHouseWareHouseForDailyBroadCastInDetailsViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseWareHouseForDailyBroadCastOInDetailsSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house_ware_houses = KillHouseWareHouse.objects.filter(
Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q(
pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1,
date__date__lte=date2, trash=False)
kill_houses = KillHouse.objects.filter(
pk__in=kill_house_ware_houses.values('kill_house')
)
serializer = self.serializer_class(kill_houses, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class TotalReportOfKillHouseWareHouseForDailyBroadCastViewSet(viewsets.ModelViewSet):
queryset = KillHouseWareHouse.objects.all()
serializer_class = KillHouseWareHouseSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house_ware_houses = KillHouseWareHouse.objects.filter(
Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q(
pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1,
date__date__lte=date2, trash=False)
number_of_kill_houses = KillHouse.objects.filter(
pk__in=kill_house_ware_houses.values('kill_house')
)
steward_allocations = StewardAllocation.objects.filter(
Q(type='manual') | Q(type='auto', system_registration_code=True),
ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'), trash=False).order_by(
'id')
guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False)
number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0
steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, trash=False)
number_of_steward = steward_allocations_for_number_of_steward.values(
'steward').distinct().count() if steward_allocations_for_number_of_steward else 0
total_pre_cold_quantity = \
kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[
'total']
total_pre_cold_weight = \
kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[
'total']
total_number_of_free_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_free_carcasses'))[
'total']
total_free_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('free_weight_of_carcasses'))[
'total']
total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('number_of_carcasses'))[
'total']
total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('weight_of_carcasses'))[
'total']
final_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total']
final_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total']
total_remain_quantity = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[
'total']
total_remain_weight = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[
'total']
total_allocated_quantity = \
steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[
'total']
total_allocated_weight = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total']
total_accepted_allocated_quantity = \
steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[
'total']
total_accepted_allocated_weight = \
steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[
'total']
return Response({
"buyers": len(number_of_kill_houses),
"incoming_quantity_of_cold_house": 0,
"incoming_weight_of_cold_house": 0,
"total_pre_cold_quantity": total_pre_cold_quantity if total_pre_cold_quantity != None else 0,
"total_pre_cold_weight": total_pre_cold_weight if total_pre_cold_weight != None else 0,
"total_number_of_free_carcasses": total_number_of_free_carcasses if total_number_of_free_carcasses != None else 0,
"total_free_weight_of_carcasses": total_free_weight_of_carcasses if total_free_weight_of_carcasses != None else 0,
"total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0,
"total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0,
"final_total_number_of_carcasses": final_total_number_of_carcasses if final_total_number_of_carcasses != None else 0,
"final_total_weight_of_carcasses": final_total_weight_of_carcasses if final_total_weight_of_carcasses != None else 0,
"total_allocated_quantity": total_allocated_quantity if total_allocated_quantity != None else 0,
"total_allocated_weight": total_allocated_weight if total_allocated_weight != None else 0,
"total_accepted_allocated_quantity": total_accepted_allocated_quantity if total_accepted_allocated_quantity != None else 0,
"total_accepted_allocated_weight": total_accepted_allocated_weight if total_accepted_allocated_weight != None else 0,
"total_remain_quantity": total_remain_quantity if total_remain_quantity != None else 0,
"total_remain_weight": total_remain_weight if total_remain_weight != None else 0,
"number_of_guild": number_of_guild,
"number_of_steward": number_of_steward,
})
class TotalReportForDailyBroadCastViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForTotalReportAutomaticStewardAllocationSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date()
date_one_day_ago = date - timedelta(days=1)
province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'),
kill_request__recive_date__date=date_one_day_ago).select_related(
'killhouse_user')
kill_houses = KillHouse.objects.filter(
pk__in=province_kill_requests.values('killhouse_user')
)
kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__in=kill_houses, date__date=date)
steward_allocations = StewardAllocation.objects.filter(
Q(type='manual') | Q(type='auto', system_registration_code=True),
ware_house__in=kill_house_ware_houses, trash=False,
date__date=date).order_by('id')
total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total']
total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total']
allocated_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total']
allocated_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total']
remain_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total']
remain_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total']
return Response({
"buyers": len(kill_house_ware_houses),
"allocations": len(steward_allocations),
"total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0,
"total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0,
"allocated_total_number_of_carcasses": allocated_total_number_of_carcasses if allocated_total_number_of_carcasses != None else 0,
"allocated_total_weight_of_carcasses": allocated_total_weight_of_carcasses if allocated_total_weight_of_carcasses != None else 0,
"remain_total_number_of_carcasses": remain_total_number_of_carcasses if remain_total_number_of_carcasses != None else 0,
"remain_total_weight_of_carcasses": remain_total_weight_of_carcasses if remain_total_weight_of_carcasses != None else 0,
})
class KillHouseForTotalReportAutomaticStewardAllocationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForTotalReportAutomaticStewardAllocationSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date()
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'])
serializer = self.serializer_class(kill_house, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForAutomaticStewardAllocationViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForAutomaticStewardAllocationSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date()
date = date - timedelta(days=1)
if request.GET['role'] == 'KillHouse':
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user)
serializer = self.serializer_class(kill_house, many=True, context={'request': request})
else:
province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'),
kill_request__recive_date__date=date).select_related(
'killhouse_user')
kill_houses = KillHouse.objects.filter(
pk__in=province_kill_requests.values('killhouse_user')
)
serializer = self.serializer_class(kill_houses, context={'request': request}, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به ثبت کشتارگاه
def create(self, request, *args, **kwargs):
group = Group.objects.get(name__exact="KillHouse")
city = City.objects.get(name=request.data['city'])
request.data.pop('city')
province = Province.objects.get(key=city.province.key)
system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last()
if system_profile:
if KillHouse.objects.filter(kill_house_operator__user=system_profile, trash=False).exists():
return Response({"result": "این کشتارگاه قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN)
else:
password = request.data['password']
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)
address = SystemAddress(city=city, province=province, address=request.data['address'])
address.save()
wallet = Wallet()
wallet.save()
system_profile.role.add(group)
operator = KillHouseOperator.objects.filter(user=system_profile, trash=False).last()
if operator:
pass
else:
operator = KillHouseOperator(
user=system_profile,
address=address,
wallet=wallet,
)
operator.save()
request.data.pop('mobile')
request.data.pop('first_name')
request.data.pop('last_name')
request.data.pop('address')
request.data.pop('national_id')
request.data.pop('password')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house = serializer.create(validated_data=request.data)
kill_house.kill_house_operator = operator
kill_house.system_address = address
kill_house.save()
percentage = KillHousePercentage(kill_house=kill_house)
percentage.save()
province_allow_kill_house_choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds(
kill_house=kill_house)
province_allow_kill_house_choose_steward_guilds.save()
province_allow_direct_buying = ProvinceAllowKillHouseDirectBuying(kill_house=kill_house)
province_allow_direct_buying.save()
return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
# تابع برای نمایش مربوط به نمایش کشتارگاه
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if 'role' in request.GET:
# if 'kill_house' in request.GET:
# kill_house = KillHouse.objects.filter(system_address__province=user.province, killer=False, trash=False)
#
# else:
if request.GET['role'] == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator,
trash=False)
# if request.GET['role'] == 'ProvinceInspector' or request.GET['role'] == 'ProvinceOperator':
else:
kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False)
serializer = KillHouseSerializer(kill_house, many=True)
elif 'kill_house' in request.GET:
kill_house = KillHouse.objects.filter(system_address__province=user.province,
kill_house_operator__killer=False, killer=False, trash=False)
serializer = KillHouseSerializer(kill_house, many=True)
elif 'all' in request.GET:
kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False)
serializer = KillHouseSerializer(kill_house, many=True)
elif 'psp' in request.GET:
kill_house = KillHouse.objects.filter(out_province=False, trash=False)
serializer = PspKillHouseSerializer(kill_house, many=True)
elif 'self_kill_houses' in request.GET:
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator,
trash=False)
serializer = KillHouseSerializer(kill_house, many=True)
elif 'exclusive-killers' in request.GET:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
percentage = KillHousePercentage.objects.filter(
Q(kill_house=kill_house) | Q(kill_house_for_killer=kill_house, kill_house__type='exclusive',
kill_house__show_exclusive=True),
trash=False).values_list('kill_house__id', flat=True).distinct()
kill_houses = KillHouse.objects.filter(id__in=percentage, trash=False)
serializer = KillHouseSerializer(kill_houses, many=True)
elif 'total-exclude-exclusive-killers' in request.GET:
percentage = KillHousePercentage.objects.filter(kill_house_for_killer__isnull=False,
kill_house__type='exclusive',
kill_house__show_exclusive=True, trash=False).values_list(
'kill_house__id', flat=True).distinct()
kill_houses = KillHouse.objects.filter(trash=False).exclude(id__in=percentage).order_by('id', 'killer')
serializer = distributionKillHouseSerializer(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'exclusive-killers-free-bar' in request.GET:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
percentage = KillHousePercentage.objects.filter(kill_house_for_killer=kill_house,
kill_house__type='exclusive',
kill_house__show_exclusive=True, trash=False).values_list(
'kill_house__id', flat=True)
kill_houses = KillHouse.objects.filter(Q(id__in=percentage) | Q(killer=True, type='public'), trash=False)
serializer = KillHouseSerializer(kill_houses, many=True)
elif 'dispenser' in request.GET:
kill_house = KillHouse.objects.filter(system_address__province=user.province,
out_province=False, trash=False).order_by('id')
serializer = GeneralKillHouseSerializer(kill_house, many=True)
elif 'gate-way-kill-houses' in request.GET:
kill_house = KillHouse.objects.filter(system_address__province=user.province,
out_province=False, trash=False)
serializer = GeneralKillHouseSerializer(kill_house, many=True)
else:
try:
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False).first()
serializer = KillHouseSerializer(kill_house)
except:
kill_house = KillHouse.objects.filter(out_province=False, type='public', trash=False)
serializer = KillHouseSerializer(kill_house, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# تابع برای ویرایش درخواست کشتار ثبت شده از سمت کشتارگاه
def update(self, request, *args, pk=None, **kwargs):
# refresh(request.user.id)
kill_house = KillHouse.objects.filter(
key=request.data['kill_house_key'], trash=False
).select_related('kill_house_operator__user').last()
system_user_profile = SystemUserProfile.objects.get(key=kill_house.kill_house_operator.user.key)
if 'company_gateway_percent' in request.data.keys():
kill_house.company_gateway_percent = request.data['company_gateway_percent']
kill_house.union_gateway_percent = request.data['union_gateway_percent']
kill_house.guilds_gateway_percent = request.data['guilds_gateway_percent']
kill_house.other_gateway_percent = request.data['other_gateway_percent']
kill_house.save()
elif 'quota' in request.data.keys():
kill_house.quota = request.data['quota']
kill_house.governmental_quota = request.data['governmental_quota']
kill_house.quota_max_kill_limit = request.data['quota_max_kill_limit']
kill_house.quota_request = request.data['quota_request']
kill_house.quota_custom = request.data['quota_custom']
kill_house.quota_custom_quantity = request.data['quota_custom_quantity']
kill_house.save()
elif 'maximum_load_volume_increase' in request.data.keys():
kill_house.maximum_load_volume_increase = request.data['maximum_load_volume_increase']
kill_house.maximum_load_volume_reduction = request.data['maximum_load_volume_reduction']
kill_house.save()
elif 'ware_house_remaining_weight_limitation_status' in request.data.keys():
kill_house.ware_house_remaining_weight_limitation_status = request.data[
'ware_house_remaining_weight_limitation_status']
kill_house.ware_house_remaining_weight_limitation = request.data['ware_house_remaining_weight_limitation']
kill_house.ware_house_remaining_percent_limitation_status = request.data[
'ware_house_remaining_percent_limitation_status']
kill_house.ware_house_remaining_percent_limitation = request.data['ware_house_remaining_percent_limitation']
kill_house.save()
elif 'total_kill_capacity' in request.data.keys():
kill_house.max_kill_limit = request.data['max_kill_limit']
kill_house.total_kill_capacity = request.data['total_kill_capacity']
kill_house.extra_bar_kill_percent = request.data['extra_bar_kill_percent']
kill_house.save()
elif 'name' in request.data.keys():
kill_house.name = request.data['name']
kill_house.save()
elif 'active' in request.data.keys():
kill_house.active = request.data['active']
kill_house.save()
elif 'type' in request.data.keys():
kill_house.type = request.data['type']
kill_house.save()
elif 'out_province_selling_limitation' in request.data.keys():
kill_house.out_province_selling_limitation = request.data['out_province_selling_limitation']
kill_house.out_province_selling_limitation_percent = request.data['out_province_selling_limitation_percent']
kill_house.save()
elif 'in_province_selling_limitation' in request.data.keys():
kill_house.in_province_selling_limitation = request.data['in_province_selling_limitation']
kill_house.in_province_selling_limitation_percent = request.data['in_province_selling_limitation_percent']
kill_house.save()
elif 'governmental_selling_permission' in request.data.keys():
kill_house.governmental_selling_permission = request.data['governmental_selling_permission']
kill_house.in_province_governmental_selling_percent = request.data[
'in_province_governmental_selling_percent']
kill_house.out_province_governmental_selling_percent = request.data[
'out_province_governmental_selling_percent']
kill_house.segmentation_governmental_percent = request.data['segmentation_governmental_percent']
kill_house.save()
elif 'free_selling_permission' in request.data.keys():
kill_house.free_selling_permission = request.data['free_selling_permission']
kill_house.in_province_free_selling_percent = request.data['in_province_free_selling_percent']
kill_house.out_province_free_selling_percent = request.data['out_province_free_selling_percent']
kill_house.segmentation_free_selling_percent = request.data['segmentation_free_selling_percent']
kill_house.save()
elif 'ware_house_remaining_weight_archive_percent':
kill_house.ware_house_remaining_weight_archive_percent = request.data[
'ware_house_remaining_weight_archive_percent']
kill_house.save()
else:
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.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()
return Response({"result": "باموفقیت ویرایش شد"}, status=status.HTTP_200_OK)
# ویوست مربوط به ثبت کشتارگاه
class PosKillHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = PosKillHouseSerializer
permission_classes = [AllowAny]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__fullname',
'kill_house_operator__user__mobile',
'system_address__city__name',
]
def list(self, request, *args, **kwargs):
pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False)
if pos.kill_house:
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id').exclude(
id=pos.kill_house.id)
else:
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
if 'search' in request.GET:
if request.GET['search'] == 'filter':
kill_houses_list = []
if request.GET['value'] != "":
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (self.filterset_class(
data=query,
queryset=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_houses_list = ps.filter()
kill_houses = [] if len(kill_houses_list) == 0 else kill_houses_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(kill_houses)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseAllowVetViewSet(viewsets.ModelViewSet):
queryset = KillHouseAllowVet.objects.all()
serializer_class = KillHouseAllowVetSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به ثبت کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_operator = KillHouseOperator.objects.get(user=user)
kill_houses = KillHouse.objects.filter(kill_house_operator=kill_house_operator)
kill_house_allow_vets = KillHouseAllowVet.objects.filter(kill_house__in=kill_houses)
allow = request.data['allow']
if kill_house_allow_vets.count() > 0:
for kill_house_allow_vet in kill_house_allow_vets:
kill_house_allow_vet.allow = allow
kill_house_allow_vet.save()
else:
for kill_house in kill_houses:
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
allow = serializer.create(validated_data=request.data)
allow.kill_house = kill_house
allow.save()
return Response({"result": "created"}, status=status.HTTP_201_CREATED)
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_operator = KillHouseOperator.objects.get(user=user)
kill_houses = KillHouse.objects.filter(kill_house_operator=kill_house_operator)
kill_house_allow_vet = KillHouseAllowVet.objects.filter(kill_house__in=kill_houses)
serializer = KillHouseAllowVetSerializer(kill_house_allow_vet, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHousePercentageViewSet(viewsets.ModelViewSet):
queryset = KillHousePercentage.objects.all()
serializer_class = KillHousePercentageSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
percents = []
user_profile = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(system_address__province=user_profile.province, trash=False)
if kill_house:
percents = KillHousePercentage.objects.filter(kill_house__in=kill_house).order_by('-percent')
serializer = KillHousePercentageSerializer(percents, 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)
if 'percentage_list' in request.data.keys():
kill_house_percentage_lists = request.data['percentage_list']
request.data.pop('percentage_list')
if request.data['type'] == 'manual':
for kill_house_percentage_list in kill_house_percentage_lists:
kill_house_percentage = KillHousePercentage.objects.get(key=kill_house_percentage_list["key"],
trash=False)
kill_house_percentage.percent = kill_house_percentage_list["percent"]
if 'killer_kill_house_key' in kill_house_percentage_list.keys():
if kill_house_percentage_list['killer_kill_house_key'] != None:
kill_house_percentage.kill_house_for_killer = KillHouse.objects.get(
key=kill_house_percentage_list['killer_kill_house_key'], trash=False)
kill_house_percentage.save()
else:
guilds = Guilds.objects.filter(kill_house_centers_allocation__isnull=False, trash=False)
total_count = len(guilds)
total_weight = guilds.aggregate(total_quantity=Sum('allocation_limit')).get('total_quantity', 0)
if total_count == 0:
return Response({"result": "صنفی وجود ندارد برای کشتارگاه ها و کشتارکن ها"},
status=status.HTTP_403_FORBIDDEN)
if request.data['type'] == 'guilds_weight':
for kill_house_percentage_list in kill_house_percentage_lists:
kill_house_percentage = KillHousePercentage.objects.get(key=kill_house_percentage_list["key"],
trash=False)
kill_house_percentage_weight = 0
for guild in guilds:
if len(guild.kill_house_centers_allocation) == 0 or guild.kill_house_centers_allocation == None:
continue
if guild.kill_house_centers_allocation[0]['value'] == str(
kill_house_percentage.kill_house.key):
kill_house_percentage_weight += guild.allocation_limit
kill_house_percentage.percent = round((kill_house_percentage_weight / total_weight) * 100, 2)
kill_house_percentage.guilds_weight = kill_house_percentage_weight
kill_house_percentage.last_guilds_update_date = str(datetime.now())
kill_house_percentage.save()
else:
for kill_house_percentage_list in kill_house_percentage_lists:
kill_house_percentage = KillHousePercentage.objects.get(key=kill_house_percentage_list["key"],
trash=False)
kill_house_percentage_counter = 0
for guild in guilds:
if len(guild.kill_house_centers_allocation) == 0 or guild.kill_house_centers_allocation == None:
continue
if guild.kill_house_centers_allocation[0]['value'] == str(
kill_house_percentage.kill_house.key):
kill_house_percentage_counter += 1
kill_house_percentage.percent = round((kill_house_percentage_counter / total_count) * 100, 2)
kill_house_percentage.guilds_quantity = kill_house_percentage_counter
kill_house_percentage.last_guilds_update_date = str(datetime.now())
kill_house_percentage.save()
elif 'percentage_key' in request.data.keys():
percentage = KillHousePercentage.objects.get(key=request.data['percentage_key'])
if 'identity' in request.data.keys():
kill_house = KillHouse.objects.get(key=percentage.kill_house.key)
if kill_house.killer == False:
if request.data['identity'] == 'Killer':
previous_state = kill_house.killer
if KillHousePercentage.objects.filter(
kill_house_for_killer=kill_house).exists():
return Response({
"result": "این کشتارگاه توسط چندین کشتارکن رزرو شده است و امکان تغییر ماهیت وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if KillRequest.objects.filter(remain_quantity__gt=0, slaughter_house=kill_house,
trash=False).exists():
return Response({
"result": "این کشتارگاه توسط چندین کشتارکن در قسمت اعلام نیاز کشتارگاه رزرو شده است و امکان تغییر ماهیت وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
kill_house.killer = True
kill_house.save()
new_state = kill_house.killer
percentage.change_data = {
"previous_killer_state": previous_state,
"new_killer_state": new_state,
"type": kill_house.type,
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now()),
"kill_house": percentage.kill_house_for_killer.name if percentage.kill_house_for_killer != None else None,
}
percentage.save()
else:
if request.data['identity'] == 'KillHouse':
previous_state = kill_house.killer
kill_house.killer = False
kill_house.save()
new_state = kill_house.killer
percentage.kill_house_for_killer = None
percentage.change_data = {
"previous_killer_state": previous_state,
"new_killer_state": new_state,
"type": kill_house.type,
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now()),
"kill_house": percentage.kill_house_for_killer.name if percentage.kill_house_for_killer != None else None,
}
percentage.save()
else:
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'])
percentage.kill_house_for_killer = kill_house
if percentage.change_data:
percentage.change_data["kill_house"] = kill_house.name
percentage.change_data["date"] = str(datetime.now())
percentage.save()
return Response({"result": "با موفقیت ویرایش شد."}, status=status.HTTP_200_OK)
# ویوست مربوط به اضافه کردن خودرو به کشتارگاه
class KillHouseDriverViewSet(viewsets.ModelViewSet):
queryset = KillHouseDriver.objects.all()
serializer_class = KillHouseDriverSerializer
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseDriverFilterSet
filterset_fields = [
'health_code',
'user__mobile',
'user__national_id',
'user__base_order',
]
# تابع مربوط به اضافه کردن خودرو به کشتارگاه
def create(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.data['role']
request.data.pop('role')
# refresh(request.user.id)
kill_house = None
if 'kill_house_key' in request.data.keys():
if request.data['kill_house_key'] != None:
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'])
request.data.pop('kill_house_key')
if role == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False)
# if not ProvinceAllowKillHouseRegisterCar.objects.filter(
# kill_house__in=kill_house, allow=True).exists():
# return Response({"result": "شما اجازه ساخت ماشین ندارید"}, status=status.HTTP_403_FORBIDDEN)
person = SystemUserProfile.objects.get(user=request.user)
group = Group.objects.get(name__exact="Driver")
city = City.objects.get(name=request.data['city_name'])
province = Province.objects.get(key=user.province.key)
request.data.pop('city_name')
# request.data.pop('province_name')
if KillHouseDriver.objects.filter(pelak=request.data['pelak'], trash=False).exists():
return Response({"result": "این ماشین قبلا ثبت شده!"}, status=status.HTTP_403_FORBIDDEN)
system_profile = SystemUserProfile.objects.filter(mobile=request.data['driver_mobile'], trash=False)
if system_profile.count() > 0:
system_profile = system_profile.last()
if group not in system_profile.role.all():
system_profile.role.add(group)
else:
password = "00100"
data = {
"username": request.data['driver_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['driver_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['driver_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,
city=city,
province=province
)
system_profile.save()
system_profile.role.add(group)
else:
return Response({"result": "در ثبت کاربر مشکلی پیش آمده است!"}, status=status.HTTP_403_FORBIDDEN)
wallet = Wallet()
wallet.save()
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
full_name = request.data['first_name'] + " " + request.data['last_name']
request.data.pop('first_name')
request.data.pop('last_name')
kill_house_driver = serializer.create(validated_data=request.data)
kill_house_driver.user = system_profile
kill_house_driver.wallet = wallet
kill_house_driver.registrar = {
"role": role,
"full_name": person.fullname,
"mobile": person.mobile,
"date": str(kill_house_driver.create_date)
}
kill_house_driver.driver_name = full_name
kill_house_driver.save()
if kill_house != None:
if KillHouseADDCAR.objects.filter(kill_house__in=kill_house, driver=kill_house_driver,
trash=False).exists():
return Response({"result": "این ماشین قبلا برای کشتارگاه ثبت شده!"},
status=status.HTTP_403_FORBIDDEN)
else:
add_car = KillHouseADDCAR(
kill_house=kill_house.last(),
driver=kill_house_driver
)
add_car.save()
else:
if kill_house_driver.type == 'rental':
# kill_houses = KillHouse.objects.filter(trash=False)
# for kill_house in kill_houses:
add_car = KillHouseADDCAR(
# kill_house=kill_house,
driver=kill_house_driver
)
add_car.save()
return Response({"result": "ماشین با موفقیت ثبت شد."}, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
def list(self, request, *args, **kwargs):
if 'role' in request.GET:
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
list_car = []
if 'health_code' in request.GET:
for item in self.filterset_fields:
query = QueryDict('{0}={1}'.format(item, request.GET['health_code']))
if (self.filterset_class(
data=query,
queryset=self.queryset.filter(trash=False)
)
).filter():
ps = self.filterset_class(data=query, queryset=self.queryset)
filtered_kill_house_driver = ps.filter()
serializer = self.serializer_class(filtered_kill_house_driver, many=True)
return Response(serializer.data)
return Response(list_car)
# cars = KillHouseDriver.objects.filter(health_code=request.GET['health_code'],
# trash=False)
# if cars.count() > 0:
# cars = cars.last()
# dict1 = {
# "id": cars.id,
# "key": cars.key,
# "driver_name": cars.driver_name,
# "driver_mobile": cars.driver_mobile,
# "type_car": cars.type_car,
# "pelak": cars.pelak,
# "capocity": float(cars.capocity),
# "weight_without_load": cars.weight_without_load,
# "health_code": cars.health_code,
# }
# list_car.append(dict1)
# return Response(list_car, status=status.HTTP_200_OK)
else:
if request.GET['role'] == 'KillHouse':
kill_house_drivers = KillHouseDriver.objects.filter(user__province=user.province, type='rental',
archive=False)
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False).first()
add_car = KillHouseADDCAR.objects.filter(kill_house=kill_house, trash=False,
archive=False).order_by('id')
if add_car.count() > 0:
kill_house_list = []
for add_car_obj in add_car:
allow = ProvinceAllowKillHouseRegisterCar.objects.filter(
kill_house=add_car_obj.kill_house)
if allow.count() > 0:
allow_state = allow.last().allow
else:
allow_state = None
kill_house_name = add_car_obj.kill_house.name
kill_house_key = add_car_obj.kill_house.key
kill_house_dict = {"kill_house_name": kill_house_name, "kill_house_key": kill_house_key,
"allow_state": allow_state}
if not any(d["kill_house_name"] == kill_house_name for d in kill_house_list):
kill_house_list.append(kill_house_dict)
dict1 = {
"id": add_car_obj.driver.id,
"key": add_car_obj.driver.key,
"add_car_key": add_car_obj.key,
"driver_name": add_car_obj.driver.driver_name,
"driver_type": add_car_obj.driver.type,
"driver_active_state": add_car_obj.driver.active_state,
"add_car_active_state": add_car_obj.active_state,
"first_name": add_car_obj.driver.user.first_name,
"last_name": add_car_obj.driver.user.last_name,
"city": add_car_obj.driver.user.city.name,
"driver_mobile": add_car_obj.driver.driver_mobile,
"kill_house_list": kill_house_list,
"type_car": add_car_obj.driver.type_car,
"type": add_car_obj.driver.type,
"pelak": add_car_obj.driver.pelak,
"capocity": float(add_car_obj.driver.capocity),
"weight_without_load": add_car_obj.driver.weight_without_load,
"health_code": add_car_obj.driver.health_code,
}
list_car.append(dict1)
if kill_house_drivers:
for kill_house_driver in kill_house_drivers:
dict2 = {
"id": kill_house_driver.id,
"key": kill_house_driver.key,
"add_car_key": None,
"add_car_active_state": kill_house_driver.active_state,
"driver_name": kill_house_driver.driver_name,
"driver_type": kill_house_driver.type,
"driver_active_state": kill_house_driver.active_state,
"first_name": kill_house_driver.user.first_name,
"last_name": kill_house_driver.user.last_name,
"city": kill_house_driver.user.city.name,
"driver_mobile": kill_house_driver.driver_mobile,
"kill_house_list": [],
"type_car": kill_house_driver.type_car,
"type": kill_house_driver.type,
"pelak": kill_house_driver.pelak,
"capocity": float(kill_house_driver.capocity),
"weight_without_load": kill_house_driver.weight_without_load,
"health_code": kill_house_driver.health_code,
}
list_car.append(dict2)
return Response(list_car, status=status.HTTP_200_OK)
else:
list_car = []
cars = KillHouseDriver.objects.filter(user__province=user.province, trash=False,
archive=False).order_by('id') \
.select_related('user')
if cars.count() > 0:
for car in cars:
add_car = KillHouseADDCAR.objects.filter(driver=car, trash=False,
archive=False).select_related(
'kill_house')
if add_car.count() > 0:
kill_house_list = []
for add_car_obj in add_car:
if add_car_obj.kill_house != None:
allow = ProvinceAllowKillHouseRegisterCar.objects.filter(
kill_house=add_car_obj.kill_house)
if allow.count() > 0:
allow_state = allow.last().allow
else:
allow_state = None
kill_house_name = add_car_obj.kill_house.name
kill_house_key = add_car_obj.kill_house.key
kill_house_dict = {"kill_house_name": kill_house_name,
"kill_house_key": kill_house_key, "allow_state": allow_state}
if not any(d["kill_house_name"] == kill_house_name for d in kill_house_list):
kill_house_list.append(kill_house_dict)
dict1 = {
"id": car.id,
"key": car.key,
"add_car_key": None,
"driver_name": car.driver_name,
"driver_type": car.type,
"driver_active_state": car.active_state,
"type": car.type,
"first_name": car.user.first_name,
"last_name": car.user.last_name,
"city": car.user.city.name,
"driver_mobile": car.driver_mobile,
"kill_house_list": kill_house_list,
"type_car": car.type_car,
"pelak": car.pelak,
"capocity": float(car.capocity),
"weight_without_load": car.weight_without_load,
"health_code": car.health_code,
}
list_car.append(dict1)
else:
dict1 = {
"id": car.id,
"type": car.type,
"add_car_key": None,
"key": car.key,
"driver_type": car.type,
"driver_name": car.driver_name,
"driver_active_state": car.active_state,
"first_name": car.user.first_name,
"last_name": car.user.last_name,
"city": car.user.city.name,
"driver_mobile": car.driver_mobile,
"kill_house_list": [],
"type_car": car.type_car,
"pelak": car.pelak,
"capocity": float(car.capocity),
"weight_without_load": car.weight_without_load,
"health_code": car.health_code,
}
list_car.append(dict1)
return Response(list_car, status=status.HTTP_200_OK)
else:
return Response(list_car, status=status.HTTP_200_OK)
else:
return Response([], status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
if 'change_activation' in request.data.keys():
car = KillHouseDriver.objects.get(key=request.data["driver_key"])
add_cars = KillHouseADDCAR.objects.filter(driver=car, trash=False)
for add_car in add_cars:
add_car.active_state = request.data['change_activation']
add_car.save()
car.active_state = request.data['change_activation']
car.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
elif 'add_car_change_activation' in request.data.keys():
add_car = KillHouseADDCAR.objects.get(key=request.data["add_car_key"], trash=False)
add_car.active_state = request.data['add_car_change_activation']
add_car.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
else:
car = KillHouseDriver.objects.get(key=request.data["driver_key"])
if 'city_name' in request.data.keys() and request.data['city_name'] != None:
city = City.objects.get(name=request.data['city_name'])
else:
city = None
request.data.pop('city_name')
user = SystemUserProfile.objects.get(key=car.user.key)
request.data.pop('driver_key')
first_name = request.data['first_name']
last_name = request.data['last_name']
request.data.pop('first_name')
request.data.pop('last_name')
if first_name != None:
user.first_name = first_name
if last_name != None:
user.last_name = last_name
if city != None:
user.city = city
if first_name != None and last_name != None:
car.driver_name = first_name + "" + last_name
user.fullname = first_name + "" + last_name
# serializer = self.serializer_class(car)
user.save()
car.save()
serializer = self.serializer_class(car)
serializer.update(instance=car, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
car = KillHouseDriver.objects.get(key=request.GET["key"])
if KillHouseRequest.objects.filter(active_state='active', add_car__driver=car, trash=False).exists():
return Response({"result": "ماشین دارای بار فعال میباشد"}, status=status.HTTP_403_FORBIDDEN)
kill_house_cars = KillHouseADDCAR.objects.filter(driver=car, trash=False)
if kill_house_cars:
for add_car in kill_house_cars:
add_car.trash = True
add_car.save()
car.trash = True
car.save()
return Response('ماشین با موفقیت حذف شد', status=status.HTTP_200_OK)
class KillHouseDriverTotalDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouseDriver.objects.all()
serializer_class = KillHouseDriverSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
if request.GET['role'] == 'KillHouse':
user = SystemUserProfile.objects.get(trash=False, user=request.user)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
kill_house_drivers = KillHouseDriver.objects.filter(archive=False, pk__in=KillHouseADDCAR.objects.filter(
Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
archive=False).values_list(
'driver__id', flat=True), trash=False)
active = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter(
Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
active_state=True, archive=False).values_list('driver__id', flat=True))
inactive = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter(
Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
active_state=False, archive=False).values_list('driver__id', flat=True))
suspended = 0
else:
kill_house_drivers = KillHouseDriver.objects.filter(trash=False, archive=False)
active = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter(
Q(kill_house__isnull=False) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
active_state=True, archive=False).values_list('driver__id', flat=True))
inactive = kill_house_drivers.filter(pk__in=KillHouseADDCAR.objects.filter(
Q(kill_house__isnull=False) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
active_state=False, archive=False).values_list('driver__id', flat=True))
suspended = kill_house_drivers.exclude(pk__in=KillHouseADDCAR.objects.filter(
Q(kill_house__isnull=False) | Q(kill_house__isnull=True, driver__type='rental'),
trash=False, archive=False).values_list('driver__id', flat=True))
suspended = len(suspended)
rental = kill_house_drivers.filter(type='rental')
exclusive = kill_house_drivers.filter(type='exclusive')
result = {
"total": len(kill_house_drivers),
"exclusive": len(exclusive),
"rental": len(rental),
"active": len(active),
"inactive": len(inactive),
"suspended": suspended,
}
return Response(result, status=status.HTTP_200_OK)
# ویوست مربوط به اضافه کردن خودرو به کشتارگاه
class KillHouseADDCARViewSet(viewsets.ModelViewSet):
queryset = KillHouseADDCAR.objects.all()
serializer_class = KillHouseADDCARSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به اضافه کردن خودرو به کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False)
driver = KillHouseDriver.objects.get(key=request.data['driver_key'])
request.data.pop('driver_key')
request.data.pop('kill_house_key')
if 'role' in request.data.keys():
request.data.pop('role')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
if KillHouseADDCAR.objects.filter(kill_house=kill_house, driver=driver, trash=False):
return Response({"result": "already exist"}, status=status.HTTP_403_FORBIDDEN)
kill_house_car = serializer.create(validated_data=request.data)
kill_house_car.kill_house = kill_house
kill_house_car.driver = driver
kill_house_car.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 'kill_request_key' in request.GET:
kill_request = KillRequest.objects.get(key=request.GET['kill_request_key'])
list_car = []
if 'key' in request.GET:
poultry_request = PoultryRequest.objects.get(key=request.GET['key'])
else:
poultry_request = None
if 'kill_house_key' in request.GET:
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False)
if kill_house.killer == True:
if KillHouseADDCAR.objects.filter(kill_house=kill_house, trash=False, archive=False).exists():
cars = KillHouseADDCAR.objects.filter(
Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'),
trash=False, archive=False).order_by('driver__type')
else:
killer_kill_house = KillHouse.objects.get(key=kill_request.slaughter_house.key)
cars = KillHouseADDCAR.objects.filter(
Q(kill_house=killer_kill_house) | Q(kill_house__isnull=True, driver__type='rental'),
trash=False, archive=False).order_by('driver__type')
else:
cars = KillHouseADDCAR.objects.filter(
Q(kill_house=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
archive=False).order_by(
'driver__type')
else:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False)
cars = KillHouseADDCAR.objects.filter(
Q(kill_house__in=kill_house) | Q(kill_house__isnull=True, driver__type='rental'), trash=False,
archive=False).order_by(
'driver__type')
# if poultry_request != None:
# send_date = poultry_request.send_date.date()
# list1 = []
# kill_house_requests = KillHouseRequest.objects.filter(active_state='active')
# for kill_house_request in kill_house_requests:
# if kill_house_request.province_kill_request != None:
# date = kill_house_request.province_request.city_request_Poultry.poultry_request.send_date.date()
# if send_date.year == date.year and send_date.month == date.month and send_date.day == date.day:
# list1.append(kill_house_request)
# else:
# date2 = kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date.date()
# if send_date.year == date2.year and send_date.month == date2.month and send_date.day == date2.day:
# list1.append(kill_house_request)
# if len(list1) > 0:
# for kill_house_car in cars:
# list2 = []
# i = 0
# for request_car in list1:
# if i == len(list1):
# break
# if kill_house_car.driver.pelak == request_car.add_car.driver.pelak:
# dict1 = {
# "id": kill_house_car.id,
# "key": kill_house_car.key,
# "driver_name": kill_house_car.driver.driver_name,
# "driver_mobile": kill_house_car.driver.driver_mobile,
# "type_car": kill_house_car.driver.type_car,
# "pelak": kill_house_car.driver.pelak,
# "capocity": float(kill_house_car.driver.capocity),
# "weight_without_load": kill_house_car.driver.weight_without_load,
# "health_code": kill_house_car.driver.health_code,
# "busy": True
# }
# list2.append(dict1)
# i += 1
# if len(list2) > 0:
# list_car.append(list2[0])
# else:
# dict1 = {
# "id": kill_house_car.id,
# "key": kill_house_car.key,
# "driver_name": kill_house_car.driver.driver_name,
# "driver_mobile": kill_house_car.driver.driver_mobile,
# "type_car": kill_house_car.driver.type_car,
# "pelak": kill_house_car.driver.pelak,
# "capocity": float(kill_house_car.driver.capocity),
# "weight_without_load": kill_house_car.driver.weight_without_load,
# "health_code": kill_house_car.driver.health_code,
# "busy": False
# }
# list_car.append(dict1)
# return Response(list_car, status=status.HTTP_200_OK)
for car in cars:
if car.active_state == True:
dict1 = {
"id": car.id,
"key": car.key,
"type": car.driver.type,
"driver_name": car.driver.driver_name,
"driver_mobile": car.driver.driver_mobile,
"type_car": car.driver.type_car,
"pelak": car.driver.pelak,
"capocity": float(car.driver.capocity),
"weight_without_load": car.driver.weight_without_load,
"health_code": car.driver.health_code,
}
list_car.append(dict1)
return Response(list_car, status=status.HTTP_200_OK)
# تابع مربوط به حذف خودروهای ثبت شده کشتارگاه
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
car = KillHouseDriver.objects.get(key=request.GET["driver_key"])
kill_house = KillHouse.objects.get(key=request.GET["kill_house_key"])
if KillHouseRequest.objects.filter(active_state='active', add_car__driver=car, trash=False).exists():
return Response({"result": "ماشین دارای بار فعال میباشد"}, status=status.HTTP_403_FORBIDDEN)
add_car = KillHouseADDCAR.objects.filter(driver=car, kill_house=kill_house, trash=False)
if add_car.count() > 0:
add_car = add_car.last()
add_car.trash = True
add_car.save()
return Response('ماشین با موفقیت حذف شد', status=status.HTTP_200_OK)
else:
return Response('مشکلی در حذف ماشین به وجود آمده است !', status=status.HTTP_403_FORBIDDEN)
def update(self, request, pk=None, *args, **kwargs):
car = KillHouseADDCAR.objects.get(key=request.data["add_car_key"])
request.data.pop('add_car_key')
serializer = self.serializer_class(car)
serializer.update(instance=car, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class AutomaticKillRequestViewSet(viewsets.ModelViewSet):
queryset = AutomaticKillRequest.objects.all()
serializer_class = AutomaticKillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
# def create(self, request, *args, **kwargs):
# # refresh(request.user.id)
# state = request.data['active']
# auomatic_kill_reqs = AutomaticKillRequest.objects.all()
# if auomatic_kill_reqs.count() > 0:
# auomatic_kill_reqs = auomatic_kill_reqs.last()
# auomatic_kill_reqs.active = state
# auomatic_kill_reqs.save()
# serializer_request = self.serializer_class(auomatic_kill_reqs)
# return Response(serializer_request.data, status=status.HTTP_200_OK)
# else:
# serializer = self.serializer_class(data=request.data)
# if serializer.is_valid():
# auomatic_kill_reqs = serializer.create(validated_data=request.data)
#
# serializer_request = self.serializer_class(auomatic_kill_reqs)
# return Response(serializer_request.data, status=status.HTTP_201_CREATED)
def create(self, request, *args, **kwargs):
try:
automatic_kill_req = AutomaticKillRequest.objects.latest('id')
except AutomaticKillRequest.DoesNotExist:
automatic_kill_req = None
serializer = self.serializer_class(automatic_kill_req, data=request.data)
if serializer.is_valid():
if automatic_kill_req:
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
else:
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors)
class KillRequestForPoultryViewSet(viewsets.ModelViewSet):
queryset = KillRequest.objects.all()
serializer_class = KillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def update(self, request, pk=None, *args, **kwargs):
kill_req = KillRequest.objects.get(key=request.data['kill_req_key'], trash=False)
kill_req.remain_quantity_for_poultry += int(request.data['quantity_sum'])
kill_req.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
class DeleteDebtorsKillRequestsViewSet(viewsets.ModelViewSet):
queryset = KillRequest.objects.all()
serializer_class = KillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def destroy(self, request, pk=None, *args, **kwargs):
today = datetime.now().date()
kill_requests = KillRequest.objects.filter(trash=False, recive_date__date=today, market=False)
for kill_request in kill_requests:
kill_house = kill_request.kill_house
kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True,
kill_house=kill_house).first()
if kill_house_purchase:
total_unpaid_wage = 0
total_paid_wage = 0
total_unpaid_wage = get_finance_info(kill_house)['total_price']
slaughter_transactions = InternalTransaction.objects.filter(
Q(kill_house=kill_house) | Q(parent_kill_house=kill_house),
status='completed',
trash=False)
total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
total_amount = total_unpaid_wage - total_paid_wage
if total_amount >= kill_house_purchase.limitation_number:
if not ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
kill_request__recive_date__date=today,
killhouse_user=kill_house).exists():
kill_request.message = 'به علت بدهی اعلام نیاز حذف گردید'
kill_request.trash = True
kill_request.save()
return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK)
# ویوست مربوط به ثبت درخواست کشتار از سمت کشتارگاه
class KillRequestViewSet(viewsets.ModelViewSet):
queryset = KillRequest.objects.all()
serializer_class = KillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillRequestFilterSet
filterset_fields = [
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__first_name',
'kill_house__kill_house_operator__user__last_name',
'kill_house__kill_house_operator__user__mobile',
'kill_house__name',
'slaughter_house__name',
'export_country',
'export_code',
'direct_buying_code',
'poultry__user__fullname',
'poultry__user__mobile',
'poultry__unit_name',
]
# تابع مربوط به ثبت درخواست کشتار از سمت کشتارگاه
def create(self, request, *args, **kwargs):
total_unpaid_wage = 0
total_paid_wage = 0
limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter(
trash=False, active=True).first()
is_in_limitation_range = False
if limitation_direct_purchase:
if not limitation_direct_purchase.allow_buying:
is_in_limitation_range = False
else:
if limitation_direct_purchase.start_time and limitation_direct_purchase.end_time:
current_time = datetime.now().time()
if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time:
is_in_limitation_range = True
if not is_in_limitation_range:
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") == "kill_request" and t.get("active", False)),
None)
if time:
start_hour = datetime.strptime(time.get("start", 0), "%H:%M:%S").time()
end_hour = datetime.strptime(time.get("end", 0), "%H:%M:%S").time()
current_hour = datetime.now().time().replace(second=0, microsecond=0)
if not (start_hour < current_hour < end_hour):
return Response(
{"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"},
status=status.HTTP_403_FORBIDDEN)
if 'role' in request.data.keys() and request.data['role'] != None:
role = request.data['role']
request.data.pop('role')
else:
role = None
if role != None and role == 'KillHouse':
now_request_date = datetime.now().date()
now = datetime.now().time()
now_hour = KillHouseHourLimit.objects.filter(trash=False).last()
if now_hour and 'poultry_key' not in request.data.keys():
if now_hour.active == True:
request_date = datetime.strptime(request.data['recive_date'], '%Y-%m-%d %H:%M:%S').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)
killer_kill_house = None
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False)
request.data.pop('kill_house_key')
if kill_house.out_province == True:
return Response({
"result": "امکان ثبت اعلام نیاز برای کشتارگاه خارج از استان وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first()
if kill_house_purchase:
if kill_house_purchase.allow == False:
return Response({
"result": "شما مجاز به ثبت درخواست خرید نمیباشید جهت اطلاع با اتحادیه مرغ گوشتی استان خود تماس حاصل فرمایید"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house_purchase.limitation == True:
try:
recive_date = datetime.strptime(str(request.data['recive_date']),
'%Y-%m-%dT%H:%M:%S.%fZ').date()
except:
recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%d %H:%M:%S').date()
total_unpaid_wage = get_finance_info(kill_house)['total_price']
slaughter_transactions = InternalTransaction.objects.filter(
kill_house=kill_house, status='completed',
trash=False)
total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
if kill_house_purchase.limitation_number <= total_unpaid_wage - total_paid_wage:
if not ProvinceKillRequest.objects.filter(killhouse_user=kill_house,
kill_request__recive_date__date=recive_date,
trash=False,
state__in=('pending', 'accepted')).exists():
return Response({
"result": "به علت بدهی امکان ثبت درخواست وحود ندارد لطفا بدهی خود را در پنل کارمزد ها تسویه کنید"},
status=status.HTTP_403_FORBIDDEN)
if kill_house.poultry_payment_limitation:
today_check_date = datetime.now().date()
if ProvinceKillRequest.objects.filter(Q(payment_deadline_date__date__lt=today_check_date,
extension_payment_deadline_date__isnull=True) | Q(
payment_deadline_date__date__lt=today_check_date,
extension_payment_deadline_date__date__lt=today_check_date), trash=False, temporary_trash=False,
return_to_province=False,
state__in=('pending', 'accepted'), payment_deadline_archive=False,
payment_deadline_state__in=('pending', 'rejected')).exists():
return Response({
"result": "به دلیل عدم تسویه با مرغدار شما مجاز به خرید نمی باشید لطفا اطلاعات پرداخت را در بخش تسویه حساب بارگزاری کنید!"},
status=status.HTTP_403_FORBIDDEN)
if 'killer_kill_house_key' in request.data.keys():
if request.data['killer_kill_house_key'] != None:
killer_kill_house = KillHouse.objects.get(key=request.data['killer_kill_house_key'], trash=False)
request.data.pop('killer_kill_house_key')
else:
request.data.pop('killer_kill_house_key')
cash = request.data['cash']
credit = request.data['credit']
low_weight = request.data['low_weight']
high_weight = request.data['high_weight']
credit = request.data['credit']
request.data.pop('cash')
request.data.pop('credit')
request.data.pop('low_weight')
request.data.pop('high_weight')
poultry = None
hatching = None
if 'poultry_key' in request.data.keys():
poultry = Poultry.objects.get(key=request.data['poultry_key'])
hatching = PoultryHatching.objects.get(key=request.data['hatching_key'])
request.data.pop('poultry_key')
request.data.pop('hatching_key')
if poultry.order_limit:
return Response({
"result": "امکان ثبت کشتار برای مرغدار وجود ندارد جهت اطلاعات بیشتر بااتحادیه استان خود هماهنگ کنید!"},
status=status.HTTP_403_FORBIDDEN)
if 'confirm_poultry_mobile' in request.data.keys() and len(request.data['confirm_poultry_mobile']) == 11:
first_mobile_number = poultry.user.mobile
second_mobile_number = request.data['confirm_poultry_mobile']
request.data.pop('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()
try:
recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%dT%H:%M:%S.%fZ').date()
except:
recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%d %H:%M:%S').date()
if request.data['free_direct_buying'] == True:
if kill_house.quota:
kill_house_info = calculate_governmental_quota(kill_house)
if kill_house_info == 'not_allowed':
return Response({"result": " امکان خرید آزاد تا تکمیل تعهد دولتی وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
age_range = ChickenAgeRange.objects.filter(trash=False).first()
if role and role not in ('AdminX', 'SuperAdmin'):
if age_range.active == True:
chicken_age = (datetime.now().date() - 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 kill_house.max_kill_limit and kill_house.total_kill_capacity > 0:
recive_date = datetime.strptime(str(request.data['recive_date']), '%Y-%m-%dT%H:%M:%S.%fZ').date()
if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0:
total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False,
return_to_province=False,
archive_wage=False,
state__in=('pending', 'accepted'),
killhouse_user=kill_house,
kill_request__recive_date__date=recive_date)
total_province_kill_requests_quantity = \
total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0
if kill_house.total_kill_capacity < total_province_kill_requests_quantity + int(
request.data['kill_capacity']):
return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
dict1 = {}
dict2 = {}
if kill_house.ware_house_remaining_weight_limitation_status:
if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation:
return Response({
"result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده انبار بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
if kill_house.ware_house_remaining_percent_limitation_status:
if not check_kill_house_remain_limitation_weight(kill_house):
return Response({
"result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده روزانه انبار بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_request = serializer.create(validated_data=request.data)
buying_verification = DirectBuyingVerification.objects.filter(trash=False).first()
price_confirmation = PriceConfirmation.objects.filter(trash=False).first()
price_confirmation = price_confirmation.poultry_status if price_confirmation else False
kill_request.kill_house = kill_house
free_sale_in_province = False if kill_request.free_direct_buying == False else True
kill_request.previous_kill_capacity = kill_request.kill_capacity
if poultry != None:
# hatching = PoultryHatching.objects.filter(trash=False, poultry=poultry).only('chicken_breed').first()
if 'payment_deadline_days' in request.data.keys():
kill_request.payment_deadline_date = datetime.now() + timedelta(
days=request.data['payment_deadline_days'])
kill_request.payment_deadline = True
kill_request.chicken_breed = hatching.chicken_breed
province_operator = SystemUserProfile.objects.filter(trash=False, role__name='ProvinceOperator').first()
kill_request.poultry = poultry
kill_request.poultry_hatching = hatching
mobile = poultry.user.mobile
poultry_name = poultry.user.fullname
code = str(random.randint(10000, 99000))
kill_request.direct_buying_code = code
buyer = kill_request.kill_house.kill_house_operator.user.fullname
buyer_mobile = kill_request.kill_house.kill_house_operator.user.mobile
quantity = kill_request.kill_capacity
kill_place = kill_request.slaughter_house.name if kill_request.slaughter_house != None else kill_request.kill_house.name
date_str = str(kill_request.recive_date)
# if kill_request.recive_date.date().day == datetime.now().date().day:
try:
date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S.%f%z').date()
except:
date = 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 kill_request.export_status == False:
pass
# sms_direct_buying_sms = threading.Thread(
# target=direct_buying_code_sms,
# args=(
# mobile, buyer, buyer_mobile, quantity, kill_place, date, code))
# sms_direct_buying_sms.start()
else:
export_country = kill_request.export_country
sms_export_sms = threading.Thread(
target=export_code_sms,
args=(
mobile, buyer, buyer_mobile, quantity, kill_place, date, export_country,
code, poultry_name, province_operator.mobile))
sms_export_sms.start()
# kill_request.remain_quantity_for_poultry = kill_request.kill_capacity
if killer_kill_house != None:
kill_request.slaughter_house = killer_kill_house
kill_request.remain_quantity = kill_request.kill_capacity
dict1.update({
'cash': cash,
'credit': credit
})
kill_request.buy_type = dict1
dict2.update({
'low_weight': low_weight,
'high_weight': high_weight
})
kill_request.weight_type = dict2
if role != None:
kill_request.registrar = {
"role": role,
"full_name": user.fullname,
"date": str(kill_request.create_date)
}
kill_request.save()
permission_duirect_buying = AutomaticDirectBuyingPermission.objects.first()
if role == 'KillHouse':
if kill_request.poultry is None:
if SmsLicense.objects.filter(kill_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()
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
date_str = kill_request.recive_date
try:
send_date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S.%f%z').date()
except:
send_date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date()
# send_date = 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)
province = kill_request.kill_house.system_address.province.name
city = kill_request.kill_house.system_address.city.name
kill_house_name = kill_request.kill_house.name
province_operator_mobile = province_operator.user.mobile
province_operator_name = province_operator.user.fullname
sms_kill_request_province_sms = threading.Thread(target=kill_request_province_sms,
args=(
province_operator_mobile, kill_house_name,
quantity,
chicken_breed,
send_date, province, city))
sms_kill_request_province_sms.start()
serializer_request = self.serializer_class(kill_request)
if price_confirmation:
kill_request.price_confirmation = True
kill_request.save()
return Response({"result": "درخواست شما با موفقیت برای استان ارسال شد."},
status=status.HTTP_201_CREATED)
else:
kill_request.remain_quantity = kill_request.kill_capacity
kill_request.province_state = 'accepted'
kill_request.final_accept = True
kill_request.save()
price = Pricing.objects.all()
if price.count() > 0:
price = price.last()
factor = KillRequestFactor(
kill_request=kill_request,
amount=round(
(kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price,
0),
minimum_amount=round(
((kill_request.kill_capacity * kill_request.Index_weight) * price.live_chicken_price) * (
70 / 100),
0)
)
factor.save()
kill_request.factor_amount = factor.amount
kill_request.save()
if kill_request.poultry is None:
if SmsLicense.objects.filter(kill_request=True).exists():
mobile = kill_request.kill_house.kill_house_operator.user.mobile
kill_house_name = kill_request.kill_house.name
sms_province_kill_request_accept_sms = threading.Thread(
target=province_kill_request_accept_sms,
args=(
kill_house_name,))
sms_province_kill_request_accept_sms.start()
now = datetime.now().time().replace(second=0, microsecond=0)
if price_confirmation:
poultry_fullname = poultry.unit_name
# poultry_mobile = poultry.user.mobile
poultry_mobile = second_mobile_number if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
request_kill_house = kill_request.kill_house.name
date_str = kill_request.recive_date
clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0]
send_date = datetime.strptime(str(clean_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_price_poultry_request = threading.Thread(
target=confirm_price_poultry_request_direct_buying_sms,
args=(
poultry_mobile, poultry_fullname,
quantity, chicken_breed,
send_date,
kill_request.free_direct_buying,
kill_request.amount, request_kill_house,
code))
confirm_price_poultry_request.start()
kill_request.price_confirmation = True
kill_request.save()
return Response({"result": "درخواست شما با موفقیت ارسال شد."},
status=status.HTTP_201_CREATED)
else:
if permission_duirect_buying.allow == True and not buying_verification.poultry_code_mandatory and permission_duirect_buying.start_time < \
now < permission_duirect_buying.end_time:
poultry_requests = PoultryRequest.objects.filter(poultry=kill_request.poultry,
trash=False).order_by(
'create_date')
if not hatching:
hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending',
archive=False,
allow_hatching='pending', trash=False).order_by(
'id').last()
poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False)
vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first()
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
if poultry_requests.count() > 0:
order_code = poultry_requests.last().order_code + 1
else:
order_code = int(str(poultry.user.base_order) + '0001')
city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last()
if not city_operator:
city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)',
trash=False).last()
if hatching.left_over < kill_request.kill_capacity:
return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest(
hatching=hatching,
order_code=order_code,
general_order_code=general_order_code,
city_operator=city_operator,
poultry=poultry,
previous_quantity=kill_request.kill_capacity,
remain_quantity=kill_request.kill_capacity,
quantity=kill_request.kill_capacity,
first_quantity=kill_request.kill_capacity,
chicken_breed=hatching.chicken_breed,
Index_weight=kill_request.Index_weight,
state_process='accepted',
province_state='accepted',
direct_buying=True,
free_sale_in_province=free_sale_in_province,
send_date=kill_request.recive_date,
amount=kill_request.amount,
)
poultry_request.save()
kill_request.poultry_request = poultry_request
if kill_request.export_status == True:
poultry_request.export = True
send_date_str = poultry_request.send_date
send_date_datetime = datetime.strptime(str(send_date_str), '%Y-%m-%dT%H:%M:%S.%fZ')
poultry_request.killing_age = (send_date_datetime.date() - hatching.date.date()).days + 1
poultry_request.state = {
"city_operator": city_operator.user.fullname,
"city_state": poultry_request.state_process,
"city_operator_mobile": city_operator.user.mobile,
"province_operator": "",
"province_state": ""
}
poultry_request.registrar = {
"role": role,
"fullname": user.fullname,
"date": str(poultry_request.create_date)
}
poultry_request.save()
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()
wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first()
wage = wage_type.amount if wage_type.status == True else 0
percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
trash=False)
province_killrequest = ProvinceKillRequest(
killhouse_user=kill_request.kill_house,
kill_request=kill_request,
province_request=check,
quantity=kill_request.kill_capacity,
total_killed_quantity=kill_request.kill_capacity,
total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight),
main_quantity=kill_request.kill_capacity,
wage=wage,
direct_buying=True,
total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight),
)
province_killrequest.save()
# fine = FinePermission.objects.filter(trash=False).first()
# time_for_fine = datetime.now()
# time_for_fine = time_for_fine.replace(second=0, microsecond=0).time()
# if fine.direct_buying:
# if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time:
# province_killrequest.direct_buying_fine = True
# province_killrequest.direct_buying_fine_amount = fine.direct_buying_fine_coefficient * province_killrequest.total_wage_amount
# province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient
create_update_chicken_commission_prices()
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':
province_killrequest.union_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
province_killrequest.company_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
province_killrequest.guilds_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
province_killrequest.city_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'other':
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
province_killrequest.wallet_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.wallet_share_percent = percentage_wage_type.percent
else:
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
province_killrequest.save()
tomorrow = datetime.now().date() + timedelta(days=1)
if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house,
date__date=tomorrow).exists():
ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day,
hour=1,
minute=12, second=20)
kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_request.kill_house,
date=ware_house_date
)
kill_house_ware_house.save()
kill_house_check = KillHouseCheckRequest(
province_kill_request=province_killrequest,
state='accepted'
)
kill_house_check.save()
province_killrequest.state = 'accepted'
if buying_verification.payment_deadline:
province_killrequest.payment_deadline = True
province_killrequest.payment_deadline_date = datetime.now() + timedelta(
days=request.data['payment_deadline_days'])
province_killrequest.save()
check.quantity = 0
check.save()
if poultry_request.export == True:
hatching.export_killed_weight += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.export_killed_quantity += kill_request.kill_capacity
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.free_quantity += kill_request.kill_capacity
else:
hatching.governmental_killed_quantity += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.governmental_quantity += kill_request.kill_capacity
hatching.killed_quantity += kill_request.kill_capacity
hatching.save()
poultry_request.remain_quantity = 0
poultry_request.direct_buying_kill_place = kill_request.kill_house.name
poultry_request.direct_buying_buyer_info = {
"buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname,
"buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile,
}
poultry_request.save()
if kill_request.export_status == True:
kill_request.export_state = 'accepted'
kill_request.direct_buying_message = request.data['direct_buying_message']
else:
kill_request.direct_buying_state = 'accepted'
kill_request.accept_reject_date = datetime.now()
kill_request.save()
poultry_fullname = poultry.unit_name
# poultry_mobile = poultry.user.mobile
poultry_mobile = second_mobile_number if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
request_kill_house = kill_request.kill_house.name
date_str = kill_request.recive_date
if isinstance(date_str, str):
clean_date_str = date_str.split('.')[0]
clean_date_str = clean_date_str.replace('T', ' ')
clean_date_str = clean_date_str.replace('Z', '')
send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date()
elif isinstance(date_str, datetime):
send_date = date_str.date()
# clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0]
# send_date = datetime.strptime(str(clean_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 = "-"
code = "-"
send_date = separate.join(date_list)
confirm_price_poultry_request = threading.Thread(
target=confirm_price_poultry_request_direct_buying_sms,
args=(
poultry_mobile, poultry_fullname,
quantity, chicken_breed,
send_date,
kill_request.free_direct_buying,
kill_request.amount, request_kill_house,
code))
confirm_price_poultry_request.start()
bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm)
return Response({"result": "درخواست شما با موفقیت ارسال شد."},
status=status.HTTP_201_CREATED)
else:
poultry_fullname = poultry.unit_name
# poultry_mobile = poultry.user.mobile
poultry_mobile = second_mobile_number if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
request_kill_house = kill_request.kill_house.name
date_str = kill_request.recive_date
if isinstance(date_str, str):
clean_date_str = date_str.split('.')[0]
clean_date_str = clean_date_str.replace('T', ' ')
clean_date_str = clean_date_str.replace('Z', '')
send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date()
elif isinstance(date_str, datetime):
send_date = date_str.date()
# clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0]
# send_date = datetime.strptime(str(clean_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 = "-"
code = "-"
send_date = separate.join(date_list)
confirm_price_poultry_request = threading.Thread(
target=confirm_price_poultry_request_direct_buying_sms,
args=(
poultry_mobile, poultry_fullname,
quantity, chicken_breed,
send_date,
kill_request.free_direct_buying,
kill_request.amount, request_kill_house,
code))
confirm_price_poultry_request.start()
return Response({"result": "درخواست شما با موفقیت به پنل تخصیص اضافه شد."},
status=status.HTTP_201_CREATED)
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().date()
if 'role' in request.GET:
if request.GET['role'] == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False)
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
if 'direct_buying' in request.GET:
from django.db.models import Value
kill_req_list = []
# if request.GET['type'] == 'pending':
# querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1,
# recive_date__date__lte=date2, poultry__isnull=False,
# direct_buying_state='pending',
# export_status=False,trash=False
# ).order_by(
# 'recive_date')
# else:
querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False,
direct_buying_state__in=(
'accepted', 'rejected', 'deleted', 'pending'),
export_status=False, trash=False, market=False,
).order_by(
Case(
When(direct_buying_state='pending', then=Value(0)),
default=Value(1)
),
'-recive_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 (self.filterset_class(
data=query,
queryset=querysets
)
).filter():
ps = self.filterset_class(data=query, queryset=querysets)
kill_req_list = ps.filter()
querysets = [] if len(kill_req_list) == 0 else kill_req_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(querysets)
if page is not None:
serializer = KillRequestSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = KillRequestSerializer(querysets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
if 'export' in request.GET:
kill_req_list = []
if request.GET['type'] == 'pending':
querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False,
export_status=True, market=False,
export_state='pending'
).order_by(
'recive_date')
else:
querysets = KillRequest.objects.filter(kill_house__in=kill_house, recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False,
export_status=True, market=False,
export_state__in=(
'accepted', 'rejected', 'deleted'),
).order_by(
'recive_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 (self.filterset_class(
data=query,
queryset=querysets
)
).filter():
ps = self.filterset_class(data=query, queryset=querysets)
kill_req_list = ps.filter()
querysets = [] if len(kill_req_list) == 0 else kill_req_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(querysets)
if page is not None:
serializer = KillRequestSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = KillRequestSerializer(querysets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
queryset_list = KillRequest.objects.filter(kill_house__in=kill_house, trash=False, market=False,
poultry__isnull=True).order_by(
'recive_date')
querysets = [
kill_request for kill_request in queryset_list
if date1 <= kill_request.recive_date.date() <= date2
]
elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
if 'direct_buying' in request.GET:
from django.db.models import Value
kill_req_list = []
# if request.GET['type'] == 'pending':
# querysets = KillRequest.objects.filter(
# recive_date__date__gte=date1,
# recive_date__date__lte=date2, poultry__isnull=False,
# direct_buying_state='pending',
# export_status=False,trash=False
# ).order_by(
# 'recive_date')
# else:
querysets = KillRequest.objects.filter(
recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False, market=False,
final_accept=True,
direct_buying_state__in=(
'accepted', 'rejected', 'deleted', 'pending'),
export_status=False, trash=False
).select_related(
'poultry', 'kill_house', 'slaughter_house', 'poultry_hatching'
).order_by(
Case(
When(direct_buying_state='pending', then=Value(0)),
default=Value(1)
),
'-recive_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 (self.filterset_class(
data=query,
queryset=querysets
)
).filter():
ps = self.filterset_class(data=query, queryset=querysets)
kill_req_list = ps.filter()
querysets = [] if len(kill_req_list) == 0 else kill_req_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(querysets)
if page is not None:
serializer = KillRequestForDirectBuyingTrueSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = KillRequestSerializer(querysets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
if 'export' in request.GET:
kill_req_list = []
if request.GET['type'] == 'pending':
querysets = KillRequest.objects.filter(
recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False,
export_status=True, market=False,
export_state='pending'
).order_by(
'recive_date')
else:
querysets = KillRequest.objects.filter(
recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False,
export_status=True, market=False,
export_state__in=(
'accepted', 'rejected', 'deleted'),
).order_by(
'recive_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 (self.filterset_class(
data=query,
queryset=querysets
)
).filter():
ps = self.filterset_class(data=query, queryset=querysets)
kill_req_list = ps.filter()
querysets = [] if len(kill_req_list) == 0 else kill_req_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(querysets)
if page is not None:
serializer = KillRequestSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = KillRequestSerializer(querysets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
querysets_list = KillRequest.objects.filter(
trash=False, poultry__isnull=True).order_by('-recive_date')
# for queryset in querysets_list:
# if (now - queryset.recive_date.date()).days > 2:
# queryset.remain_quantity = 0
# queryset.save()
querysets = [
queryset_list for queryset_list in querysets_list
if date1 <= queryset_list.recive_date.date() <= date2
]
elif 'poultry_key' in request.GET:
kill_requests = []
today = datetime.now().date()
poultry = Poultry.objects.get(key=request.GET['poultry_key'], trash=False)
kill_requests = KillRequest.objects.filter(direct_buying_state__in=('pending', 'accepted'), market=False,
poultry=poultry, recive_date__date=today, trash=False)
serializer = KillRequestSerializer(kill_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
else:
if '0' in request.GET:
poultry_request = PoultryRequest.objects.get(key=request.GET['0'])
queryset = KillRequest.objects.filter(
recive_date__year=poultry_request.send_date.year,
recive_date__month=poultry_request.send_date.month,
recive_date__day=poultry_request.send_date.day,
province_state='accepted', market=False,
# automatic=False,
trash=False, poultry__isnull=True).order_by('id')
result_list = []
if len(poultry_request.kill_house_list) != 0:
querysets = []
for item in poultry_request.kill_house_list:
parts = item.split("(")
name = parts[0].strip()
result_list.append(name)
for kill_house in result_list:
priority_requests = []
remaining_requests = []
for kill_request in queryset:
if kill_request.kill_house.name == kill_house:
priority_requests.append(kill_request)
kill_request.priority = True
kill_request.save()
else:
kill_request.priority = False
kill_request.save()
remaining_requests.append(kill_request)
for x in priority_requests:
if x in querysets:
pass
else:
querysets.append(x)
for y in remaining_requests:
if y in querysets:
pass
else:
querysets.append(y)
else:
for kill_request in queryset:
kill_request.priority = False
kill_request.save()
querysets = queryset
else:
querysets = []
serializer = KillRequestSerializer(querysets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# تابع مربوط به حذف درخواست کشتارهای ثبت شده از سمت کشتارگاه
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'role' in request.GET:
kill_request = KillRequest.objects.get(key=request.GET['kill_request_key'])
limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter(
trash=False, active=True).first()
if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time:
current_time = datetime.now().time()
if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time:
record_create_time = kill_request.create_date.time()
if not (
limitation_direct_purchase.start_time <= record_create_time <= limitation_direct_purchase.end_time):
return Response(
{"result": "شما فقط می‌توانید بارهایی که در بازه زمانی مجاز ثبت شده‌اند را حذف کنید!"},
status=status.HTTP_403_FORBIDDEN)
if request.GET['role'] == 'KillHouse':
if kill_request.direct_buying_state != 'pending' and kill_request.export_status == False:
return Response({"result": "به علت تایید یا رد استان شما نمیتوانیددرخواست رو حذف کنید"})
if kill_request.export_state != 'pending' and kill_request.export_status == True:
return Response({"result": "به علت تایید یا رد استان شما نمیتوانیددرخواست رو حذف کنید"})
if kill_request.export_status == False:
kill_request.direct_buying_state = 'deleted'
else:
kill_request.export_state = 'deleted'
kill_request.trash = True
kill_request.save()
return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK)
user = SystemUserProfile.objects.get(user=request.user)
kill_request = KillRequest.objects.get(id=pk)
if ProvinceKillRequest.objects.filter(kill_request=kill_request, trash=False).exists():
return Response({"result": "error"}, status=status.HTTP_403_FORBIDDEN)
if SmsLicense.objects.filter(kill_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()
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
date_str = str(kill_request.recive_date)
send_date = 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)
province = kill_request.kill_house.system_address.province.name
city = kill_request.kill_house.system_address.city.name
kill_house_name = kill_request.kill_house.name
province_operator_mobile = province_operator.user.mobile
province_operator_name = province_operator.user.fullname
# kill_request_province_sms(province_operator_mobile, kill_house_name, quantity, chicken_breed,
# send_date, province, city)
sms_kill_request_delete_province_sms = threading.Thread(target=kill_request_delete_province_sms,
args=(
province_operator_mobile, kill_house_name,
quantity,
chicken_breed,
send_date, province, city))
sms_kill_request_delete_province_sms.start()
kill_request.trash = True
kill_request.save()
return Response('request deleted', status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'kill_request_key' in request.data.keys():
kill_request_instance = KillRequest.objects.filter(key=request.data['kill_request_key'],
trash=False).first()
if kill_request_instance:
limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter(
trash=False, active=True).first()
if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time:
current_time = datetime.now().time()
if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time:
record_create_time = kill_request_instance.create_date.time()
if not (
limitation_direct_purchase.start_time <= record_create_time <= limitation_direct_purchase.end_time):
return Response(
{
"result": "شما فقط می‌توانید بارهایی که در بازه زمانی مجاز ثبت شده‌اند را ویرایش کنید!"},
status=status.HTTP_403_FORBIDDEN)
if 'role' in request.data.keys():
kill_request = KillRequest.objects.get(key=request.data['kill_request_key'])
if kill_request.trash:
return Response({"result": "به علت بدهی درخواست شما حذف گردید!"}, status=status.HTTP_403_FORBIDDEN)
if request.data['role'] == 'KillHouse':
if kill_request.direct_buying_state != 'pending':
return Response({"result": "به علت تایید یا رد استان شما نمیتوانیددرخواست رو ویرایش کنید"})
request.data.pop('role')
request.data.pop('kill_request_key')
if 'input_direct_buying_code' in request.data.keys():
if request.data['input_direct_buying_code'] != None or request.data['input_direct_buying_code'] != "":
if request.data['input_direct_buying_code'] != kill_request.direct_buying_code:
return Response({"result": "کد وارد شده صحیح نمی باشد"}, status=status.HTTP_403_FORBIDDEN)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().time().replace(second=0, microsecond=0)
free_sale_in_province = False if kill_request.free_direct_buying == False else True
permission_duirect_buying = AutomaticDirectBuyingPermission.objects.first()
if permission_duirect_buying.allow == True and permission_duirect_buying.start_time < \
now < permission_duirect_buying.end_time:
# kill_request.kill_capacity = int(request.data['quantity'])
# kill_request.remain_quantity = int(request.data['quantity'])
# kill_request.save()
# request.data.pop('quantity')
poultry_requests = PoultryRequest.objects.filter(poultry__user=kill_request.poultry.user,
trash=False).order_by(
'create_date')
if kill_request.poultry_hatching:
hatching = kill_request.poultry_hatching
else:
hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending',
archive=False,
allow_hatching='pending', trash=False).order_by(
'id').last()
poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False)
vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first()
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
if poultry_requests.count() > 0:
order_code = poultry_requests.last().order_code + 1
else:
order_code = int(str(poultry.user.base_order) + '0001')
city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last()
if not city_operator:
city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)',
trash=False).last()
if hatching.left_over < kill_request.kill_capacity:
return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"},
status=status.HTTP_403_FORBIDDEN)
if kill_request.kill_house.max_kill_limit and kill_request.kill_house.total_kill_capacity > 0:
total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False,
return_to_province=False,
archive_wage=False,
state__in=(
'pending', 'accepted'),
killhouse_user=kill_request.kill_house,
kill_request__recive_date__date=kill_request.recive_date.date())
total_province_kill_requests_quantity = \
total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0
if kill_request.kill_house.total_kill_capacity < total_province_kill_requests_quantity + kill_request.kill_capacity:
return Response(
{"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest(
hatching=hatching,
order_code=order_code,
general_order_code=general_order_code,
city_operator=city_operator,
poultry=poultry,
previous_quantity=kill_request.kill_capacity,
remain_quantity=kill_request.kill_capacity,
quantity=kill_request.kill_capacity,
first_quantity=kill_request.kill_capacity,
chicken_breed=hatching.chicken_breed,
Index_weight=kill_request.Index_weight,
state_process='accepted',
province_state='accepted',
direct_buying=True,
amount=kill_request.amount,
free_sale_in_province=free_sale_in_province,
send_date=kill_request.recive_date
)
poultry_request.save()
kill_request.poultry_request = poultry_request
poultry_prediction(poultry_request.poultry)
if kill_request.export_status == True:
poultry_request.export = True
send_date_str = poultry_request.send_date
if isinstance(send_date_str, str):
# حذف میلی‌ثانیه و کاراکترهای اضافی
clean_date_str = send_date_str.split('.')[0] # حذف بخش .759000
clean_date_str = clean_date_str.replace('T', ' ') # جایگزینی T با فاصله
clean_date_str = clean_date_str.replace('Z', '') # حذف Z اگر وجود دارد
# تبدیل به تاریخ میلادی
send_date_datetime = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date()
# اگر از قبل شی datetime است
elif isinstance(send_date_str, datetime):
send_date_datetime = send_date_str.date()
# send_date_datetime = datetime.strptime(str(send_date_str), '%Y-%m-%dT%H:%M:%S.%fZ')
poultry_request.killing_age = (send_date_datetime - hatching.date.date()).days + 1
poultry_request.state = {
"city_operator": city_operator.user.fullname,
"city_state": poultry_request.state_process,
"city_operator_mobile": city_operator.user.mobile,
"province_operator": "",
"province_state": ""
}
poultry_request.registrar = {
"role": 'KillHouse',
"fullname": user.fullname,
"date": str(poultry_request.create_date)
}
poultry_request.save()
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()
wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first()
wage = wage_type.amount if wage_type.status == True else 0
percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
trash=False)
province_killrequest = ProvinceKillRequest(
killhouse_user=kill_request.kill_house,
kill_request=kill_request,
province_request=check,
quantity=kill_request.kill_capacity,
total_killed_quantity=kill_request.kill_capacity,
total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight),
main_quantity=kill_request.kill_capacity,
wage=wage,
direct_buying=True,
total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight),
)
province_killrequest.save()
# fine = FinePermission.objects.filter(trash=False).first()
# time_for_fine = datetime.now()
# time_for_fine = time_for_fine.replace(second=0, microsecond=0).time()
# if fine.direct_buying:
# if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time:
# province_killrequest.direct_buying_fine = True
# province_killrequest.direct_buying_fine_amount = (
# fine.direct_buying_fine_coefficient - 1) * province_killrequest.total_wage_amount if fine.direct_buying_fine_coefficient > 1 else province_killrequest.total_wage_amount
# province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient
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':
province_killrequest.union_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
province_killrequest.company_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
province_killrequest.guilds_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
province_killrequest.city_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'other':
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
province_killrequest.wallet_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.wallet_share_percent = percentage_wage_type.percent
else:
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
province_killrequest.save()
tomorrow = datetime.now().date() + timedelta(days=1)
if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house,
date__date=tomorrow).exists():
ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, hour=1,
minute=12, second=20)
kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_request.kill_house,
date=ware_house_date
)
kill_house_ware_house.save()
kill_house_check = KillHouseCheckRequest(
province_kill_request=province_killrequest,
state='accepted'
)
kill_house_check.save()
province_killrequest.state = 'accepted'
if kill_request.payment_deadline:
province_killrequest.payment_deadline = True
province_killrequest.payment_deadline_date = kill_request.payment_deadline_date
province_killrequest.save()
check.quantity = 0
check.save()
if poultry_request.export == True:
hatching.export_killed_weight += int(kill_request.kill_capacity * poultry_request.Index_weight)
hatching.export_killed_quantity += kill_request.kill_capacity
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity += int(kill_request.kill_capacity * poultry_request.Index_weight)
hatching.free_quantity += kill_request.kill_capacity
else:
hatching.governmental_killed_quantity += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.governmental_quantity += kill_request.kill_capacity
hatching.killed_quantity += kill_request.kill_capacity
hatching.save()
poultry_request.remain_quantity = 0
poultry_request.direct_buying_kill_place = kill_request.kill_house.name
poultry_request.direct_buying_buyer_info = {
"buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname,
"buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile,
}
poultry_request.save()
if kill_request.export_status == True:
kill_request.export_state = 'accepted'
kill_request.direct_buying_message = request.data['direct_buying_message']
else:
kill_request.direct_buying_state = 'accepted'
kill_request.accept_reject_date = datetime.now()
kill_request.automatic_accept = True
kill_request.input_direct_buying_code = request.data['input_direct_buying_code']
kill_request.save()
bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm)
return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."},
status=status.HTTP_201_CREATED)
if 'input_export_code' in request.data.keys():
if request.data['input_export_code'] != None or request.data['input_export_code'] != "":
if request.data['input_export_code'] != kill_request.export_code:
return Response({"result": "کد وارد شده صحیح نمی باشد"}, status=status.HTTP_403_FORBIDDEN)
if 'final_accept' in request.data.keys():
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_request.final_accept = True
now = datetime.now().time().replace(second=0, microsecond=0)
price_confirmation = PriceConfirmation.objects.filter(trash=False).first()
price_confirmation = price_confirmation.poultry_status if price_confirmation else False
buying_verification = DirectBuyingVerification.objects.filter(trash=False).first()
if buying_verification.poultry_code_mandatory:
poultry_fullname = kill_request.poultry.unit_name
poultry_mobile = kill_request.poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
request_kill_house = kill_request.kill_house.name
date_str = kill_request.recive_date
# clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0]
# send_date = 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)
if isinstance(date_str, str):
clean_date_str = date_str.split('.')[0]
clean_date_str = clean_date_str.replace('T', ' ')
clean_date_str = clean_date_str.replace('Z', '')
send_date = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date()
elif isinstance(date_str, datetime):
send_date = date_str.date()
jalali_date = jdatetime.date.fromgregorian(
year=send_date.year,
month=send_date.month,
day=send_date.day
)
formatted_jalali = jalali_date.strftime('%Y-%m-%d')
date_parts = formatted_jalali.split('-')
send_date = '-'.join(reversed(date_parts))
confirm_price_poultry_request = threading.Thread(
target=confirm_price_poultry_request_direct_buying_sms,
args=(
poultry_mobile, poultry_fullname,
quantity, chicken_breed,
send_date,
kill_request.free_direct_buying,
kill_request.amount, request_kill_house,
kill_request.direct_buying_code))
confirm_price_poultry_request.start()
kill_request.price_confirmation = price_confirmation
kill_request.save()
return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."},
status=status.HTTP_201_CREATED)
else:
free_sale_in_province = False if kill_request.free_direct_buying == False else True
permission_duirect_buying = AutomaticDirectBuyingPermission.objects.first()
if permission_duirect_buying.allow == True and permission_duirect_buying.start_time < \
now < permission_duirect_buying.end_time:
# kill_request.kill_capacity = int(request.data['quantity'])
# kill_request.remain_quantity = int(request.data['quantity'])
# kill_request.save()
# request.data.pop('quantity')
poultry_requests = PoultryRequest.objects.filter(poultry__user=kill_request.poultry.user,
trash=False).order_by(
'create_date')
if kill_request.poultry_hatching:
hatching = kill_request.poultry_hatching
else:
hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending',
archive=False,
allow_hatching='pending', trash=False).order_by(
'id').last()
# hatching = PoultryHatching.objects.filter(poultry=kill_request.poultry, state='pending',
# archive=False,
# allow_hatching='pending', trash=False).order_by(
# 'left_over').last()
poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False)
vet_farm = VetFarm.objects.filter(trash=False, poultry=poultry).first()
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
if poultry_requests.count() > 0:
order_code = poultry_requests.last().order_code + 1
else:
order_code = int(str(poultry.user.base_order) + '0001')
city_operator = CityOperator.objects.filter(unit_name=poultry.city_operator, trash=False).last()
if not city_operator:
city_operator = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)',
trash=False).last()
if hatching.left_over < kill_request.kill_capacity:
return Response({"result": "تعداد جوجه در سالن کمتر از تعداد درخواستی است"},
status=status.HTTP_403_FORBIDDEN)
if kill_request.kill_house.max_kill_limit and kill_request.kill_house.total_kill_capacity > 0:
total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False,
return_to_province=False,
archive_wage=False,
state__in=(
'pending',
'accepted'),
killhouse_user=kill_request.kill_house,
kill_request__recive_date__date=kill_request.recive_date.date())
total_province_kill_requests_quantity = \
total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0
if kill_request.kill_house.total_kill_capacity < total_province_kill_requests_quantity + kill_request.kill_capacity:
return Response(
{"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest(
hatching=hatching,
order_code=order_code,
general_order_code=general_order_code,
city_operator=city_operator,
poultry=poultry,
previous_quantity=kill_request.kill_capacity,
remain_quantity=kill_request.kill_capacity,
quantity=kill_request.kill_capacity,
first_quantity=kill_request.kill_capacity,
chicken_breed=hatching.chicken_breed,
Index_weight=kill_request.Index_weight,
state_process='accepted',
province_state='accepted',
direct_buying=True,
amount=kill_request.amount,
free_sale_in_province=free_sale_in_province,
send_date=kill_request.recive_date
)
poultry_request.save()
kill_request.poultry_request = poultry_request
poultry_prediction(poultry_request.poultry)
if kill_request.export_status == True:
poultry_request.export = True
date_str = poultry_request.send_date
if isinstance(date_str, str):
# حذف میلی‌ثانیه و کاراکترهای اضافی
clean_date_str = date_str.split('.')[0] # حذف بخش .759000
clean_date_str = clean_date_str.replace('T', ' ') # جایگزینی T با فاصله
clean_date_str = clean_date_str.replace('Z', '') # حذف Z اگر وجود دارد
# تبدیل به تاریخ میلادی
send_date_datetime = datetime.strptime(clean_date_str, '%Y-%m-%d %H:%M:%S').date()
# اگر از قبل شی datetime است
elif isinstance(date_str, datetime):
send_date_datetime = date_str.date()
# send_date_datetime = datetime.strptime(str(send_date_str), '%Y-%m-%dT%H:%M:%S')
poultry_request.killing_age = (send_date_datetime - hatching.date.date()).days + 1
poultry_request.state = {
"city_operator": city_operator.user.fullname,
"city_state": poultry_request.state_process,
"city_operator_mobile": city_operator.user.mobile,
"province_operator": "",
"province_state": ""
}
poultry_request.registrar = {
"role": "KillHouse",
"fullname": user.fullname,
"date": str(poultry_request.create_date)
}
poultry_request.save()
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()
wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first()
wage = wage_type.amount if wage_type.status == True else 0
percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
trash=False)
province_killrequest = ProvinceKillRequest(
killhouse_user=kill_request.kill_house,
kill_request=kill_request,
province_request=check,
quantity=kill_request.kill_capacity,
total_killed_quantity=kill_request.kill_capacity,
total_killed_weight=int(kill_request.kill_capacity * poultry_request.Index_weight),
main_quantity=kill_request.kill_capacity,
wage=wage,
direct_buying=True,
total_wage_amount=wage * int(kill_request.kill_capacity * poultry_request.Index_weight),
)
province_killrequest.save()
# fine = FinePermission.objects.filter(trash=False).first()
# time_for_fine = datetime.now()
# time_for_fine = time_for_fine.replace(second=0, microsecond=0).time()
# if fine.direct_buying:
# if fine.direct_buying_start_time < time_for_fine < fine.direct_buying_end_time:
# province_killrequest.direct_buying_fine = True
# province_killrequest.direct_buying_fine_amount = (
# fine.direct_buying_fine_coefficient - 1) * province_killrequest.total_wage_amount if fine.direct_buying_fine_coefficient > 1 else province_killrequest.total_wage_amount
# province_killrequest.direct_buying_fine_coefficient = fine.direct_buying_fine_coefficient
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':
province_killrequest.union_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
province_killrequest.company_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
province_killrequest.guilds_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
province_killrequest.city_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'other':
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
province_killrequest.wallet_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.wallet_share_percent = percentage_wage_type.percent
else:
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
province_killrequest.save()
tomorrow = datetime.now().date() + timedelta(days=1)
if not KillHouseWareHouse.objects.filter(kill_house=kill_request.kill_house,
date__date=tomorrow).exists():
ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day,
hour=1,
minute=12, second=20)
kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_request.kill_house,
date=ware_house_date
)
kill_house_ware_house.save()
kill_house_check = KillHouseCheckRequest(
province_kill_request=province_killrequest,
state='accepted'
)
kill_house_check.save()
province_killrequest.state = 'accepted'
if kill_request.payment_deadline:
province_killrequest.payment_deadline = True
province_killrequest.payment_deadline_date = kill_request.payment_deadline_date
province_killrequest.save()
check.quantity = 0
check.save()
if poultry_request.export == True:
hatching.export_killed_weight += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.export_killed_quantity += kill_request.kill_capacity
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.free_quantity += kill_request.kill_capacity
else:
hatching.governmental_killed_quantity += int(
kill_request.kill_capacity * poultry_request.Index_weight)
hatching.governmental_quantity += kill_request.kill_capacity
hatching.killed_quantity += kill_request.kill_capacity
hatching.save()
poultry_request.remain_quantity = 0
poultry_request.direct_buying_kill_place = kill_request.kill_house.name
poultry_request.direct_buying_buyer_info = {
"buyer_fullname": kill_request.kill_house.kill_house_operator.user.fullname,
"buyer_mobile": kill_request.kill_house.kill_house_operator.user.mobile,
}
poultry_request.save()
if kill_request.export_status == True:
kill_request.export_state = 'accepted'
kill_request.direct_buying_message = request.data['direct_buying_message']
else:
kill_request.direct_buying_state = 'accepted'
kill_request.accept_reject_date = datetime.now()
kill_request.automatic_accept = True
kill_request.save()
poultry_fullname = poultry.unit_name
poultry_mobile = poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
request_kill_house = kill_request.kill_house.name
date_str = kill_request.recive_date
if isinstance(date_str, str):
clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0]
else:
clean_date_str = date_str.strftime('%Y-%m-%d %H:%M:%S')
send_date = datetime.strptime(str(clean_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 = "-"
code = "-"
send_date = separate.join(date_list)
confirm_price_poultry_request = threading.Thread(
target=confirm_price_poultry_request_direct_buying_sms,
args=(
poultry_mobile, poultry_fullname,
quantity, chicken_breed,
send_date,
kill_request.free_direct_buying,
kill_request.amount, request_kill_house,
code))
confirm_price_poultry_request.start()
bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm)
return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."},
status=status.HTTP_201_CREATED)
else:
poultry = Poultry.objects.get(key=kill_request.poultry.key, trash=False)
poultry_fullname = poultry.unit_name
poultry_mobile = poultry.user.mobile if not kill_request.direct_buying_intermediary_mobile else kill_request.direct_buying_intermediary_mobile
quantity = kill_request.kill_capacity
chicken_breed = kill_request.chicken_breed
request_kill_house = kill_request.kill_house.name
date_str = kill_request.recive_date
if isinstance(date_str, str):
clean_date_str = date_str.split('T')[0] + ' ' + date_str.split('T')[1].split('.')[0]
else:
clean_date_str = date_str.strftime('%Y-%m-%d %H:%M:%S')
send_date = datetime.strptime(str(clean_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 = "-"
code = "-"
send_date = separate.join(date_list)
confirm_price_poultry_request = threading.Thread(
target=confirm_price_poultry_request_direct_buying_sms,
args=(
poultry_mobile, poultry_fullname,
quantity, chicken_breed,
send_date,
kill_request.free_direct_buying,
kill_request.amount, request_kill_house,
code))
confirm_price_poultry_request.start()
kill_request.save()
return Response({"result": "درخواست شما با موفقیت تایید و ارسال شد."},
status=status.HTTP_201_CREATED)
kill_request.save()
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
serializer.update(instance=kill_request, validated_data=request.data)
return Response({"result": "با موفقیت ویرایش شد"}, status=status.HTTP_200_OK)
else:
return Response({"result": "در ثبت مقادیر مشکلی به وجود آمده است !"}, status=status.HTTP_403_FORBIDDEN)
if 'previous_requests' in request.data.keys():
now = datetime.now().date()
user = SystemUserProfile.objects.get(user=request.user)
querysets_list = KillRequest.objects.filter(
kill_house__system_address__province=user.province,
trash=False, remain_quantity__gt=0).order_by('-recive_date')
for queryset in querysets_list:
if (now - queryset.recive_date.date()).days > 2:
queryset.remain_quantity = 0
queryset.save()
return Response({"result": "با موفقیت ثبت شد"},
status=status.HTTP_200_OK)
province_kill_request_quantity = 0
kill_request = KillRequest.objects.get(key=request.data["kill_request_key"], trash=False)
request.data.pop('kill_request_key')
quantity = int(request.data['quantity'])
request.data.pop('quantity')
province_kill_requests = ProvinceKillRequest.objects.filter(kill_request=kill_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 int(quantity) < kill_request.kill_capacity:
kill_request.remain_quantity -= kill_request.kill_capacity - int(quantity)
else:
kill_request.remain_quantity += int(quantity) - kill_request.kill_capacity
else:
kill_request.remain_quantity = int(quantity)
kill_request.kill_capacity = int(quantity)
kill_request.save()
serializer = self.serializer_class(kill_request)
serializer.update(instance=kill_request, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillRequestFactorViewSet(viewsets.ModelViewSet):
queryset = KillRequestFactor.objects.all()
serializer_class = KillRequestFactorSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
user_profile = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_user = get_object_or_404(KillHouseOperator, user=user_profile)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_user)
factor_list = KillRequestFactor.objects.filter(kill_request__kill_house__in=kill_house, trash=False).order_by(
'id')
factors = [
kill_request_factor for kill_request_factor in factor_list
if date1 <= kill_request_factor.kill_request.recive_date.date() <= date2
]
serializer = KillRequestFactorSerializer(factors, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'state' in request.data:
if request.data['state'] == 'cancel':
factor = KillRequestFactor.objects.get(key=request.data['factor_key'], trash=False)
kill_request = KillRequest.objects.get(key=factor.kill_request.key)
kill_request.trash = True
kill_request.save()
factor.trash = True
factor.save()
return Response({"result": "done!"}, status=status.HTTP_200_OK)
class KillRequestFactorPaymentViewSet(viewsets.ModelViewSet):
queryset = KillRequestFactorPayment.objects.all()
serializer_class = KillRequestFactorPaymentSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
factor = KillRequestFactor.objects.get(key=request.data['factor_key'], trash=False)
kill_request = KillRequest.objects.get(key=factor.kill_request.key)
kill_house = KillHouse.objects.get(key=kill_request.kill_house.key)
request.data.pop('factor_key')
image = request.data['image']
request.data.pop('image')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
factor_payment = serializer.create(validated_data=request.data)
factor_payment.kill_request_factor = factor
factor_payment.image = send_image_to_server(image)
factor_payment.remain_amount = float(request.data['amount'])
factor_payment.state = 'paid'
factor_payment.save()
factor.state = 'paid'
factor.save()
kill_request.payment_info = {
"amount": factor_payment.amount,
"total_amount": factor.amount,
"image": factor_payment.image,
"date": str(factor_payment.create_date)
}
kill_request.factor_deposit = factor_payment.amount
kill_request.save()
kill_house.wallet_amount += factor_payment.amount
kill_house.save()
serializer_request = self.serializer_class(factor_payment)
return Response(serializer_request.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
def update_province_kill_request():
wage = ShareOfAllocation.objects.all().last()
wage = wage.province_union if wage else 0
for province_kill_request in ProvinceKillRequest.objects.all():
province_request = ProvinceCheckOperatorRequest.objects.filter(
key=province_kill_request.province_request.key).last()
province_kill_request.total_amount = wage * (
province_kill_request.main_quantity * province_request.poultry_request.Index_weight)
province_kill_request.save()
from django.db import models, transaction
from django.db.models import Sum, Count, F
# ... (previous code)
class ReportingProvinceKillRequestsWageViewSet(viewsets.ModelViewSet):
queryset = ProvinceKillRequest.objects.all()
serializer_class = ProvinceKillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
province_kill_requests = ProvinceKillRequest.objects.filter(
trash=False, return_to_province=False, state__in=('accepted', 'pending')
).annotate(
total_quantity=Sum('total_killed_quantity'),
total_weight=Sum('total_killed_weight'),
total_amount_wage=Sum(
F('wage') * F('total_killed_weight')),
total_paid=Count('id', filter=models.Q(wage_pay=True, archive_by_province=False)),
total_unpaid=Count('id', filter=models.Q(wage_pay=False, archive_by_province=False)),
total_archive=Count('id', filter=models.Q(wage_pay=False, archive_by_province=True)),
# total_kill_houses=Count('kill_request__kill_house', distinct=True)
)
total_requests_buyers = province_kill_requests.values('kill_request__kill_house').distinct().count()
total_requests = province_kill_requests.count()
total_requests_quantity = province_kill_requests.aggregate(total=Sum('total_quantity'))['total']
total_requests_weight = province_kill_requests.aggregate(total=Sum('total_weight'))['total']
total_requests_amount = province_kill_requests.aggregate(total=Sum('total_amount_wage'))['total']
total_paid_requests = province_kill_requests.aggregate(total=Sum('total_paid'))['total']
total_paid_requests_quantity = \
province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_quantity'))['total']
total_paid_requests_weight = province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_weight'))[
'total']
total_paid_requests_amount = \
province_kill_requests.filter(wage_pay=True).aggregate(total=Sum('total_amount_wage'))['total']
total_unpaid_requests = province_kill_requests.aggregate(total=Sum('total_unpaid'))['total']
total_unpaid_requests_quantity = \
province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate(
total=Sum('total_quantity'))['total']
total_unpaid_requests_weight = \
province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate(
total=Sum('total_weight'))['total']
total_unpaid_requests_amount = \
province_kill_requests.filter(wage_pay=False, archive_by_province=False).aggregate(
total=Sum('total_amount_wage'))['total']
total_archive_requests = province_kill_requests.aggregate(total=Sum('total_archive'))['total']
total_archive_requests_quantity = \
province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate(
total=Sum('total_quantity'))['total']
total_archive_requests_weight = \
province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate(
total=Sum('total_weight'))['total']
total_archive_requests_amount = \
province_kill_requests.filter(wage_pay=False, archive_by_province=True).aggregate(
total=Sum('total_amount_wage'))['total']
total_free_request = province_kill_requests.filter(
province_request__poultry_request__free_sale_in_province=True)
total_free_request_quantity = total_free_request.aggregate(total=Sum('total_quantity'))['total']
total_free_request_weight = total_free_request.aggregate(total=Sum('total_weight'))['total']
total_government_request = province_kill_requests.filter(
province_request__poultry_request__free_sale_in_province=False)
total_government_request_quantity = total_government_request.aggregate(total=Sum('total_quantity'))['total']
total_government_request_weight = total_government_request.aggregate(total=Sum('total_weight'))['total']
return Response({
"total_requests_buyers": total_requests_buyers,
"total_requests": total_requests,
"total_requests_quantity": total_requests_quantity,
"total_requests_weight": total_requests_weight,
"total_requests_amount": total_requests_amount,
"total_paid_requests": total_paid_requests,
"total_paid_requests_quantity": total_paid_requests_quantity if total_paid_requests_quantity != None else 0,
"total_paid_requests_weight": total_paid_requests_weight if total_paid_requests_weight != None else 0,
"total_paid_requests_amount": total_paid_requests_amount if total_paid_requests_amount != None else 0,
"total_unpaid_requests": total_unpaid_requests,
"total_unpaid_requests_quantity": total_unpaid_requests_quantity,
"total_unpaid_requests_weight": total_unpaid_requests_weight,
"total_unpaid_requests_amount": total_unpaid_requests_amount,
"total_archive_requests": total_archive_requests,
"total_archive_requests_quantity": total_archive_requests_quantity,
"total_archive_requests_weight": total_archive_requests_weight,
"total_archive_requests_amount": total_archive_requests_amount,
"total_free_request": len(total_free_request),
"total_free_request_quantity": total_free_request_quantity,
"total_free_request_weight": total_free_request_weight,
"total_government_request": len(total_government_request),
"total_government_request_quantity": total_government_request_quantity,
"total_government_request_weight": total_government_request_weight,
}, status=status.HTTP_200_OK)
def provincearchiveprovincekillrequestforwage(province_kill_request_list, message, role, user_fullname, date):
province_kill_requests = ProvinceKillRequest.objects.filter(key__in=province_kill_request_list,
trash=False)
for province_kill_request in province_kill_requests:
province_kill_request.archive_by_province = True
province_kill_request.archive_message = message
province_kill_request.archiver = {
"role": role,
"fullname": user_fullname,
"date": date,
}
province_kill_request.save()
# class ReportingProvinceKillRequestsWageViewSet(viewsets.ModelViewSet):
# queryset = ProvinceKillRequest.objects.all()
# serializer_class = ProvinceKillRequestSerializer
# permission_classes = [TokenHasReadWriteScope]
#
# def list(self, request, *args, **kwargs):
# total_requests_buyers = 0
# total_requests = 0
# total_requests_quantity = 0
# total_requests_weight = 0
# total_requests_amount = 0
# total_paid_requests = 0
# total_paid_requests_quantity = 0
# total_paid_requests_weight = 0
# total_paid_requests_amount = 0
# total_unpaid_requests = 0
# total_unpaid_requests_quantity = 0
# total_unpaid_requests_weight = 0
# total_unpaid_requests_amount = 0
# province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('accepted', 'pending'))
# for province_kill_request in province_kill_requests:
# if province_kill_request.wage_pay == True:
# total_paid_requests +=1
# total_paid_requests_quantity += province_kill_request.main_quantity
# total_paid_requests_weight += int(province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight)
# total_paid_requests_amount += int(province_kill_request.wage * (province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight))
# else:
#
# total_unpaid_requests +=1
# total_unpaid_requests_quantity += province_kill_request.main_quantity
# total_unpaid_requests_weight += int(province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight)
# total_unpaid_requests_amount += int(province_kill_request.wage * (province_kill_request.main_quantity * province_kill_request.province_request.poultry_request.Index_weight))
#
# total_requests_buyers = len(province_kill_requests)
# total_requests = total_paid_requests + total_unpaid_requests
# total_requests_quantity = total_paid_requests_quantity + total_unpaid_requests_quantity
# total_requests_weight = total_paid_requests_weight + total_unpaid_requests_weight
# total_requests_amount = total_paid_requests_amount + total_unpaid_requests_amount
#
#
# return Response({
#
# "total_requests_buyers":total_requests_buyers,
# "total_requests":total_requests,
# "total_requests_quantity" :total_requests_quantity,
# "total_requests_weight":total_requests_weight,
# "total_requests_amount":total_requests_amount,
# "total_paid_requests":total_paid_requests,
# "total_paid_requests_quantity":total_paid_requests_quantity,
# "total_paid_requests_weight":total_paid_requests_weight,
# "total_paid_requests_amount":total_paid_requests_amount,
# "total_unpaid_requests":total_unpaid_requests,
# "total_unpaid_requests_quantity":total_unpaid_requests_quantity,
# "total_unpaid_requests_weight":total_unpaid_requests_weight,
# "total_unpaid_requests_amount":total_unpaid_requests_amount,
# },status=status.HTTP_200_OK
# )
# def auto_steward_allocation(kill_house_key, quantity, weight, date):
# kill_house = KillHouse.objects.get(key=kill_house_key, trash=False)
# stewards = Steward.objects.filter(guilds__steward=True, trash=False).order_by('id')
# stewards_list = []
# allocatated_quantity = 0
# kill_house_total_quantity = 0
# for steward in stewards:
# if steward.centers_allocation != None:
# for center_allocation in steward.centers_allocation:
# if str(kill_house.key) == center_allocation['value']:
# kill_house_total_quantity += steward.allocation_limit
# stewards_list.append(steward)
# if len(stewards_list) > 0:
# for steward_list in stewards_list:
# allocatated_quantity = (steward_list.allocation_limit / kill_house_total_quantity) * quantity
# auto_allocation = StewardAllocation(
# kill_house=kill_house,
# steward=steward_list,
# number_of_carcasses=allocatated_quantity,
# real_number_of_carcasses=allocatated_quantity,
# weight_of_carcasses=int(allocatated_quantity * weight),
# real_weight_of_carcasses=int(allocatated_quantity * weight),
# type='auto',
# date=date
# )
# auto_allocation.save()
class WalletWagePaymentViewSet(viewsets.ModelViewSet):
queryset = ProvinceKillRequest.objects.all()
serializer_class = ProvinceKillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
# def update(self, request, *args, **kwargs):
# user = SystemUserProfile.objects.get(user=request.user, trash=False)
# province_kill_request_keys = []
# for province_kill_request_key in request.data['province_kill_requests']:
# province_kill_request_keys.append(province_kill_request_key)
# province_kill_requests = ProvinceKillRequest.objects.filter(
# key__in=province_kill_request_keys).order_by('id')
# kill_house = KillHouse.objects.get(key=province_kill_requests.last().killhouse_user.key, trash=False)
# now = datetime.now()
# total_amount = 0
#
# for province_kill_request in province_kill_requests:
# province_kill_request.wage_pay = True
# province_kill_request.wallet_pay = True
# province_kill_request.depositor = {
# "role": request.data['role'],
# "payer": user.fullname,
# "date": str(now),
# "payment_type": 'wallet',
# "tracking_code": '-',
# "refId": '-',
# "orderId": '-',
# "total_amount": province_kill_request.total_killed_weight * province_kill_request.wage
# }
# province_kill_request.save()
# total_amount += province_kill_request.total_killed_weight * province_kill_request.wage
# transaction = ExternalTransaction(
# amount=total_amount,
# type="withdraw",
# transaction_type="wallet",
# status='completed',
# kill_house_user=kill_house.kill_house_operator.user,
# creator=user,
# receiver=user,
# creator_role='KillHouse',
# receiver_role='ProvinceOperator',
# payer=kill_house.kill_house_operator.user.fullname,
#
# )
# transaction.save()
#
# return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_200_OK)
# ویوست مربوط به تخصیص به کشتارگاه توسط استان
class ProvinceKillRequestViewSet(viewsets.ModelViewSet):
queryset = ProvinceKillRequest.objects.all()
serializer_class = ProvinceKillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
filterset_class = ProvinceKillRequestNewFilterSet
# تابع مربوط به تخصیص به کشتارگاه توسط استان
def create(self, request, *args, **kwargs):
wage = 0
province_check = ProvinceCheckOperatorRequest.objects.get(key=request.data['province_check_request_key'],
trash=False)
if province_check.poultry_request.price_confirmation and not province_check.poultry_request.input_price_confirmation_code:
return Response({"result": "به علت عدم ورود کد احراز مرغدار امکان تخصیص وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if province_check.poultry_request.freezing == True:
wage_type = WageType.objects.filter(en_name='province-kill-request-freezing', trash=False).first()
else:
wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first()
if wage_type.status == True:
wage = wage_type.amount
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") == "province_kill_request" and t.get("active", False)), None)
if time:
start_hour = datetime.strptime(time.get("start", 0), "%H:%M:%S").time()
end_hour = datetime.strptime(time.get("end", 0), "%H:%M:%S").time()
current_hour = datetime.now().time().replace(second=0, microsecond=0)
if not (start_hour < current_hour < end_hour):
return Response(
{"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"},
status=status.HTTP_403_FORBIDDEN)
now = datetime.now().date()
kill_request = KillRequest.objects.get(key=request.data['kill_request_key'], trash=False)
if OperationLimitation.objects.all().first().province_allocation_limitation == True:
if now != kill_request.recive_date.date():
return Response({"result": "مغایرت در تاریخ اعلام نیاز کشتار گاه و تاریخ تخصیص به کشتارگاه !"},
status=status.HTTP_403_FORBIDDEN)
kill_house = KillHouse.objects.get(id=kill_request.kill_house.id, trash=False)
poultry_request = PoultryRequest.objects.get(key=province_check.poultry_request.key)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
if hatching.left_over < int(request.data['quantity']):
return Response({"result": "تعداد تخصیص داده شده کمتر از تعداد موجود در سالن مرغدار است!"},
status=status.HTTP_403_FORBIDDEN)
request.data.pop('kill_request_key')
request.data.pop('province_check_request_key')
if poultry_request.send_date.year != kill_request.recive_date.year or poultry_request.send_date.month != kill_request.recive_date.month or poultry_request.send_date.day != kill_request.recive_date.day:
return Response({"result": "تاریخ درخواست کشتارها یکی نیست!"}, status=status.HTTP_403_FORBIDDEN)
if province_check.quantity == 0:
return Response("forbidden", status=status.HTTP_403_FORBIDDEN)
if int(request.data['quantity']) > kill_request.remain_quantity:
return Response({"result": "تعداد وارد شده از مانده سهمیه بیشتر است !"}, status=status.HTTP_403_FORBIDDEN)
if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0:
total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
archive_wage=False,
state__in=('pending', 'accepted'),
killhouse_user=kill_house,
kill_request__recive_date__date=kill_request.recive_date.date())
total_province_kill_requests_quantity = \
total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0
if kill_house.total_kill_capacity < total_province_kill_requests_quantity + int(request.data['quantity']):
return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
if poultry_request.free_sale_in_province == True:
if kill_house.quota:
kill_house_info = calculate_governmental_quota(kill_house)
if kill_house_info == 'not_allowed':
return Response({"result": " امکان خرید آزاد تا تکمیل تعهد دولتی وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if kill_house.ware_house_remaining_weight_limitation_status:
if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation:
return Response({
"result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده انبار بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
if kill_house.ware_house_remaining_percent_limitation_status:
if not check_kill_house_remain_limitation_weight(kill_house):
return Response({
"result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده روزانه انبار بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
province_kills = ProvinceKillRequest.objects.filter(killhouse_user=kill_house,
province_request__city_request_Poultry__poultry_request_id=province_check.city_request_Poultry.poultry_request.id,
state__in=('pending', 'accepted'), trash=False)
if province_kills.count() > 0:
province = province_kills.last()
if province.main_quantity == province.quantity:
province.total_killed_quantity += int(request.data['quantity'])
province.total_killed_weight += int(int(request.data['quantity']) * poultry_request.Index_weight)
province.quantity += int(request.data['quantity'])
province.main_quantity += int(request.data['quantity'])
kill_request.remain_quantity = kill_request.remain_quantity - int(request.data['quantity'])
kill_request.save()
province.save()
province_check.quantity -= int(request.data['quantity'])
province_check.save()
poultry_request.remain_quantity -= int(request.data['quantity'])
poultry_request.save()
if poultry_request.export == True:
hatching.export_killed_weight += int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity += int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity += int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.free_quantity += int(request.data['quantity'])
else:
hatching.governmental_killed_quantity += int(
int(request.data['quantity']) * poultry_request.Index_weight)
hatching.governmental_quantity += int(request.data['quantity'])
hatching.save()
tomorrow = now + timedelta(days=1)
if not KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=tomorrow).exists():
ware_house_date = datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day, hour=1,
minute=12, second=20)
kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_house,
date=ware_house_date
)
kill_house_ware_house.save()
province.total_wage_amount = province.total_killed_weight * province.wage
province.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':
province.union_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.union_share_percent = percentage_wage_type.percent
province.save()
elif percentage_wage_type.share_type.en_name == 'company':
province.company_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.company_share_percent = percentage_wage_type.percent
province.save()
elif percentage_wage_type.share_type.en_name == 'guilds':
province.guilds_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.guilds_share_percent = percentage_wage_type.percent
province.save()
elif percentage_wage_type.share_type.en_name == 'city':
province.city_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.city_share_percent = percentage_wage_type.percent
province.save()
elif percentage_wage_type.share_type.en_name == 'wallet':
province.wallet_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.wallet_share_percent = percentage_wage_type.percent
province.save()
elif percentage_wage_type.share_type.en_name == 'other':
province.other_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.other_share_percent = percentage_wage_type.percent
province.save()
else:
province.other_share = int((percentage_wage_type.percent / 100) * province.total_wage_amount)
province.other_share_percent = percentage_wage_type.percent
province.save()
return Response({"result": "object create"}, status=status.HTTP_201_CREATED)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
province_kill_request_list = []
if hatching.left_over < int(request.data['quantity']):
return Response({"result": "تعداد تخصیص داده شده بیشتر از تعداد موجود در سالن مرغدار است!"},
status=status.HTTP_403_FORBIDDEN)
province_kill_request = serializer.create(validated_data=request.data)
province_kill_request.kill_request = kill_request
province_kill_request.province_request = province_check
province_kill_request.wage = wage
province_kill_request.state = "pending"
if province_check.quantity < int(request.data['quantity']):
province_kill_request.quantity = province_check.quantity
province_kill_request.killhouse_user = kill_house
province_kill_request.main_quantity = int(request.data['quantity'])
province_kill_request.total_killed_quantity = province_kill_request.main_quantity
province_kill_request.total_killed_weight = int(
province_kill_request.main_quantity * poultry_request.Index_weight)
province_kill_request.total_wage_amount = province_kill_request.total_killed_weight * province_kill_request.wage
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':
province_kill_request.union_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
province_kill_request.company_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
province_kill_request.guilds_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
province_kill_request.city_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'other':
province_kill_request.other_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.other_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
province_kill_request.wallet_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.wallet_share_percent = percentage_wage_type.percent
else:
province_kill_request.other_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.other_share_percent = percentage_wage_type.percent
province_kill_request.save()
province_kill_request.save()
poultry_request.remain_quantity -= province_kill_request.main_quantity
poultry_request.save()
province_check.quantity = province_check.quantity - int(int(request.data['quantity']))
if province_check.quantity < 0 or province_check.quantity == 0:
province_check.quantity = 0
province_check.province_show_kill_house = 'accepted'
province_check.save()
kill_request.remain_quantity -= province_kill_request.main_quantity
kill_request.save()
kill_house_request_serializer = self.serializer_class(province_kill_request)
dict1 = {
"kill_house_req_key": str(province_kill_request.key),
"kill_req_key": province_kill_request.kill_request.key,
"province_kill_request_state": province_kill_request.state,
"kill_house_name": province_kill_request.kill_request.kill_house.name,
"kill_house_user_name": province_kill_request.kill_request.kill_house.kill_house_operator.user.fullname,
"kill_house_user_city": province_kill_request.kill_request.kill_house.kill_house_operator.address.city.name,
"kill_house_mobile": province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": province_kill_request.quantity,
"fee": province_kill_request.fee,
"time": province_kill_request.kill_request.recive_time,
"date": province_kill_request.kill_request.recive_date,
}
factor = KillRequestFactor.objects.filter(kill_request=kill_request)
if factor.count() > 0:
factor = factor.last()
if KillRequestFactorPayment.objects.filter(kill_request_factor=factor).exists():
factor.state = 'paid'
else:
factor.state = 'unpaid'
factor.save()
province_kill_request_list.append(province_kill_request.key)
if AutoAcceptProvinceKillRequest.objects.filter(allow=True).exists():
kill_house_check = KillHouseCheckRequest(
province_kill_request=province_kill_request,
role="ProvinceOperator",
state="accepted"
)
province_kill_request.state = 'accepted'
kill_house_check.save()
province_kill_request.save()
if poultry_request.export == True:
hatching.export_killed_weight += int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity += int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity += int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.free_quantity += int(request.data['quantity'])
else:
hatching.governmental_killed_quantity += int(
int(request.data['quantity']) * poultry_request.Index_weight)
hatching.governmental_quantity += int(request.data['quantity'])
hatching.save()
vet_farm = VetFarm.objects.filter(trash=False, poultry=hatching.poultry).first()
if SmsLicense.objects.filter(province_kill_request=True).exists():
kill_house_name = kill_house.name
kill_house_mobile = kill_house.kill_house_operator.user.mobile
kill_house_second_mobile = kill_house.alternate_number
quantity = province_kill_request.quantity
sale_in_province = province_check.poultry_request.free_sale_in_province
amount = province_check.poultry_request.amount
chicken_breed = province_check.poultry_request.chicken_breed
poultry_name = province_check.poultry_request.poultry.unit_name
poultry_mobile = province_check.poultry_request.poultry.user.mobile
date_str = str(province_check.poultry_request.send_date)
send_date = 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)
province = province_check.poultry_request.poultry.address.province.name
city = province_check.poultry_request.poultry.address.city.name
province_kill_request_to_kill_house_sms(kill_house_mobile, quantity, chicken_breed, send_date,
poultry_name,
poultry_mobile, province, city, sale_in_province, amount,
kill_house_name
)
if kill_house_second_mobile != None:
province_kill_request_to_kill_house_sms_threading = threading.Thread(
target=province_kill_request_to_kill_house_sms,
args=(
kill_house_second_mobile, quantity, chicken_breed, send_date,
poultry_name,
poultry_mobile, province, city, sale_in_province, amount,
kill_house_name
))
province_kill_request_to_kill_house_sms_threading.start()
if not KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=now).exists():
ware_house_date = datetime(year=now.year, month=now.month, day=now.day, hour=1, minute=12, second=20)
kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_house,
date=ware_house_date
)
kill_house_ware_house.save()
if base_url_sms == 'ha':
poultry_name = province_kill_request.province_request.poultry_request.poultry.unit_name
poultry_mobile = province_kill_request.province_request.poultry_request.poultry.user.mobile
quantity = province_kill_request.main_quantity
Index_weight = province_kill_request.province_request.poultry_request.Index_weight
kill_house_name = province_kill_request.killhouse_user.name
kill_house_mobile = province_kill_request.killhouse_user.kill_house_operator.user.mobile
date_str = str(
province_kill_request.province_request.poultry_request.send_date)
send_date = 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)
# city = province_kill_request.province_request.poultry_request.poultry.address.city.name
# vet_farm = VetFarm.objects.filter(
# poultry=province_kill_request.province_request.poultry_request.poultry).first()
# sms_allocation_for_vet_farm(poultry_name, poultry_mobile,
# quantity, Index_weight, kill_house_name, kill_house_mobile, city, send_date,
# vet_farm.vet.user.mobile)
create_update_chicken_commission_prices()
bot_eitaa_for_each_province_kill_request(province_kill_request, vet_farm)
return Response(dict1, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
# تابع مربوط به نمایش تخصیصات به کشتارگاها توسط استان
def list(self, request, *args, **kwargs):
now = datetime.now().date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
# refresh(request.user.id)
info_dict_list = []
exclusive_killer = False
info_list = []
province_kill_reqs = []
if 'role' in request.GET:
if request.GET['role'] == 'KillHouse':
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
kill_house = KillHouse.objects.filter(kill_house_operator__user=user,
trash=False)
if 'car' in request.GET:
if KillHousePercentage.objects.filter(kill_house_for_killer__in=kill_house,
kill_house__type='exclusive').exists():
exclusive_killer = True
province_kill_reqs = ProvinceKillRequest.objects.filter(
Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house),
province_request__poultry_request__send_date__date__gte=date1,
province_request__poultry_request__send_date__date__lte=date2,
state='accepted',
return_to_province=False,
province_request__city_request_Poultry__poultry_request__final_state='pending',
trash=False, quantity__gt=0).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
# province_kill_reqs = [
# province_request for province_request in province_kill_req_lists
# if date1 <= province_request.province_request.poultry_request.send_date.date() <= date2
# ]
elif 'id' in request.GET:
poultry_request = PoultryRequest.objects.get(id=int(request.GET['id']))
province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted',
killhouse_user__in=kill_house,
province_request__city_request_Poultry__poultry_request=poultry_request,
province_request__city_request_Poultry__poultry_request__final_state='pending',
trash=False).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
elif 'allocations' in request.GET:
if 'date1' in request.GET and 'date2' in request.GET:
trash = True if 'deleted_object' in request.GET else False
province_kill_requests = ProvinceKillRequest.objects.filter(
Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house),
trash=trash,
delete_message__isnull=False if trash else True,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
temporary_trash=False, temporary_deleted=False
).select_related(
'province_request__poultry_request__poultry',
'province_request__city_request_Poultry__poultry_request__poultry__user',
'province_request__city_request_Poultry__poultry_request__poultry__user__city',
'kill_request__kill_house',
'kill_request__kill_house__kill_house_operator__user',
'kill_request__kill_house__system_address__city'
).values(
"province_request__poultry_request__order_code",
"province_request__poultry_request__amount",
"province_request__poultry_request__financial_operation",
"province_request__poultry_request__Index_weight",
"province_request__poultry_request__send_date",
"province_request__poultry_request__freezing",
"province_request__poultry_request__export",
"province_request__poultry_request__poultry__unit_name",
"province_request__poultry_request__poultry__user__fullname",
"province_request__city_request_Poultry__poultry_request__poultry__user__mobile",
"province_request__city_request_Poultry__poultry_request__poultry__user__city__name",
"province_request__poultry_request__quantity",
"kill_request__market",
"kill_request__kill_house__name",
"kill_request__kill_house__kill_house_operator__user__mobile",
"kill_request__kill_house__system_address__city__name",
"create_date",
"main_quantity",
"quantity",
"return_to_province",
"returner",
"key",
"state",
"kill_house_price",
"province_request__poultry_request__union",
"province_request__poultry_request__direct_buying",
"province_request__poultry_request__free_sale_in_province",
# "allocated_car_state"
).order_by('province_request__poultry_request__send_date')
value = request.GET.get('value')
search = request.GET.get('search')
if value and search == 'filter':
if value != 'undefined' and value.strip():
province_kill_requests = province_kill_requests.filter(
build_query(self.filterset_class, value)
)
province_kill_reqs_list_final_state = []
for request_data in province_kill_requests:
allocated_car_state = True if request_data.get('main_quantity') != request_data.get(
'quantity') else False
internal_dict = {
"order_code": request_data.get('province_request__poultry_request__order_code'),
"freezing": request_data.get('province_request__poultry_request__freezing'),
"export": request_data.get('province_request__poultry_request__export'),
"amount": request_data.get('province_request__poultry_request__amount'),
"financial_operation": request_data.get(
'province_request__poultry_request__financial_operation'),
"index_weight": request_data.get('province_request__poultry_request__Index_weight'),
"total_weight": request_data.get('main_quantity') * request_data.get(
'province_request__poultry_request__Index_weight'),
"send_date": request_data.get('province_request__poultry_request__send_date'),
"poultry_unit_name": request_data.get(
'province_request__poultry_request__poultry__unit_name'),
"poultry_full_name": request_data.get(
'province_request__poultry_request__poultry__user__fullname'),
"poultry_mobile": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'),
"poultry_city": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'),
"poultry_quantity": request_data.get('province_request__poultry_request__quantity'),
"kill_house_name": request_data.get('kill_request__kill_house__name'),
"market": request_data.get('kill_request__market'),
"kill_house_mobile": request_data.get(
'kill_request__kill_house__kill_house_operator__user__mobile'),
"kill_house_city": request_data.get(
'kill_request__kill_house__system_address__city__name'),
"date_of_allocate": request_data.get('create_date'),
"allocated_quantity": request_data.get('main_quantity'),
"return_to_province": request_data.get('return_to_province'),
"returner": request_data.get('returner'),
"allocated_remain_quantity": request_data.get('quantity') if request_data.get(
'return_to_province') == False else 0,
"province_kill_request_key": request_data.get('key'),
"allocated_state": request_data.get('state'),
"union": request_data.get('province_request__poultry_request__union'),
"direct_buying": request_data.get(
'province_request__poultry_request__direct_buying'),
"allocated_car_state": allocated_car_state,
"free_sale_in_province": request_data.get(
'province_request__poultry_request__free_sale_in_province'),
"kill_house_price": request_data.get('kill_house_price')
}
province_kill_reqs_list_final_state.append(internal_dict)
return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK)
elif 'allocated_car_state' in request.GET:
if 'date1' in request.GET and 'date2' in request.GET:
trash = True if 'deleted_object' in request.GET else False
province_kill_requests = ProvinceKillRequest.objects.filter(
Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house),
trash=trash,
delete_message__isnull=False if trash else True,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
temporary_trash=False, temporary_deleted=False, first_car_allocated_quantity=0
).select_related(
'province_request__poultry_request__poultry',
'province_request__city_request_Poultry__poultry_request__poultry__user',
'province_request__city_request_Poultry__poultry_request__poultry__user__city',
'kill_request__kill_house',
'kill_request__kill_house__kill_house_operator__user',
'kill_request__kill_house__system_address__city'
).values(
"province_request__poultry_request__order_code",
"province_request__poultry_request__amount",
"province_request__poultry_request__financial_operation",
"province_request__poultry_request__Index_weight",
"province_request__poultry_request__send_date",
"province_request__poultry_request__freezing",
"province_request__poultry_request__export",
"province_request__poultry_request__poultry__unit_name",
"province_request__poultry_request__poultry__user__fullname",
"province_request__city_request_Poultry__poultry_request__poultry__user__mobile",
"province_request__city_request_Poultry__poultry_request__poultry__user__city__name",
"province_request__poultry_request__quantity",
"kill_request__kill_house__name",
"kill_request__market",
"kill_request__kill_house__kill_house_operator__user__mobile",
"kill_request__kill_house__system_address__city__name",
"create_date",
"main_quantity",
"quantity",
"return_to_province",
"returner",
"key",
"state",
"kill_house_price",
"province_request__poultry_request__union",
"province_request__poultry_request__direct_buying",
"province_request__poultry_request__free_sale_in_province",
# "allocated_car_state"
).order_by('province_request__poultry_request__send_date')
value = request.GET.get('value')
search = request.GET.get('search')
if value and search == 'filter':
if value != 'undefined' and value.strip():
province_kill_requests = province_kill_requests.filter(
build_query(self.filterset_class, value)
)
province_kill_reqs_list_final_state = []
for request_data in province_kill_requests:
allocated_car_state = True if request_data.get('main_quantity') != request_data.get(
'quantity') else False
internal_dict = {
"order_code": request_data.get('province_request__poultry_request__order_code'),
"freezing": request_data.get('province_request__poultry_request__freezing'),
"export": request_data.get('province_request__poultry_request__export'),
"amount": request_data.get('province_request__poultry_request__amount'),
"financial_operation": request_data.get(
'province_request__poultry_request__financial_operation'),
"index_weight": request_data.get('province_request__poultry_request__Index_weight'),
"total_weight": request_data.get('main_quantity') * request_data.get(
'province_request__poultry_request__Index_weight'),
"send_date": request_data.get('province_request__poultry_request__send_date'),
"poultry_unit_name": request_data.get(
'province_request__poultry_request__poultry__unit_name'),
"poultry_full_name": request_data.get(
'province_request__poultry_request__poultry__user__fullname'),
"poultry_mobile": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'),
"poultry_city": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'),
"poultry_quantity": request_data.get('province_request__poultry_request__quantity'),
"kill_house_name": request_data.get('kill_request__kill_house__name'),
"market": request_data.get('kill_request__market'),
"kill_house_mobile": request_data.get(
'kill_request__kill_house__kill_house_operator__user__mobile'),
"kill_house_city": request_data.get(
'kill_request__kill_house__system_address__city__name'),
"date_of_allocate": request_data.get('create_date'),
"allocated_quantity": request_data.get('main_quantity'),
"return_to_province": request_data.get('return_to_province'),
"returner": request_data.get('returner'),
"allocated_remain_quantity": request_data.get('quantity') if request_data.get(
'return_to_province') == False else 0,
"province_kill_request_key": request_data.get('key'),
"allocated_state": request_data.get('state'),
"union": request_data.get('province_request__poultry_request__union'),
"direct_buying": request_data.get(
'province_request__poultry_request__direct_buying'),
"allocated_car_state": allocated_car_state,
"free_sale_in_province": request_data.get(
'province_request__poultry_request__free_sale_in_province'),
"kill_house_price": request_data.get('kill_house_price')
}
province_kill_reqs_list_final_state.append(internal_dict)
return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK)
else:
province_kill_reqs = ProvinceKillRequest.objects.filter(
province_request__poultry_request__send_date__date__gte=date1,
province_request__poultry_request__send_date__date__lte=date2, killhouse_user__in=kill_house,
province_request__city_request_Poultry__poultry_request__final_state='pending',
trash=False,
state='pending',
dont_show_kill_house=False).select_related('province_request__poultry_request').order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
# province_kill_reqs = [
# province_request for province_request in province_kill_req_list
# if date1 <= province_request.province_request.poultry_request.send_date.date() <= date2
# ]
elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Supporter']:
if 'id' in request.GET:
poultry_request = PoultryRequest.objects.get(id=int(request.GET['id']))
province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted',
province_request__city_request_Poultry__poultry_request=poultry_request,
trash=False).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
elif 'allocations' in request.GET:
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
trash = True if 'deleted_object' in request.GET else False
province_kill_requests = ProvinceKillRequest.objects.filter(
province_request__city_request_Poultry__poultry_request__poultry__user__province=user.province,
trash=trash,
delete_message__isnull=False if trash else True,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
temporary_trash=False, temporary_deleted=False
).select_related(
'province_request__poultry_request__poultry',
'province_request__city_request_Poultry__poultry_request__poultry__user',
'province_request__city_request_Poultry__poultry_request__poultry__user__city',
'kill_request__kill_house',
'kill_request__kill_house__kill_house_operator__user',
'kill_request__kill_house__system_address__city'
).values(
"province_request__poultry_request__order_code",
"province_request__poultry_request__amount",
"province_request__poultry_request__financial_operation",
"province_request__poultry_request__Index_weight",
"province_request__poultry_request__send_date",
"province_request__poultry_request__freezing",
"province_request__poultry_request__export",
"province_request__poultry_request__poultry__unit_name",
"province_request__poultry_request__poultry__user__fullname",
"province_request__city_request_Poultry__poultry_request__poultry__user__mobile",
"province_request__city_request_Poultry__poultry_request__poultry__user__city__name",
"province_request__poultry_request__quantity",
"kill_request__kill_house__name",
"kill_request__market",
"kill_request__kill_house__kill_house_operator__user__mobile",
"kill_request__kill_house__system_address__city__name",
"create_date",
"main_quantity",
"quantity",
"return_to_province",
"returner",
"key",
"state",
"kill_house_price",
"province_request__poultry_request__union",
"province_request__poultry_request__direct_buying",
"province_request__poultry_request__free_sale_in_province",
# "allocated_car_state"
).order_by('province_request__poultry_request__send_date')
value = request.GET.get('value')
search = request.GET.get('filter')
if value and search == 'search':
if value != 'undefined' and value.strip():
province_kill_requests = province_kill_requests.filter(
build_query(self.filterset_class, value)
)
province_kill_reqs_list_final_state = []
for request_data in province_kill_requests:
allocated_car_state = True if request_data.get('main_quantity') != request_data.get(
'quantity') else False
internal_dict = {
"order_code": request_data.get('province_request__poultry_request__order_code'),
"freezing": request_data.get('province_request__poultry_request__freezing'),
"export": request_data.get('province_request__poultry_request__export'),
"amount": request_data.get('province_request__poultry_request__amount'),
"financial_operation": request_data.get(
'province_request__poultry_request__financial_operation'),
"index_weight": request_data.get('province_request__poultry_request__Index_weight'),
"total_weight": request_data.get('main_quantity') * request_data.get(
'province_request__poultry_request__Index_weight'),
"send_date": request_data.get('province_request__poultry_request__send_date'),
"poultry_unit_name": request_data.get(
'province_request__poultry_request__poultry__unit_name'),
"poultry_full_name": request_data.get(
'province_request__poultry_request__poultry__user__fullname'),
"poultry_mobile": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'),
"poultry_city": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'),
"poultry_quantity": request_data.get('province_request__poultry_request__quantity'),
"kill_house_name": request_data.get('kill_request__kill_house__name'),
"market": request_data.get('kill_request__market'),
"kill_house_mobile": request_data.get(
'kill_request__kill_house__kill_house_operator__user__mobile'),
"kill_house_city": request_data.get(
'kill_request__kill_house__system_address__city__name'),
"date_of_allocate": request_data.get('create_date'),
"allocated_quantity": request_data.get('main_quantity'),
"return_to_province": request_data.get('return_to_province'),
"returner": request_data.get('returner'),
"allocated_remain_quantity": request_data.get('quantity') if request_data.get(
'return_to_province') == False else 0,
"province_kill_request_key": request_data.get('key'),
"allocated_state": request_data.get('state'),
"union": request_data.get('province_request__poultry_request__union'),
"direct_buying": request_data.get(
'province_request__poultry_request__direct_buying'),
"allocated_car_state": allocated_car_state,
"free_sale_in_province": request_data.get(
'province_request__poultry_request__free_sale_in_province'),
"kill_house_price": request_data.get('kill_house_price')
}
province_kill_reqs_list_final_state.append(internal_dict)
return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK)
elif 'allocated_car_state' in request.GET:
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
trash = True if 'deleted_object' in request.GET else False
province_kill_requests = ProvinceKillRequest.objects.filter(
province_request__city_request_Poultry__poultry_request__poultry__user__province=user.province,
trash=trash,
delete_message__isnull=False if trash else True,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
temporary_trash=False, temporary_deleted=False, first_car_allocated_quantity=0
).select_related(
'province_request__poultry_request__poultry',
'province_request__city_request_Poultry__poultry_request__poultry__user',
'province_request__city_request_Poultry__poultry_request__poultry__user__city',
'kill_request__kill_house',
'kill_request__kill_house__kill_house_operator__user',
'kill_request__kill_house__system_address__city'
).values(
"province_request__poultry_request__order_code",
"province_request__poultry_request__amount",
"province_request__poultry_request__financial_operation",
"province_request__poultry_request__Index_weight",
"province_request__poultry_request__send_date",
"province_request__poultry_request__freezing",
"province_request__poultry_request__export",
"province_request__poultry_request__poultry__unit_name",
"province_request__poultry_request__poultry__user__fullname",
"province_request__city_request_Poultry__poultry_request__poultry__user__mobile",
"province_request__city_request_Poultry__poultry_request__poultry__user__city__name",
"province_request__poultry_request__quantity",
"kill_request__kill_house__name",
"kill_request__market",
"kill_request__kill_house__kill_house_operator__user__mobile",
"kill_request__kill_house__system_address__city__name",
"create_date",
"main_quantity",
"quantity",
"return_to_province",
"returner",
"key",
"state",
"kill_house_price",
"province_request__poultry_request__union",
"province_request__poultry_request__direct_buying",
"province_request__poultry_request__free_sale_in_province",
# "allocated_car_state"
).order_by('province_request__poultry_request__send_date')
value = request.GET.get('value')
search = request.GET.get('filter')
if value and search == 'search':
if value != 'undefined' and value.strip():
province_kill_requests = province_kill_requests.filter(
build_query(self.filterset_class, value)
)
province_kill_reqs_list_final_state = []
for request_data in province_kill_requests:
allocated_car_state = True if request_data.get('main_quantity') != request_data.get(
'quantity') else False
internal_dict = {
"order_code": request_data.get('province_request__poultry_request__order_code'),
"freezing": request_data.get('province_request__poultry_request__freezing'),
"export": request_data.get('province_request__poultry_request__export'),
"amount": request_data.get('province_request__poultry_request__amount'),
"financial_operation": request_data.get(
'province_request__poultry_request__financial_operation'),
"index_weight": request_data.get('province_request__poultry_request__Index_weight'),
"total_weight": request_data.get('main_quantity') * request_data.get(
'province_request__poultry_request__Index_weight'),
"send_date": request_data.get('province_request__poultry_request__send_date'),
"poultry_unit_name": request_data.get(
'province_request__poultry_request__poultry__unit_name'),
"poultry_full_name": request_data.get(
'province_request__poultry_request__poultry__user__fullname'),
"poultry_mobile": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__mobile'),
"poultry_city": request_data.get(
'province_request__city_request_Poultry__poultry_request__poultry__user__city__name'),
"poultry_quantity": request_data.get('province_request__poultry_request__quantity'),
"kill_house_name": request_data.get('kill_request__kill_house__name'),
"market": request_data.get('kill_request__market'),
"kill_house_mobile": request_data.get(
'kill_request__kill_house__kill_house_operator__user__mobile'),
"kill_house_city": request_data.get(
'kill_request__kill_house__system_address__city__name'),
"date_of_allocate": request_data.get('create_date'),
"allocated_quantity": request_data.get('main_quantity'),
"return_to_province": request_data.get('return_to_province'),
"returner": request_data.get('returner'),
"allocated_remain_quantity": request_data.get('quantity') if request_data.get(
'return_to_province') == False else 0,
"province_kill_request_key": request_data.get('key'),
"allocated_state": request_data.get('state'),
"union": request_data.get('province_request__poultry_request__union'),
"direct_buying": request_data.get(
'province_request__poultry_request__direct_buying'),
"allocated_car_state": allocated_car_state,
"free_sale_in_province": request_data.get(
'province_request__poultry_request__free_sale_in_province'),
"kill_house_price": request_data.get('kill_house_price')
}
province_kill_reqs_list_final_state.append(internal_dict)
return Response(province_kill_reqs_list_final_state, status=status.HTTP_200_OK)
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()
if 'id' in request.GET:
poultry_request = PoultryRequest.objects.get(id=int(request.GET['id']))
province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted',
killhouse_user=kill_house_vet.kill_house,
province_request__city_request_Poultry__poultry_request=poultry_request,
trash=False).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
else:
province_kill_reqs = ProvinceKillRequest.objects.filter(killhouse_user=kill_house_vet.kill_house,
trash=False).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
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)
for vet_farm in vet_farms:
if vet_farm.poultry in poultries:
pass
else:
poultries.append(vet_farm.poultry)
if len(poultries) == 0:
return Response([], status=status.HTTP_200_OK)
province_kill_reqs = ProvinceKillRequest.objects.filter(
province_request__poultry_request__poultry__in=poultries,
province_request__poultry_request__poultry__address__province=vet.user.province,
trash=False).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
elif request.GET['role'] == 'VetSupervisor':
vet = VetSupervisor.objects.get(user=user, trash=False)
province_kill_reqs = ProvinceKillRequest.objects.filter(
province_request__poultry_request__poultry__address__province=vet.user.province,
trash=False).order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
else:
if 'state' in request.GET:
if request.GET['state'] == 'accepted':
province_kill_reqs = ProvinceKillRequest.objects.filter(state='accepted', trash=False)
else:
province_kill_reqs = ProvinceKillRequest.objects.filter(vet_state='accepted', trash=False)
if len(province_kill_reqs) == 0:
return Response(province_kill_reqs, status=status.HTTP_200_OK)
value = request.GET.get('value')
search = request.GET.get('search')
if value and search == 'filter':
if value != 'undefined' and value.strip():
province_kill_reqs = province_kill_reqs.filter(
build_query(self.filterset_class, value)
)
for province_kill_req in province_kill_reqs:
check_key = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_req)
if check_key.count() > 0:
check_key = check_key.last().key
else:
check_key = None
internal_dict_infos = {
"poultry_req_id": province_kill_req.province_request.city_request_Poultry.poultry_request.id,
"freezing": province_kill_req.province_request.city_request_Poultry.poultry_request.freezing,
"direct_buying": province_kill_req.province_request.city_request_Poultry.poultry_request.direct_buying,
"export": province_kill_req.province_request.city_request_Poultry.poultry_request.export,
"amount": province_kill_req.province_request.city_request_Poultry.poultry_request.amount,
"financial_operation": province_kill_req.province_request.city_request_Poultry.poultry_request.financial_operation,
"poultry_req_key": province_kill_req.province_request.city_request_Poultry.poultry_request.key,
"province_kill_req_key": province_kill_req.key,
"poultry_name": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.user.fullname,
"order_code": province_kill_req.province_request.city_request_Poultry.poultry_request.order_code,
"send_date": province_kill_req.province_request.city_request_Poultry.poultry_request.send_date,
"city": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.address.city.name,
"province": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.user.province.name,
"poultry_mobile": province_kill_req.province_request.city_request_Poultry.poultry_request.poultry.user.mobile,
"kill_house_key": province_kill_req.kill_request.kill_house.key,
"kill_house_check_key": check_key,
"kill_house_name": province_kill_req.kill_request.kill_house.name,
"kill_house_mobile": province_kill_req.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": province_kill_req.quantity if province_kill_req.return_to_province == False else 0,
"main_quantity": province_kill_req.main_quantity,
"time": province_kill_req.kill_request.recive_time,
"date": province_kill_req.kill_request.recive_date,
"age": (
datetime.now() - province_kill_req.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1,
"province_kill_req": province_kill_req.key,
"return_to_province": province_kill_req.return_to_province,
"returner": province_kill_req.returner,
"kill_request_key": province_kill_req.kill_request.key,
"market": province_kill_req.kill_request.market,
"province_kill_state": province_kill_req.state,
"allocated_quantity": province_kill_req.main_quantity - province_kill_req.quantity,
"remain_quantity": province_kill_req.quantity,
"chicken_breed": province_kill_req.kill_request.chicken_breed,
"index_weight": province_kill_req.province_request.poultry_request.Index_weight,
"total_weight": province_kill_req.main_quantity * province_kill_req.province_request.poultry_request.Index_weight,
"province_kill_reviewer": province_kill_req.reviewer,
"province_kill_clearance_code": province_kill_req.clearance_code,
"exclusive_killer": exclusive_killer,
"kill_house_price": province_kill_req.kill_house_price,
"province_kill_request_key": province_kill_req.key,
"kill_house_assignments": "",
"free_sale_in_province": province_kill_req.province_request.poultry_request.free_sale_in_province,
}
kill_house_check = KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_req,
trash=False)
if kill_house_check:
kill_house_check = kill_house_check.last()
internal_dict_infos.update({
"kill_house_check_key": kill_house_check.key,
})
for kill_house_req_obj in KillHouseRequest.objects.filter(
province_kill_request=province_kill_req, trash=False):
internal_kill_house_request_dict_infos = {
"kill_house_req_key": kill_house_req_obj.key,
"kill_req_key": kill_house_req_obj.kill_request.key,
"barcod": kill_house_req_obj.bar_code,
"kill_house_state": kill_house_req_obj.state,
"kill_house_name": kill_house_req_obj.kill_request.kill_house.name,
"kill_house_user_name": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.fullname,
"kill_house_user_city": kill_house_req_obj.kill_request.kill_house.kill_house_operator.address.city.name,
"kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"cars": kill_house_req_obj.car,
"show_kill_house": kill_house_req_obj.show_kill_house,
"kill_house_message": kill_house_req_obj.kill_house_message,
}
info_list.append(internal_kill_house_request_dict_infos)
internal_dict_infos["kill_house_assignments"] = info_list
info_dict_list.append(internal_dict_infos)
return Response(info_dict_list, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.data['role']
request.data.pop('role')
if 'type' in request.data.keys():
if request.data['type'] == 'archive':
user_fullname = user.fullname
date = str(datetime.now())
archive_province_kill_request_wage_threading = threading.Thread(
target=provincearchiveprovincekillrequestforwage,
args=(
request.data['province_kill_request_list'], request.data['message'], role, user_fullname, date
))
archive_province_kill_request_wage_threading.start()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
elif request.data['type'] == 'return_archive':
user_fullname = user.fullname
date = str(datetime.now().date())
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'])
province_kill_request.archive_by_province = False
if 'return_archive_message' in request.data.keys():
province_kill_request.return_archive_message = request.data['return_archive_message']
province_kill_request.returner = {
"fullname": user_fullname,
"date": date,
"role": role
}
province_kill_request.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
elif 'edit_allocation_quantity' in request.data.keys():
wage = 0
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'],
trash=False)
if province_kill_request.market:
return Response({"result": "امکان ویرایش برای تخصیصات پنل معاملات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key,
trash=False)
if poultry_request.freezing == True:
wage_type = WageType.objects.filter(en_name='province-kill-request-freezing', trash=False).first()
else:
wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first()
if wage_type.status == True:
wage = wage_type.amount
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
if KillHouseRequest.objects.filter(trash=False, province_kill_request=province_kill_request).exists():
return Response({"result": "برای این تخصیص بارایجاد شده است امکان ویرایش وجود ندارد"},
status=status.HTTP_403_FORBIDDEN)
amount = province_kill_request.main_quantity
if request.data['quantity'] > amount:
different_amount = request.data['quantity'] - amount
province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
province_request__poultry_request=poultry_request)
total_quantity = \
province_kill_requests.aggregate(total=Sum('main_quantity'))['total'] or 0
if different_amount + total_quantity > poultry_request.quantity:
return Response({"result": "تعداد وارد شده بیشتر از اعلام نیاز مرغدار است!"},
status=status.HTTP_403_FORBIDDEN)
total_quantity_for_hatching = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
'total'] or 0
if different_amount + total_quantity_for_hatching > hatching.left_over:
return Response({"result": "تعداد وارد شده بیشتر از باقی مانده جوجه ریزی مرغدار است!"},
status=status.HTTP_403_FORBIDDEN)
province_kill_requests_for_kill_request = ProvinceKillRequest.objects.filter(trash=False,
return_to_province=False,
kill_request=province_kill_request.kill_request)
total_quantity_for_kill_request = \
province_kill_requests_for_kill_request.aggregate(total=Sum('main_quantity'))['total'] or 0
if province_kill_request.kill_request.kill_capacity < total_quantity_for_kill_request + different_amount:
return Response({"result": "تعداد وارد شده بیشتر از اعلام نیاز کشتارگاه است!"},
status=status.HTTP_403_FORBIDDEN)
province_kill_request.province_request.quantity -= different_amount
if province_kill_request.province_request.quantity < 0:
province_kill_request.province_request.quantity = 0
province_kill_request.province_request.save()
province_kill_request.kill_request.remain_quantity = province_kill_request.kill_request.kill_capacity - total_quantity_for_kill_request
province_kill_request.kill_request.remain_quantity -= different_amount
province_kill_request.kill_request.save()
poultry_request.remain_quantity -= different_amount
poultry_request.save()
else:
province_kill_requests_for_kill_request = ProvinceKillRequest.objects.filter(trash=False,
return_to_province=False,
kill_request=province_kill_request.kill_request)
total_quantity_for_kill_request = \
province_kill_requests_for_kill_request.aggregate(total=Sum('main_quantity'))['total'] or 0
different_amount = amount - request.data['quantity']
province_kill_request.province_request.quantity += different_amount
province_kill_request.province_request.save()
province_kill_request.kill_request.remain_quantity = province_kill_request.kill_request.kill_capacity - total_quantity_for_kill_request
province_kill_request.kill_request.remain_quantity += different_amount
province_kill_request.kill_request.save()
poultry_request.remain_quantity += different_amount
poultry_request.save()
province_kill_request.main_quantity = int(request.data['quantity'])
province_kill_request.total_killed_quantity = province_kill_request.main_quantity
province_kill_request.total_killed_weight = int(
province_kill_request.main_quantity * poultry_request.Index_weight)
province_kill_request.total_wage_amount = province_kill_request.total_killed_weight * province_kill_request.wage
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':
province_kill_request.union_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
province_kill_request.company_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
province_kill_request.guilds_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
province_kill_request.city_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'other':
province_kill_request.other_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.other_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
province_kill_request.wallet_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.wallet_share_percent = percentage_wage_type.percent
else:
province_kill_request.other_share = int(
(percentage_wage_type.percent / 100) * province_kill_request.total_wage_amount)
province_kill_request.other_share_percent = percentage_wage_type.percent
province_kill_request.save()
province_kill_request.save()
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
else:
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'])
request.data.pop('province_kill_request_key')
if 'kill_house_price' not in request.data.keys():
if province_kill_request.prev_total_amount == None:
province_kill_request.prev_total_amount = province_kill_request.total_amount
province_kill_request.total_amount_editor = {
"role": role,
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now())
}
province_kill_request.save()
serializer = self.serializer_class(province_kill_request)
serializer.update(instance=province_kill_request, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'delete_allocation' in request.GET:
province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'],
trash=False)
if request.GET['role'] == 'KillHouse':
if province_kill_request.market:
return Response({
"result": "امکان حذف برای تخصیص پنل معاملاتی وجود ندارد. در صورت نیاز به کاربر اتحادیه اطلاع دهید."},
status=status.HTTP_403_FORBIDDEN)
now = datetime.now()
now_time = now.time()
if now.date() != province_kill_request.kill_request.recive_date.date():
return Response({"result": "با توجه به مغایرت تاریخ امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if now_time.hour >= 16:
return Response({"result": "با توجه به اتمام زمان حذف مجاز امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if province_kill_request.quantity != province_kill_request.main_quantity:
return Response({"result": "برای تخصیص ماشین ثبت شده امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key,
trash=False)
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= province_kill_request.total_killed_weight
# hatching.free_killed_quantity -= int(province_kill_request.main_quantity * poultry_request.Index_weight)
hatching.free_quantity -= province_kill_request.total_killed_quantity
# hatching.free_quantity -= province_kill_request.main_quantity
else:
hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight
# hatching.governmental_killed_quantity -= int(
# province_kill_request.main_quantity * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_request.total_killed_quantity
# hatching.governmental_quantity -= province_kill_request.main_quantity
# hatching.killed_quantity -= province_kill_request.main_quantity
hatching.save()
if poultry_request.remain_quantity > 0:
# province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity
poultry_request.save()
else:
# province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity
poultry_request.save()
# poultry_request.quantity -= province_kill_request.quantity
# poultry_request.first_quantity -= province_kill_request.quantity
# poultry_request.previous_quantity -= province_kill_request.quantity
# poultry_request.save()
# if poultry_request.quantity == 0:
# poultry_request.trash = True
# poultry_request.save()
# hatching.left_over += province_kill_request.quantity
# hatching.state = 'pending'
# hatching.allow_hatching = 'pending'
# hatching.save()
kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
kill_request.remain_quantity += province_kill_request.main_quantity
if kill_request.market:
user = SystemUserProfile.objects.get(trash=False, user=request.user)
kill_request.market_state_message = {
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now())
}
kill_request.market_state = 'deleted'
else:
if kill_request.poultry_request:
kill_request.trash = True
kill_request.save()
province_kill_request.delete_message = request.GET['message']
province_kill_request.trash = True
user = SystemUserProfile.objects.get(user=request.user, trash=False)
province_kill_request.returner = {"fullname": user.fullname, "mobile": user.mobile,
"date": str(datetime.now())}
province_kill_request.save()
bot_eitaa_for_each_delete_province_kill_request(province_kill_request)
return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK)
elif 'return_allocation_quantity' in request.GET:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'],
trash=False)
if province_kill_request.quantity == 0:
return Response({"result": "باقی مانده تخصیص صفر است امکان بازگشت تعداد وجود ندارد"},
status=status.HTTP_403_FORBIDDEN)
amount = province_kill_request.quantity
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key,
trash=False)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
if province_kill_request.main_quantity - province_kill_request.quantity == 0:
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity
poultry_request.save()
kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
kill_request.remain_quantity += province_kill_request.main_quantity
if kill_request.market:
kill_request.market_state = 'deleted'
user = SystemUserProfile.objects.get(trash=False, user=request.user)
kill_request.market_state_message = {
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now())
}
else:
if kill_request.poultry_request:
kill_request.trash = True
kill_request.save()
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= province_kill_request.total_killed_weight
# hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.free_quantity -= province_kill_request.total_killed_quantity
# hatching.free_quantity -= amount
else:
hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight
# hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_request.total_killed_quantity
# hatching.governmental_quantity -= amount
# hatching.killed_quantity -= amount
hatching.save()
# province_kill_request.trash = True
province_kill_request.quantity = 0
province_kill_request.total_killed_quantity = 0
province_kill_request.total_killed_weight = 0
province_kill_request.return_to_province = True
province_kill_request.returner = {"fullname": user.fullname, "mobile": user.mobile,
"date": str(datetime.now())}
province_kill_request.save()
bot_eitaa_for_each_delete_province_kill_request(province_kill_request)
else:
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity - province_kill_request.quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity
poultry_request.save()
kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
kill_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity
kill_request.save()
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= int((
province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight)
# hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.free_quantity -= province_kill_request.total_killed_quantity
# hatching.free_quantity -= amount
else:
hatching.governmental_killed_quantity -= int((
province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight)
# hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_request.main_quantity - province_kill_request.quantity
# hatching.governmental_quantity -= amount
# hatching.killed_quantity -= amount
hatching.save()
province_kill_request.main_quantity = province_kill_request.main_quantity - province_kill_request.quantity
province_kill_request.quantity = 0
province_kill_request.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
queryset = ProvinceKillRequest.objects.get(key=request.GET['key'])
poultry_request = PoultryRequest.objects.get(key=queryset.province_request.poultry_request.key)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
check = KillHouseCheckRequest.objects.filter(province_kill_request=queryset, state='accepted')
if check.count() > 0:
return Response({"result": "can not delete"}, status=status.HTTP_403_FORBIDDEN)
province = ProvinceCheckOperatorRequest.objects.get(key=queryset.province_request.key)
province.quantity += queryset.quantity
province.save()
kill_request = KillRequest.objects.get(key=queryset.kill_request.key)
kill_request.remain_quantity += queryset.quantity
kill_request.save()
# queryset.delete()
poultry_request.remain_quantity += queryset.quantity
poultry_request.save()
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= queryset.total_killed_weight
# hatching.free_killed_quantity -= int(queryset.quantity * poultry_request.Index_weight)
hatching.free_quantity -= queryset.total_killed_quantity
else:
hatching.governmental_killed_quantity -= queryset.total_killed_weight
# hatching.governmental_killed_quantity -= int(
# queryset.quantity * poultry_request.Index_weight)
hatching.governmental_quantity -= queryset.total_killed_quantity
# hatching.killed_quantity -= queryset.total_killed_quantity
hatching.save()
bot_eitaa_for_each_delete_province_kill_request(queryset)
queryset.delete()
return Response(status=status.HTTP_200_OK)
class KillHouseWageForTotalDashbordViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseWageForTotalDashbordSerializer
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).first()
serializer = self.get_serializer(kill_house)
return Response(serializer.data, status=status.HTTP_200_OK)
class ProvinceKillRequestProvinceWageViewSet(viewsets.ModelViewSet):
queryset = ProvinceKillRequest.objects.all()
serializer_class = ProvinceKillRequestProvinceWageSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = ProvinceKillRequestFilterSet
filterset_fields = [
'province_request__poultry_request__chicken_breed',
'province_request__poultry_request__order_code',
'province_request__poultry_request__poultry__address__city__name',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if 'type' in request.GET:
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX', 'Company', 'Guilds', 'Supporter']:
if request.GET['type'] == 'unpaid':
if 'date1' in request.GET:
if request.GET['role'] == 'ProvinceOperator':
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
union_share__gt=0,
trash=False).order_by('kill_request__recive_date')
elif request.GET['role'] == 'Company':
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
company_share__gt=0,
trash=False).order_by('kill_request__recive_date')
elif request.GET['role'] == 'Guilds':
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
guilds_share__gt=0,
trash=False).order_by('kill_request__recive_date')
elif request.GET['role'] in ['SuperAdmin', 'AdminX', 'Supporter']:
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
trash=False).order_by('kill_request__recive_date')
else:
if request.GET['role'] == 'ProvinceOperator':
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
union_share__gt=0,
trash=False).order_by('kill_request__recive_date')
elif request.GET['role'] == 'Company':
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
company_share__gt=0,
trash=False).order_by('kill_request__recive_date')
elif request.GET['role'] == 'Guilds':
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
guilds_share__gt=0,
trash=False).order_by('kill_request__recive_date')
elif request.GET['role'] in ['SuperAdmin', 'AdminX', 'Supporter']:
province_kill_request = self.queryset.filter(
killhouse_user__key=request.GET['kill_house_key'],
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
trash=False).order_by('kill_request__recive_date')
else:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
if request.GET['type'] == 'unpaid':
if 'date1' in request.GET:
province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
state__in=('pending', 'accepted'),
return_to_province=False,
archive_wage=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
trash=False).order_by('kill_request__recive_date')
else:
province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
state__in=('pending', 'accepted'), wage_pay=False,
archive_wage=False,
return_to_province=False,
trash=False).order_by('kill_request__recive_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 (self.filterset_class(
data=query,
queryset=province_kill_request
)
).filter():
ps = self.filterset_class(data=query, queryset=province_kill_request)
province_kill_request = ps.filter()
else:
province_kill_request = province_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(province_kill_request)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(province_kill_request, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# class ProvinceKillRequestProvinceWageViewSet(viewsets.ModelViewSet):
# queryset = ProvinceKillRequest.objects.all()
# serializer_class = ProvinceKillRequestProvinceWageSerializer
# pagination_class = CustomPagination
# permission_classes = [TokenHasReadWriteScope]
# filter_backends = [DjangoFilterBackend]
# filterset_class = ProvinceKillRequestFilterSet
# filterset_fields = [
# 'province_request__poultry_request__chicken_breed',
# 'province_request__poultry_request__order_code',
# 'province_request__poultry_request__poultry__address__city__name',
# 'province_request__poultry_request__poultry__user__mobile',
# 'province_request__poultry_request__poultry__user__fullname',
#
# ]
#
# def list(self, request, *args, **kwargs):
# if 'type' in request.GET:
# if 'date1' in request.GET:
# date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
#
# date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
#
# if request.GET['role'] in ['ProvinceOperator', 'SuperAdmin']:
# if request.GET['type'] == 'unpaid':
# if 'date1' in request.GET:
#
# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'],
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=False,
# return_to_province=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# trash=False).order_by('kill_request__recive_date')
# else:
# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'],
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=False,
# return_to_province=False,
# trash=False).order_by('kill_request__recive_date')
#
# elif request.GET['type'] == 'archive':
# if 'date1' in request.GET:
#
# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'],
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=True,
# return_to_province=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# trash=False).order_by('kill_request__recive_date')
# else:
# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'],
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=True,
# return_to_province=False,
#
# trash=False).order_by('kill_request__recive_date')
#
#
# else:
# if 'date1' in request.GET:
#
# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'],
# state__in=('pending', 'accepted'), wage_pay=True,
# archive_by_province=False,
# return_to_province=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# trash=False).order_by('kill_request__recive_date')
# else:
# province_kill_request = self.queryset.filter(killhouse_user__key=request.GET['kill_house_key'],
# state__in=('pending', 'accepted'), wage_pay=True,
# archive_by_province=False,
# return_to_province=False,
# trash=False).order_by('kill_request__recive_date')
#
# else:
# user = SystemUserProfile.objects.get(user=request.user, trash=False)
# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
#
# if request.GET['type'] == 'unpaid':
# if 'date1' in request.GET:
#
# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=False,
# return_to_province=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# trash=False).order_by('kill_request__recive_date')
# else:
# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=False,
# return_to_province=False,
# trash=False).order_by('kill_request__recive_date')
# elif request.GET['type'] == 'archive':
# if 'date1' in request.GET:
#
# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=True,
# return_to_province=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# trash=False).order_by('kill_request__recive_date')
# else:
#
# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
# state__in=('pending', 'accepted'), wage_pay=False,
# archive_by_province=True,
# return_to_province=False,
# trash=False).order_by('kill_request__recive_date')
#
# else:
#
# if 'date1' in request.GET:
#
# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
# state__in=('pending', 'accepted'), wage_pay=True,
# archive_by_province=False,
# return_to_province=False,
# kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=date2,
# trash=False).order_by('kill_request__recive_date')
# else:
# province_kill_request = self.queryset.filter(killhouse_user__in=kill_house,
# state__in=('pending', 'accepted'), wage_pay=True,
# archive_by_province=False,
# return_to_province=False,
# trash=False).order_by('kill_request__recive_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 (self.filterset_class(
# data=query,
# queryset=province_kill_request
# )
# ).filter():
# ps = self.filterset_class(data=query, queryset=province_kill_request)
# province_kill_request = ps.filter()
# else:
# province_kill_request = province_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(province_kill_request)
# if page is not None:
# serializer = self.get_serializer(page, many=True)
# return self.get_paginated_response(serializer.data)
#
# serializer = self.get_serializer(province_kill_request, many=True)
# return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به تایید یا رد تخصیص از سمت استان توسط کشتارگاه
class KillHouseCheckRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseCheckRequest.objects.all()
serializer_class = KillHouseCheckRequestSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به تایید یا رد تخصیص از سمت استان توسط کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
# role = request.data['role']
province_kill_house_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'],
trash=False)
kill_request = KillRequest.objects.get(id=province_kill_house_request.kill_request.id, trash=False)
request.data.pop('province_kill_request_key')
# request.data.pop('role')
province_check = ProvinceCheckOperatorRequest.objects.get(id=province_kill_house_request.province_request.id,
trash=False)
poultry_request = PoultryRequest.objects.get(key=province_check.poultry_request.key)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
if KillHouseCheckRequest.objects.filter(province_kill_request=province_kill_house_request,
trash=False).exists():
return Response({'result': 'already exist'}, status=status.HTTP_403_FORBIDDEN)
kill_house_check_request = serializer.create(validated_data=request.data)
kill_house_check_request.province_kill_request = province_kill_house_request
if kill_house_check_request.state == 'accepted':
province_kill_house_request.state = 'accepted'
province_kill_house_request.save()
# barcode = kill_house_request.bar_code
# driver_mobile = kill_house_request.car['driver_mobile']
# driver_name = kill_house_request.car['driver_name']
# quantity = kill_house_request.quantity
# kill_house = kill_house_request.kill_request.kill_house.name
# poultry = kill_house_request.province_request.city_request_Poultry.poultry_request.user.fullname
# province = kill_house_request.province_request.city_request_Poultry.poultry_request.user.address.province
# city = kill_house_request.province_request.city_request_Poultry.poultry_request.user.address.city
# address = kill_house_request.province_request.city_request_Poultry.poultry_request.user.address.address
# date = kill_house_request.province_request.city_request_Poultry.poultry_request.send_date.date()
# date = (str(jdatetime.datetime.fromgregorian(year=date.year, month=date.month, day=date.day).date()))
# time1 = kill_request.recive_time
# list1 = reversed(date.split('-'))
# s = "-"
# date1 = s.join(list1)
# time = reversed(kill_request.recive_time.split('-'))
# o = "-"
# time1 = o.join(time)
# driver_sms(driver_mobile, driver_name, quantity, poultry, barcode, province, city, address, date,
# time1,
# kill_house)
elif kill_house_check_request.state == 'rejected':
if poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= int(
province_kill_house_request.main_quantity * poultry_request.Index_weight)
hatching.free_killed_quantity -= province_kill_house_request.main_quantity
else:
hatching.governmental_killed_quantity -= int(
province_kill_house_request.main_quantity * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_house_request.main_quantity
# hatching.killed_quantity -= province_kill_house_request.main_quantity
hatching.save()
province_kill_house_request.state = 'rejected'
province_kill_house_request.message = kill_house_check_request.message
province_kill_house_request.save()
province_check.quantity += province_kill_house_request.quantity
province_check.save()
# kill_request.cars.append(kill_house_request.car)
kill_request.remain_quantity += province_kill_house_request.quantity
kill_request.save()
poultry_request.remain_quantity += province_kill_house_request.quantity
poultry_request.save()
# kill_house_check_request.role = {
# "role": role,
# "name": user.fullname,
# "mobile": user.mobile
# }
kill_house_check_request.save()
if kill_house_check_request.state == 'accepted':
# if SmsLicense.objects.filter().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()
province_operator_mobile = province_operator.user.mobile
province_operator_name = province_operator.user.fullname
kill_house_name = kill_house_check_request.province_kill_request.kill_request.kill_house.name
kill_house_mobile = kill_house_check_request.province_kill_request.kill_request.kill_house.kill_house_operator.user.mobile
quantity = kill_house_check_request.province_kill_request.quantity
chicken_breed = kill_house_check_request.province_kill_request.province_request.poultry_request.chicken_breed
poultry_name = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.unit_name
poultry_mobile = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.user.mobile
Index_weight = kill_house_check_request.province_kill_request.province_request.poultry_request.Index_weight
date_str = str(
kill_house_check_request.province_kill_request.province_request.poultry_request.send_date)
send_date = 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)
province = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.address.province.name
city = kill_house_check_request.province_kill_request.province_request.poultry_request.poultry.address.city.name
# kill_house_province_kill_request_accept_to_province_sms(province_operator_mobile,
# province_operator_name, quantity,
# chicken_breed, send_date, poultry_name,
# poultry_mobile, province, city, kill_house_name,
#
# )
kill_house_check_request_serializer = self.serializer_class(kill_house_check_request)
return Response(kill_house_check_request_serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
class KillHouseWareHouseAcceptedKillHouseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def update(self, request, pk=None, *args, **kwargs):
kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False)
request.data.pop('kill_house_request_key')
kill_house = kill_house_request.killhouse_user
bar_date = kill_house_request.kill_request.recive_date.date() + timedelta(days=1)
now = datetime.now().date()
product = RolesProducts.objects.filter(parent_product__product_id=2, kill_house=kill_house).first()
if not product:
return Response(
{"result": "جهت افزایش موجودی محصول ابتدا محصول را برای کشتارگاه ثبت کنید! "},
status=status.HTTP_403_FORBIDDEN)
if kill_house_request.date_of_ware_house:
if now != datetime.strptime(kill_house_request.date_of_ware_house, '%Y-%m-%d %H:%M:%S.%f').date():
return Response(
{"result": "بازه زمانی ویرایش این بار به اتمام رسیده ! "},
status=status.HTTP_403_FORBIDDEN)
input_weight = request.data['ware_house_accepted_real_weight'] if request.data[
'input_type'] == 'input_weight' else int(
kill_house_request.accepted_real_weight - (
(kill_house_request.accepted_real_weight * request.data['loss_percent']) / 100))
if kill_house_request.ware_house_accepted_real_weight > input_weight:
diffrence = kill_house_request.ware_house_accepted_real_weight - input_weight
if product.total_remain_weight - diffrence < 0:
return Response(
{"result": "به علت منفی شدن موجودی انبار امکان ویرایش وجود ندارد! "},
status=status.HTTP_403_FORBIDDEN)
if request.data['input_type'] == 'input_weight':
kill_house_request.ware_house_accepted_real_quantity = request.data['ware_house_accepted_real_quantity']
kill_house_request.ware_house_accepted_real_weight = request.data['ware_house_accepted_real_weight']
kill_house_request.weight_loss = request.data['loss_percent']
else:
# kill_house_request.ware_house_accepted_real_quantity = int(kill_house_request.accepted_real_quantity - (
# (kill_house_request.accepted_real_quantity * request.data['loss_percent']) / 100))
kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity
kill_house_request.ware_house_accepted_real_weight = int(kill_house_request.accepted_real_weight - (
(kill_house_request.accepted_real_weight * request.data['loss_percent']) / 100))
kill_house_request.weight_loss = request.data['loss_percent']
poultry_prediction(kill_house_request.province_request.poultry_request.poultry)
kill_house_request.ware_house_input_type = request.data['input_type']
kill_house_request.ware_house_confirmation = True
kill_house_request.date_of_ware_house = str(datetime.now())
govermental_commitment_percent = kill_house.in_province_governmental_selling_percent
free_commitment_percent = kill_house.in_province_free_selling_percent
if kill_house_request.province_request.poultry_request.free_sale_in_province:
kill_house_request.warehouse_commitment_weight = int(
(free_commitment_percent / 100) * kill_house_request.ware_house_accepted_real_weight)
else:
kill_house_request.warehouse_commitment_weight = int(
(govermental_commitment_percent / 100) * kill_house_request.ware_house_accepted_real_weight)
if 'input_warehouse' in request.data.keys():
if request.data['input_warehouse'] == 'self':
kill_house_request.input_warehouse = kill_house_request.killhouse_user
else:
kill_house_request.input_warehouse = kill_house_request.killer
product = RolesProducts.objects.filter(parent_product__product_id=2,
kill_house=kill_house_request.killer).first()
else:
kill_house_request.input_warehouse = kill_house_request.killhouse_user
kill_house_request.save()
kill_house_requests_product_warehousing(product)
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
# ویوست مربوط به ایجاد درخواست کشتار توسط کشتارگاه بعد از تخصیص
class KillHouseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به ایجاد درخواست کشتار توسط کشتارگاه بعد از تخصیص
def create(self, request, *args, **kwargs):
limitation_direct_purchase = LimitationForDirectPurchaseAndBarInformation.objects.filter(
trash=False, active=True).first()
is_in_limitation_range = False
if limitation_direct_purchase and limitation_direct_purchase.start_time and limitation_direct_purchase.end_time:
current_time = datetime.now().time()
if limitation_direct_purchase.start_time <= current_time <= limitation_direct_purchase.end_time:
is_in_limitation_range = True
if not is_in_limitation_range:
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") == "kill_house_request" and t.get("active", False)),
None)
if time:
start_hour = datetime.strptime(time.get("start", 0), "%H:%M:%S").time()
end_hour = datetime.strptime(time.get("end", 0), "%H:%M:%S").time()
current_hour = datetime.now().time().replace(second=0, microsecond=0)
if not (start_hour < current_hour < end_hour):
return Response(
{"result": "لطفا در ساعات مجاز برای ثبت درخواست اقدام نمایید!"},
status=status.HTTP_403_FORBIDDEN)
real_car = None
killer_for_kill_house = None
if 'real_car_key' in request.data.keys():
real_car = KillHouseADDCAR.objects.get(key=request.data['real_car_key'], trash=False)
request.data.pop('real_car_key')
date_time_of_now = datetime.now().date()
tomorrow = datetime.now().date() + timedelta(days=1)
role = request.data['role']
request.data.pop('role')
dict1 = {}
try:
kill_house_auction_winner_key = request.data['winner_key']
kill_house_auction_winner = KillHouseRequestActionWinner.objects.get(key=kill_house_auction_winner_key,
trash=False)
kill_house = kill_house_auction_winner.kill_house_request_auction.kill_house
request.data.pop('winner_key')
except:
kill_house_auction_winner = None
try:
kill_house_check_key = request.data['kill_house_check_key']
kill_house_check = KillHouseCheckRequest.objects.get(key=kill_house_check_key, trash=False)
kill_house = kill_house_check.province_kill_request.kill_request.kill_house
request.data.pop('kill_house_check_key')
except:
kill_house_check = None
if kill_house_check != None:
kill_house = KillHouse.objects.get(id=kill_house_check.province_kill_request.kill_request.kill_house.id,
trash=False)
kill_req = KillRequest.objects.get(id=kill_house_check.province_kill_request.kill_request.id, trash=False)
if OperationLimitation.objects.all().first().kill_house_allocation_limitation == True:
if date_time_of_now != kill_req.recive_date.date():
# if date_time_of_now > kill_req.recive_date.date() + timedelta(days=1):
return Response({"result": "مغایرت در تاریخ اعلام نیاز کشتار گاه و تاریخ تخصیص به خودرو !"},
status=status.HTTP_403_FORBIDDEN)
province_request = ProvinceCheckOperatorRequest.objects.get(
id=kill_house_check.province_kill_request.province_request.id, trash=False)
province_kill_request = ProvinceKillRequest.objects.get(id=kill_house_check.province_kill_request.id,
trash=False)
if province_kill_request.market:
if province_kill_request.first_car_allocated_quantity > 0:
if province_kill_request.total_killed_quantity + request.data[
'quantity'] > province_kill_request.main_quantity:
return Response(
{"result": "مجموع حجم ماشین های ایجاد شده بیشتر از تخصیص داده شده از پنل معاملات میباشد"},
status=status.HTTP_403_FORBIDDEN)
else:
if request.data['quantity'] > province_kill_request.main_quantity:
return Response(
{"result": "مجموع حجم ماشین های ایجاد شده بیشتر از تخصیص داده شده از پنل معاملات میباشد"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest.objects.get(key=province_request.poultry_request.key)
poultry_hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
user = province_request.city_request_Poultry.poultry_request.poultry.user
if province_kill_request.quantity == 0:
return Response({"result": "quantity is 0"}, status=status.HTTP_403_FORBIDDEN)
elif kill_house_auction_winner != None:
user = kill_house_auction_winner.kill_house_request_auction.poultry_request.poultry.user
kill_house = KillHouse.objects.get(id=kill_house_auction_winner.kill_house_request_auction.kill_house.id,
trash=False)
if 'killer_key' in request.data.keys():
if request.data['killer_key'] != None:
killer_for_kill_house = KillHouse.objects.get(key=request.data['killer_key'], trash=False)
if kill_house.id != killer_for_kill_house.id:
kill_house_purchase = KillHousePurchaseRequest.objects.filter(limitation=True,
kill_house=killer_for_kill_house).first()
if kill_house_purchase:
total_unpaid_wage = 0
total_paid_wage = 0
total_unpaid_wage = get_finance_info(killer_for_kill_house)['total_price']
slaughter_transactions = InternalTransaction.objects.filter(
kill_house=killer_for_kill_house, status='completed',
trash=False)
total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
total_amount = total_unpaid_wage - total_paid_wage
if total_amount >= kill_house_purchase.limitation_number:
return Response(
{
"result": "به علت بدهی کشتارکن اختصاصی امکان ایجاد بار برای کشتار کن امکان پذیر نیست!"},
status=status.HTTP_403_FORBIDDEN)
request.data.pop('killer_key')
car = request.data['car']
add_car = KillHouseADDCAR.objects.get(key=car['key'], trash=False)
request.data.pop('car')
if request.data['quantity'] > (poultry_hatching.left_over + province_kill_request.main_quantity + (
(poultry_hatching.quantity * 5) / 100)):
return Response({"result": "تعداد قطعه وارد شده بیشتراز مانده در سالن مرغدار است!"},
status=status.HTTP_403_FORBIDDEN)
if kill_house.max_kill_limit and kill_house.total_kill_capacity > 0:
extra_bar_kill_percent = (kill_house.extra_bar_kill_percent / 100) * kill_house.total_kill_capacity
total_province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
archive_wage=False,
state__in=('pending', 'accepted'),
killhouse_user=kill_house,
first_car_allocated_quantity=0,
kill_request__recive_date__date=kill_req.recive_date.date()).exclude(
id=kill_house_check.province_kill_request.id)
total_province_kill_requests_quantity_with_out_bar = \
total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))['total'] or 0
total_kill_house_requests = KillHouseRequest.objects.filter(trash=False,
archive_wage=False,
killhouse_user=kill_house,
kill_request__recive_date__date=kill_req.recive_date.date())
total_kill_house_requests_quantity = \
total_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0
if (
kill_house.total_kill_capacity + extra_bar_kill_percent) < total_kill_house_requests_quantity + \
request.data['quantity'] + total_province_kill_requests_quantity_with_out_bar:
return Response({"result": "تعداد وارد شده از مانده سهمیه کشتار روزانه کشتارگاه بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_request = serializer.create(validated_data=request.data)
kill_house_request.accepted_real_quantity = int(kill_house_request.quantity)
kill_house_request.accepted_real_weight = float(
kill_house_request.quantity) * kill_house_check.province_kill_request.province_request.poultry_request.Index_weight
if kill_house_check != None:
bar_code = KillHouseRequest.objects.filter(
province_request__city_request_Poultry__poultry_request__poultry__user=user, trash=False)
else:
bar_code = KillHouseRequest.objects.filter(
kill_house_request_auction_winner__kill_house_request_auction__poultry_request__poultry__user=user,
trash=False)
if bar_code.count() > 0:
bar_code = bar_code.order_by(
'create_date')
if bar_code.last().bar_code != None:
kill_house_request.bar_code = bar_code.last().bar_code + 1
else:
if kill_house_check != None:
kill_house_request.bar_code = int(
str(province_request.city_request_Poultry.poultry_request.order_code) + '0001')
else:
kill_house_request.bar_code = int(
str(kill_house_auction_winner.kill_house_request_auction.poultry_request.order_code) + '0001')
if kill_house_check != None:
kill_house_request.kill_request = kill_req
kill_house_request.province_request = province_request
kill_house_request.fee = kill_house_check.province_kill_request.fee
kill_house_request.province_kill_request = province_kill_request
kill_house_request.amount = province_kill_request.kill_house_price
if kill_house_check.state == 'accepted':
kill_house_request.state = "accepted"
kill_house_request.save()
else:
kill_house_request.kill_house_request_auction_winner = kill_house_auction_winner
kill_house_request.state = "accepted"
kill_house_request.fee = kill_house_auction_winner.fee
kill_house_request.auction = True
kill_house_auction_winner.quantity -= int(kill_house_request.quantity)
kill_house_auction_winner.save()
kill_house_request.role = {
'role': role,
'name': user.fullname,
'mobile': user.mobile
}
kill_house_request.save()
kill_house_request.car = car
kill_house_request.add_car = add_car
if real_car != None:
kill_house_request.real_add_car = real_car
if killer_for_kill_house != None:
kill_house_request.killer = killer_for_kill_house
kill_house_request.killhouse_user = kill_house
kill_house_request.show_kill_house = "accepted"
kill_house_request.save()
province_kill_request.first_car_allocated_quantity += kill_house_request.quantity
province_kill_request.save()
kill_house_request_serializer = self.serializer_class(kill_house_request)
ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house, date__date=tomorrow).first()
if not ware_house:
ware_house = KillHouseWareHouse(
kill_house=kill_house,
date=tomorrow
)
ware_house.save()
update_kill_house_requests(province_kill_request, poultry_request)
update_province_kill_requests(poultry_hatching)
poultry_prediction(poultry_hatching.poultry)
vet_farm = VetFarm.objects.filter(trash=False,
poultry=kill_house_request.province_request.poultry_request.poultry).first()
if vet_farm:
car_allocation_vet_farm_sms(kill_house_request.kill_request.recive_date.date(),
kill_house_request.province_request.poultry_request.poultry.user.fullname,
kill_house_request.province_request.poultry_request.hatching.chicken_age,
kill_house_request.quantity, kill_house_request.add_car.driver.type_car,
kill_house_request.traffic_code,
kill_house_request.add_car.driver.pelak,
kill_house_request.kill_request.kill_house.name,
vet_farm.vet.user.mobile,
kill_house_request.province_request.poultry_request.amount,
kill_house_request.province_request.poultry_request.free_sale_in_province)
if kill_house_check != None:
dict1 = {
"kill_house_req_key": str(kill_house_request.key),
"kill_req_key": kill_house_request.kill_request.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_city": kill_house_request.kill_request.kill_house.system_address.city.name,
"kill_house_mobile": kill_house_request.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_request.quantity,
"time": kill_house_request.kill_request.recive_time,
"date": kill_house_request.kill_request.recive_date,
"car": kill_house_request.car,
}
elif kill_house_auction_winner != None:
dict1 = {
"kill_house_req_key": str(kill_house_request.key),
"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_city": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.system_address.city.name,
"kill_house_mobile": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_request.quantity,
"date": kill_house_request.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date,
"car": kill_house_request.car,
}
# ارسال بار به ایتای دامپزشک (فقط برای همدان و در ساعات 16 تا 23:59)
if base_url_for_sms_report == 'ha':
current_hour = datetime.now().hour
if 16 <= current_hour <= 23:
try:
send_single_bar_to_eitaa(kill_house_request)
except Exception as e:
pass
return Response(dict1, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
# تابع مربوط به نمایش درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص
def list(self, request, *args, **kwargs):
from django.db.models import Q
info_dict = []
info_list = []
# refresh(request.user.id)
if request.GET['operator'] == 'ProvinceOperator':
queryset = KillHouseRequest.objects.filter(trash=False).order_by('create_date')
serializer = KillHouseRequestSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif request.GET['operator'] == 'VetSupervisor':
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
querysets_list = KillHouseRequest.objects.filter(
vet_state__in=('pending', 'accepted'),
active_state__in=('active', 'inactive'), trash=False).order_by(
'create_date')
queryset = [
queryset_list for queryset_list in querysets_list
if date1 <= queryset_list.province_request.poultry_request.send_date.date() <= date2
]
if len(queryset) > 0:
info_list = []
for kill_house_req_obj in queryset:
kill_place = kill_house_req_obj.kill_request.kill_house.name if not kill_house_req_obj.kill_request.slaughter_house else kill_house_req_obj.kill_request.slaughter_house.name
real_car = None
if kill_house_req_obj.real_add_car != None:
real_car = {
"real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name,
"real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile,
"real_pelak": kill_house_req_obj.real_add_car.driver.pelak,
"real_type_car": kill_house_req_obj.real_add_car.driver.type_car
}
exclusive_killer = None
if kill_house_req_obj.killer != None:
exclusive_killer = {
"killer_name": kill_house_req_obj.killer.name,
"killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile,
"killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname,
}
vet_check_date = None
vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first()
if vet_check:
vet_check_date = vet_check.create_date
if kill_house_req_obj.province_kill_request != None:
internal_dict_infos = {
"poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id,
"poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key,
"chicken_breed": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.chicken_breed,
"index_weight": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.Index_weight,
"amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount,
"bar_amount": kill_house_req_obj.amount,
"poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname,
"poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile,
"send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date,
"create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date,
"poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity,
"poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name,
"poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name,
"barcod": kill_house_req_obj.bar_code,
"order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code,
"freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing,
"kill_house_name": kill_house_req_obj.kill_request.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"accepted_real_quantity": kill_house_req_obj.accepted_real_quantity,
"accepted_real_weight": kill_house_req_obj.accepted_real_weight,
"kill_house_request_key": kill_house_req_obj.key,
"clearance_code": kill_house_req_obj.clearance_code,
"vet_state": kill_house_req_obj.vet_state,
"traffic_code": kill_house_req_obj.traffic_code,
"driver_name": kill_house_req_obj.add_car.driver.driver_name,
"driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile,
"pelak": kill_house_req_obj.add_car.driver.pelak,
"car_key": kill_house_req_obj.add_car.key,
"type_car": kill_house_req_obj.add_car.driver.type_car,
"real_car": real_car,
"killer": exclusive_killer,
"age": (
datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1,
"vet_check_date": vet_check_date,
"first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight,
"kill_place": kill_place,
"auction": "False"
}
elif kill_house_req_obj.kill_house_request_auction_winner != None:
internal_dict_infos = {
"poultry_request_id": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.id,
"poultry_request_key": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.key,
"poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname,
"mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile,
"city": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.city.name,
"province": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.province.name,
"send_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date,
"freezing": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.freezing,
"create_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.create_date,
"poultry_quantity": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.quantity,
"barcod": kill_house_req_obj.bar_code,
"kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"kill_house_request_key": kill_house_req_obj.key,
"auction": "True"
}
info_list.append(internal_dict_infos)
# info_dict.append(info_list)
return Response(info_list, status=status.HTTP_200_OK)
elif request.GET['operator'] == 'KillHouseVet':
user = SystemUserProfile.objects.get(user=request.user, trash=False)
# vet = Vet.objects.get(user=user, trash=False)
kill_house_vet = KillHouseVet.objects.filter(vet__user=user, trash=False)
kill_house_list = kill_house_vet.values_list('kill_house', flat=True).distinct()
# for kill_house in kill_house_vet:
# kill_house_list.append(kill_house.kill_house)
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
queryset = KillHouseRequest.objects.filter(
Q(killhouse_user__in=kill_house_list) | Q(
kill_request__slaughter_house__in=kill_house_list),
province_request__poultry_request__send_date__date__gte=date1,
province_request__poultry_request__send_date__date__lte=date2,
vet_state__in=('pending', 'accepted'),
active_state__in=('active', 'inactive'), trash=False).order_by(
'create_date')
# queryset = [
# queryset_list for queryset_list in querysets_list
# if date1 <= queryset_list.province_request.poultry_request.send_date.date() <= date2
# ]
if len(queryset) > 0:
info_dict = []
info_list = []
for kill_house_req_obj in queryset:
kill_place = kill_house_req_obj.kill_request.kill_house.name if not kill_house_req_obj.kill_request.slaughter_house else kill_house_req_obj.kill_request.slaughter_house.name
vet_check_date = None
real_car = None
if kill_house_req_obj.real_add_car != None:
real_car = {
"real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name,
"real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile,
"real_pelak": kill_house_req_obj.real_add_car.driver.pelak,
"real_type_car": kill_house_req_obj.real_add_car.driver.type_car
}
exclusive_killer = None
if kill_house_req_obj.killer != None:
exclusive_killer = {
"killer_name": kill_house_req_obj.killer.name,
"killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile,
"killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname,
}
vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first()
if vet_check:
vet_check_date = vet_check.create_date
if kill_house_req_obj.province_kill_request != None:
internal_dict_infos = {
"poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id,
"poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key,
"chicken_breed": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.chicken_breed,
"index_weight": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.Index_weight,
"amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount,
"bar_amount": kill_house_req_obj.amount,
"poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname,
"poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile,
"send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date,
"freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing,
"create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date,
"poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity,
"poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name,
"poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name,
"barcod": kill_house_req_obj.bar_code,
"order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code,
"kill_house_name": kill_house_req_obj.kill_request.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"accepted_real_quantity": kill_house_req_obj.accepted_real_quantity,
"accepted_real_weight": kill_house_req_obj.accepted_real_weight,
"kill_house_request_key": kill_house_req_obj.key,
"clearance_code": kill_house_req_obj.clearance_code,
"vet_state": kill_house_req_obj.vet_state,
"traffic_code": kill_house_req_obj.traffic_code,
"driver_name": kill_house_req_obj.add_car.driver.driver_name,
"driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile,
"pelak": kill_house_req_obj.add_car.driver.pelak,
"car_key": kill_house_req_obj.add_car.key,
"type_car": kill_house_req_obj.add_car.driver.type_car,
"real_car": real_car,
"killer": exclusive_killer,
"first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight,
"age": (
datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1,
"vet_check_date": vet_check_date,
"kill_place": kill_place,
"auction": "False"
}
elif kill_house_req_obj.kill_house_request_auction_winner != None:
internal_dict_infos = {
"poultry_request_id": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.id,
"poultry_request_key": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.key,
"poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname,
"mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile,
"city": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.city.name,
"province": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.province.name,
"send_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.send_date,
"freezing": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.freezing,
"create_date": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.create_date,
"poultry_quantity": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.quantity,
"barcod": kill_house_req_obj.bar_code,
"kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"kill_house_request_key": kill_house_req_obj.key,
"auction": "True"
}
info_list.append(internal_dict_infos)
# info_dict.append(info_list)
return Response(info_list, status=status.HTTP_200_OK)
elif request.GET['operator'] == 'KillHouse':
# info_dict = []
info_list = []
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
if 'role' in request.GET:
if request.GET['role'] == 'KillHouseVet':
vet = Vet.objects.filter(user=user, trash=False)
if vet.count() > 0:
kill_house_list = []
vet = vet.last()
kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False)
for k_vet in kill_house_vet:
kill_house_list.append(k_vet.kill_house)
# kill_house = KillHouse.objects.filter(key=kill_house_vet.kill_house.key, trash=False)
kill_house_allow_vet = KillHouseAllowVet.objects.filter(kill_house__in=kill_house_list)
if kill_house_allow_vet.count() > 0:
kill_house_allow_vet = kill_house_allow_vet.last()
if vet != None and kill_house_allow_vet.allow == False:
return Response(info_list)
kill_requests_list = KillHouseRequest.objects.filter((Q(killhouse_user__in=kill_house_list) | Q(
kill_request__slaughter_house__in=kill_house_list)),
active_state__in=('active', 'inactive'),
trash=False)
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
kill_requests = [
kill_request_list for kill_request_list in kill_requests_list
if date1 <= kill_request_list.kill_request.recive_date.date() <= date2
]
for kill_house_req_obj in kill_requests:
vet_check_date = None
real_car = None
if kill_house_req_obj.real_add_car != None:
real_car = {
"real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name,
"real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile,
"real_pelak": kill_house_req_obj.real_add_car.driver.pelak,
"real_type_car": kill_house_req_obj.real_add_car.driver.type_car
}
exclusive_killer = None
if kill_house_req_obj.killer != None:
exclusive_killer = {
"killer_name": kill_house_req_obj.killer.name,
"killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile,
"killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname,
}
vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first()
if vet_check:
vet_check_date = vet_check.create_date
if kill_house_req_obj.province_kill_request != None:
check = KillHouseCheckRequest.objects.get(
province_kill_request=kill_house_req_obj.province_kill_request)
bar_info = KillHouseAssignmentInformation.objects.filter(
kill_house_request=kill_house_req_obj)
if bar_info.count() > 0:
bar_info = bar_info.last()
assignment_info = {
"kill_house_assignment_key": bar_info.key,
"kill_house_weight_without_load": bar_info.car_weight_without_load,
"kill_house_weight_with_load": bar_info.car_weight_with_load,
"kill_house_image_without_load": bar_info.car_weight_without_load_image,
"kill_house_image_with_load": bar_info.car_weight_with_load_image,
"kill_house_net_weight": bar_info.net_weight,
"driver_name": bar_info.kill_house_request.add_car.driver.driver_name,
"pelak": bar_info.kill_house_request.add_car.driver.pelak,
"type_car": bar_info.kill_house_request.add_car.driver.type_car,
"kill_house_assignment_state": bar_info.state,
"real_quantity": bar_info.real_quantity,
}
else:
assignment_info = None
internal_dict_infos = {
"poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id,
"poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key,
"amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount,
"bar_amount": kill_house_req_obj.amount,
"poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname,
"poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile,
"send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date,
"freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing,
"create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date,
"poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity,
"poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name,
"poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name,
"barcod": kill_house_req_obj.bar_code,
"order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code,
"kill_house_name": kill_house_req_obj.kill_request.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"kill_house_request_key": kill_house_req_obj.key,
"vet_state": kill_house_req_obj.vet_state,
"traffic_code": kill_house_req_obj.traffic_code,
"driver_name": kill_house_req_obj.add_car.driver.driver_name,
"driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile,
"pelak": kill_house_req_obj.add_car.driver.pelak,
"car_key": kill_house_req_obj.add_car.key,
"type_car": kill_house_req_obj.add_car.driver.type_car,
"real_car": real_car,
"killer": exclusive_killer,
"kill_house_check_key": check.key,
"bar_info": assignment_info,
"auction": "False",
"kill_house_create_date": kill_house_req_obj.create_date,
"accepted_real_quantity": kill_house_req_obj.accepted_real_quantity,
"accepted_real_weight": kill_house_req_obj.accepted_real_weight,
"vet_check_date": vet_check_date,
"first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight,
"age": (
datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1,
}
elif kill_house_req_obj.kill_house_request_auction_winner != None:
internal_dict_infos = {
"poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname,
"poultry_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile,
"barcod": kill_house_req_obj.bar_code,
"kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"cars": kill_house_req_obj.car,
"kill_house_request_key": kill_house_req_obj.key
}
info_list.append(internal_dict_infos)
# info_dict.append(info_list)
return Response(info_list, status=status.HTTP_200_OK)
else:
# kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
kill_request_car = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)), kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
active_state__in=('active', 'inactive'),
assignment_state_archive='pending',
trash=False).select_related('province_request__city_request_Poultry__poultry_request',
'real_add_car__driver', 'killer',
'kill_request__kill_house__kill_house_operator')
# kill_request_car = [
# kill_request for kill_request in kill_requests
# if date1 <= kill_request.kill_request.recive_date.date() <= date2
# ]
for kill_house_req_obj in kill_request_car:
vet_check_date = None
real_car = None
if kill_house_req_obj.real_add_car != None:
real_car = {
"real_driver_name": kill_house_req_obj.real_add_car.driver.driver_name,
"real_driver_mobile": kill_house_req_obj.real_add_car.driver.driver_mobile,
"real_pelak": kill_house_req_obj.real_add_car.driver.pelak,
"real_type_car": kill_house_req_obj.real_add_car.driver.type_car
}
exclusive_killer = None
if kill_house_req_obj.killer != None:
exclusive_killer = {
"killer_name": kill_house_req_obj.killer.name,
"killer_mobile": kill_house_req_obj.killer.kill_house_operator.user.mobile,
"killer_fullname": kill_house_req_obj.killer.kill_house_operator.user.fullname,
}
vet_check = VetCheckRequest.objects.filter(kill_house_request=kill_house_req_obj).first()
if vet_check:
vet_check_date = vet_check.create_date
if kill_house_req_obj.province_kill_request != None:
check = KillHouseCheckRequest.objects.get(
province_kill_request=kill_house_req_obj.province_kill_request)
bar_info = KillHouseAssignmentInformation.objects.filter(
kill_house_request=kill_house_req_obj)
if bar_info.count() > 0:
bar_info = bar_info.last()
assignment_info = {
"kill_house_assignment_key": bar_info.key,
"kill_house_weight_without_load": bar_info.car_weight_without_load,
"kill_house_weight_with_load": bar_info.car_weight_with_load,
"kill_house_image_without_load": bar_info.car_weight_without_load_image,
"kill_house_image_with_load": bar_info.car_weight_with_load_image,
"kill_house_net_weight": bar_info.net_weight,
"driver_name": bar_info.kill_house_request.add_car.driver.driver_name,
"pelak": bar_info.kill_house_request.add_car.driver.pelak,
"type_car": bar_info.kill_house_request.add_car.driver.type_car,
"kill_house_assignment_state": bar_info.state,
"real_quantity": bar_info.real_quantity,
}
else:
assignment_info = None
internal_dict_infos = {
"poultry_request_id": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.id,
"poultry_request_key": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.key,
"amount": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.amount,
"bar_amount": kill_house_req_obj.amount,
"poultry_name": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.fullname,
"poultry_mobile": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.mobile,
"send_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.send_date,
"freezing": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.freezing,
"create_date": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.create_date,
"poultry_request_quantity": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.quantity,
"poultry_city": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.city.name,
"poultry_province": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.poultry.user.province.name,
"barcod": kill_house_req_obj.bar_code,
"order_code": kill_house_req_obj.province_request.city_request_Poultry.poultry_request.order_code,
"kill_house_name": kill_house_req_obj.kill_request.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_request.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"kill_house_request_key": kill_house_req_obj.key,
"vet_state": kill_house_req_obj.vet_state,
"traffic_code": kill_house_req_obj.traffic_code,
"driver_name": kill_house_req_obj.add_car.driver.driver_name,
"driver_mobile": kill_house_req_obj.add_car.driver.driver_mobile,
"pelak": kill_house_req_obj.add_car.driver.pelak,
"car_key": kill_house_req_obj.add_car.key,
"type_car": kill_house_req_obj.add_car.driver.type_car,
"real_car": real_car,
"killer": exclusive_killer,
"kill_house_check_key": check.key,
"free_sale_in_province": kill_house_req_obj.province_request.poultry_request.free_sale_in_province,
"bar_info": assignment_info,
"age": (
datetime.now() - kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.hatching.date).days + 1,
"auction": "False",
"kill_house_create_date": kill_house_req_obj.create_date,
"accepted_real_quantity": kill_house_req_obj.accepted_real_quantity,
"accepted_real_weight": kill_house_req_obj.accepted_real_weight,
"vet_check_date": vet_check_date,
"first_weight": kill_house_req_obj.quantity * kill_house_req_obj.province_kill_request.province_request.city_request_Poultry.poultry_request.Index_weight,
}
elif kill_house_req_obj.kill_house_request_auction_winner != None:
internal_dict_infos = {
"poultry_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.fullname,
"poultry_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.poultry_request.poultry.user.mobile,
"barcod": kill_house_req_obj.bar_code,
"kill_house_name": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.name,
"kill_house_mobile": kill_house_req_obj.kill_house_request_auction_winner.kill_house_request_auction.kill_house.kill_house_operator.user.mobile,
"quantity": kill_house_req_obj.quantity,
"time": kill_house_req_obj.kill_request.recive_time,
"date": kill_house_req_obj.kill_request.recive_date,
"cars": kill_house_req_obj.car,
"kill_house_request_key": kill_house_req_obj.key
}
info_list.append(internal_dict_infos)
# info_dict.append(info_list)
return Response(info_list, status=status.HTTP_200_OK)
# تابع مربوط به ویرایش درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
now = datetime.now().date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_request = KillHouseRequest.objects.get(key=request.data['key'], trash=False)
if 'traffic_code' in request.data.keys():
if kill_house_request.clearance_code:
return Response(
{"result": "به علت وارد شدن کد قرنطینه، امکان ویرایش وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN
)
bar_date = kill_house_request.kill_request.recive_date.date()
if now != bar_date:
return Response(
{"result": "فقط بار همان روز قابل ویرایش است!"},
status=status.HTTP_403_FORBIDDEN
)
if 'non_receipt' not in request.data.keys():
if 'bar_document_status_key' in request.data.keys() and request.data['bar_document_status_key'] != None:
document_status = BarDocumentStatus.objects.get(key=request.data['bar_document_status_key'])
kill_house_request.bar_document_status = document_status
kill_house_request.save()
request.data.pop('bar_document_status_key')
if 'quarantine_quantity' not in request.data.keys():
role = request.data['role']
if role == 'KillHouse' and now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1) \
and 'traffic_code' in request.data.keys():
return Response(
{"result": "تنها یک روز بعد از ثبت اطلاعات امکان تغییر وجود دارد!"},
status=status.HTTP_403_FORBIDDEN)
request.data.pop('role')
kill_house_request.editor_traffic_code = {
"role": role,
"full_name": user.first_name,
"mobile": user.mobile
}
kill_house_request.save()
# kill_house_request.assignment_state_archive = 'accepted'
# kill_house_request.save()
serializer = self.serializer_class(kill_house_request)
serializer.update(instance=kill_house_request, validated_data=request.data)
if kill_house_request.bar_document_status is not None and kill_house_request.bar_document_status.sms == True:
document_discrepancy_sms(kill_house_request.killhouse_user.killer, kill_house_request.killhouse_user.name,
kill_house_request.bar_code, kill_house_request.bar_document_status.title,
kill_house_request.killhouse_user.kill_house_operator.user.mobile,
kill_house_request.kill_request.recive_date.date())
return Response(serializer.data, status=status.HTTP_200_OK)
# تابع مربوط به حذف درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
tomorrow = datetime.now().date() + timedelta(days=1)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if 'delete_bar' in request.GET:
kill_house_req = KillHouseRequest.objects.get(key=request.GET['kill_house_request_key'], trash=False)
if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_req, trash=False).exists():
return Response({"result": "به علت ورود اطلاعات بار امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
# if kill_house_req.vet_state == 'accepted' or kill_house_req.assignment_state_archive == 'True':
# return Response({"result": "به علت تایید تخلیه توسط دامپزشک امکان حذف وجود ندارد!"},
# status=status.HTTP_403_FORBIDDEN)
province_kill_req = ProvinceKillRequest.objects.get(key=kill_house_req.province_kill_request.key,
trash=False)
kill_house_req.trash = True
kill_house_req.save()
province_kill_req.first_car_allocated_quantity -= kill_house_req.quantity
if province_kill_req.first_car_allocated_quantity < 0:
province_kill_req.first_car_allocated_quantity = 0
province_kill_req.save()
# kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_req,
# trash=False)
poultry_request = PoultryRequest.objects.get(key=province_kill_req.province_request.poultry_request.key,
trash=False)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
update_kill_house_requests(province_kill_req, poultry_request)
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
else:
kill_house_req = KillHouseRequest.objects.get(key=request.GET['kill_house_request_key'], trash=False)
if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_req, trash=False).exists():
return Response({"result": "به علت ورود اطلاعات بار امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if kill_house_req.vet_state == 'accepted' or kill_house_req.clearance_code != None:
return Response({"result": "به علت وارد شدن کد قرنطینه امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
kill_house_req.trash = True
kill_house_req.save()
if kill_house_req.kill_house_request_auction_winner != None:
kill_house_request_auction_winner = KillHouseRequestActionWinner.objects.get(
key=kill_house_req.kill_house_request_auction_winner.key)
kill_house_request_auction_winner.quantity += kill_house_req.quantity
kill_house_request_auction_winner.save()
else:
province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_req.province_kill_request.key,
trash=False)
province_kill_request.first_car_allocated_quantity -= kill_house_req.quantity
if province_kill_request.first_car_allocated_quantity < 0:
province_kill_request.first_car_allocated_quantity = 0
province_kill_request.save()
# kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_request,
# trash=False)
poultry_request = PoultryRequest.objects.get(
key=province_kill_request.province_request.poultry_request.key,
trash=False)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
vet_farm = VetFarm.objects.filter(trash=False,
poultry=kill_house_req.province_request.poultry_request.poultry).first()
delete_car_allocation_vet_farm_sms(kill_house_req.kill_request.recive_date.date(),
kill_house_req.province_request.poultry_request.poultry.user.fullname,
kill_house_req.province_request.poultry_request.hatching.chicken_age,
kill_house_req.quantity, kill_house_req.add_car.driver.type_car,
kill_house_req.traffic_code,
kill_house_req.add_car.driver.pelak,
kill_house_req.kill_request.kill_house.name,
vet_farm.vet.user.mobile,
kill_house_req.province_request.poultry_request.amount,
kill_house_req.province_request.poultry_request.free_sale_in_province
)
update_kill_house_requests(province_kill_request, poultry_request)
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
kill_house_req.trash = True
if 'message' in request.GET:
message = request.GET['message']
else:
message = 'حذف توسط کشتارگاه'
kill_house_req.message = message
role = request.GET['role'] if 'role' in request.GET else 'KillHouse'
now = datetime.now()
kill_house_req.bar_remover = {
"full_name": user.fullname,
"role": role,
"mobile": user.mobile,
"date": str(now)
}
kill_house_req.save()
ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house_req.killhouse_user,
date__date=tomorrow).first()
if ware_house:
ware_house.final_total_number_of_carcasses -= kill_house_req.accepted_real_quantity
ware_house.final_total_weight_of_carcasses -= kill_house_req.accepted_real_weight
ware_house.total_number_of_carcasses -= kill_house_req.accepted_real_quantity
ware_house.total_weight_of_carcasses -= kill_house_req.accepted_real_weight
ware_house.remain_total_number_of_carcasses -= kill_house_req.accepted_real_quantity
ware_house.remain_total_weight_of_carcasses -= kill_house_req.accepted_real_weight
ware_house.bar_quantity -= 1
# ware_house.allocated_quantity -= kill_house_req.accepted_real_quantity
ware_house.bar_live_weight -= kill_house_req.accepted_real_weight
ware_house.number_of_carcasses -= kill_house_req.accepted_real_quantity
ware_house.save()
return Response("object deleted", status=status.HTTP_200_OK)
class UpdateKillHouseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def update(self, request, pk=None, *args, **kwargs):
now = datetime.now().date()
kill_house_request = KillHouseRequest.objects.get(key=request.data['key'], trash=False)
if 'traffic_code' in request.data.keys() or 'car_key' in request.data.keys():
if kill_house_request.clearance_code:
return Response(
{"result": "به علت وارد شدن کد قرنطینه، امکان ویرایش وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN
)
bar_date = kill_house_request.kill_request.recive_date.date()
if now != bar_date:
return Response(
{"result": "فقط بار همان روز قابل ویرایش است!"},
status=status.HTTP_403_FORBIDDEN
)
if 'car_key' in request.data.keys():
add_car = KillHouseADDCAR.objects.get(key=request.data['car_key'], trash=False)
kill_house_request.add_car = add_car
kill_house_request.car = {
"id": add_car.id,
"key": str(add_car.key),
"pelak": add_car.driver.pelak,
"capocity": add_car.driver.capocity,
"type_car": add_car.driver.type_car,
"driver_name": add_car.driver.driver_name,
"driver_mobile": add_car.driver.driver_mobile,
"weight_without_load": add_car.driver.weight_without_load,
}
kill_house_request.save()
request.data.pop('car_key')
serializer = self.serializer_class(kill_house_request)
serializer.update(instance=kill_house_request, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseRequestPricingViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def update(self, request, pk=None, *args, **kwargs):
now = datetime.now()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_request = KillHouseRequest.objects.get(key=request.data['key'], trash=False)
role = request.data.get('role')
image = request.FILES.get('file')
if image:
file_url = upload_to_liara(image, image.name)
kill_house_request.image = file_url
if kill_house_request.price_registerar:
kill_house_request.price_editor = user.fullname
kill_house_request.price_editor_role = role
kill_house_request.price_editor_date = now
else:
kill_house_request.price_registerar = user.fullname
kill_house_request.price_registerar_role = role
kill_house_request.price_register_date = now
kill_house_request.save()
serializer = self.serializer_class(kill_house_request)
serializer.update(instance=kill_house_request, validated_data=request.data)
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
class KillHouseRequestForCompleteInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForBarManagementSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'bar_code',
]
# تابع مربوط به نمایش درخواست کشتار های ایجاد شده توسط کشتارگاه بعد از تخصیص
def list(self, request, *args, **kwargs):
kill_house_request_list = []
now = datetime.now().date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
if request.GET['role'] == 'KillHouseVet':
kill_house_vet = KillHouseVet.objects.filter(vet__user=user, trash=False)
kill_house_list = kill_house_vet.values_list('kill_house', flat=True).distinct()
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user__in=kill_house_list) | Q(
kill_request__slaughter_house__in=kill_house_list), kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive='pending',
non_receipt=False,
trash=False).order_by(
'create_date')
else:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)), kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive='pending',
non_receipt=False,
trash=False)
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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_request_list = ps.filter()
kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_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(kill_house_requests)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseRequestStatisticsDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
permission_classes = [AllowAny]
serializer_class = KillHouseRequestSerializer
def list(self, request, *args, **kwargs):
now = timezone.now().date()
ten_days_ago = now - timedelta(days=int(request.GET['day']))
kill_house_requests_list = []
for day in range(int(request.GET['day']) + 1):
date = ten_days_ago + timedelta(days=day)
total_quantites = KillHouseRequest.objects.filter(
kill_request__recive_date__date=date,
trash=False
).aggregate(total_quantity=Sum('quantity'))['total_quantity'] or 0
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)
total_quantity = total_quantites.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)
total_quantity = total_quantites.filter(
province_request__poultry_request__poultry__address__city=user.city)
else:
total_quantity = total_quantites
else:
total_quantity = total_quantites
kill_house_requests_list.append({"date": str(date), "quantity": total_quantity})
return Response(kill_house_requests_list)
class KillHouseRequestWeightStatisticsDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
permission_classes = [AllowAny]
serializer_class = KillHouseRequestSerializer
def list(self, request, *args, **kwargs):
now = timezone.now().date()
ten_days_ago = now - timedelta(days=int(request.GET['day']))
kill_house_requests_list = []
for day in range(int(request.GET['day']) + 1):
date = ten_days_ago + timedelta(days=day)
total_weight = 0
kill_house_requestes = KillHouseRequest.objects.filter(
kill_request__recive_date__date=date,
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)
kill_house_requests = kill_house_requestes.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_requestes.filter(
province_request__poultry_request__poultry__address__city=user.city)
else:
kill_house_requests = kill_house_requestes
else:
kill_house_requests = kill_house_requestes
if kill_house_requests:
for kill_house_request in kill_house_requests:
kill_house_request_information = KillHouseAssignmentInformation.objects.filter(
kill_house_request=kill_house_request).last()
if kill_house_request_information:
total_weight += kill_house_request_information.net_weight
else:
total_weight += kill_house_request.province_request.poultry_request.Index_weight * kill_house_request.quantity
kill_house_requests_list.append({"date": str(date), "weight": total_weight})
return Response(kill_house_requests_list)
class KillHouseRequestChangeStateViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
keys = request.data['keys']
request.data.pop('keys')
for key in keys:
kill_house_request = KillHouseRequest.objects.get(key=key, trash=False)
kill_house_request.show_kill_house = 'accepted'
kill_house_request.save()
return Response("objects updated", status=status.HTTP_200_OK)
class KillHouseAssignmentImagesViewSet(viewsets.ModelViewSet):
queryset = KillHouseAssignmentImages.objects.all()
serializer_class = KillHouseAssignmentImagesSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به وارد کردن اطلاعات بار توسط کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
role = request.data['role']
request.data.pop('role')
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False)
request.data.pop('kill_house_key')
try:
health_certificate_image = request.data['health_certificate_img']
request.data.pop('health_certificate_img')
except:
health_certificate_image = None
try:
national_card_image = request.data['national_card_image']
except:
national_card_image = None
try:
birth_certificate_image = request.data['birth_certificate_image']
except:
birth_certificate_image = None
try:
police_clearance_image = request.data['police_clearance_image']
except:
police_clearance_image = None
try:
no_addiction_image = request.data['no_addiction_image']
except:
no_addiction_image = None
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_images = KillHouseAssignmentImages.objects.filter(kill_house=kill_house)
if kill_house_images.count() > 0:
kill_house_images = kill_house_images.last()
else:
kill_house_images = serializer.create(validated_data=request.data)
if health_certificate_image != None:
kill_house_images.health_certificate_image = send_image_to_server(health_certificate_image)
if national_card_image != None:
kill_house_images.national_card_image = send_image_to_server(national_card_image)
if birth_certificate_image != None:
kill_house_images.birth_certificate_image = send_image_to_server(birth_certificate_image)
if police_clearance_image != None:
kill_house_images.police_clearance_image = send_image_to_server(police_clearance_image)
if no_addiction_image != None:
kill_house_images.no_addiction_image = send_image_to_server(no_addiction_image)
kill_house_images.save()
kill_house_images_serializer = self.serializer_class(kill_house_images)
return Response(kill_house_images_serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
class KillHouseAssignmentInformationForAggregateLoadViewSet(viewsets.ModelViewSet):
queryset = KillHouseAssignmentInformation.objects.all()
serializer_class = KillHouseAssignmentInformationSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
now = datetime.now().date()
user = SystemUserProfile.objects.get(user=request.user)
kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False)
province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_request.province_kill_request.key)
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
kill_house_check = KillHouseCheckRequest.objects.get(
province_kill_request__key=kill_house_request.province_kill_request.key)
if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True:
if kill_house_request.vet_state == 'pending':
return Response({"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
date_time_of_now = datetime.now().date()
if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True:
if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1):
return Response({"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
role = request.data['role']
request.data.pop('kill_house_request_key')
request.data.pop('role')
assignment_info = KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).first()
if not assignment_info:
assignment_info = KillHouseAssignmentInformation()
assignment_info.save()
# serializer = self.serializer_class(data=request.data)
# if serializer.is_valid():
# assignment_info = serializer.create(validated_data=request.data)
assignment_info.kill_house_check = kill_house_check
assignment_info.kill_house_request = kill_house_request
assignment_info.car_weight_with_load = int(request.data['net_weight'])
assignment_info.net_weight = int(request.data['net_weight'])
assignment_info.real_quantity = int(request.data['real_quantity'])
assignment_info.importer = {
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(now),
"role": role
}
assignment_info.save()
kill_house_request.accepted_real_weight = int(request.data['net_weight'])
kill_house_request.accepted_real_quantity = int(request.data['real_quantity'])
kill_house_request.accepted_assignment_real_quantity = int(request.data['net_weight'])
kill_house_request.accepted_assignment_real_weight = int(request.data['real_quantity'])
kill_house_request.save()
# kill_house_requests = KillHouseRequest.objects.filter(province_kill_request=province_kill_request,
# trash=False)
update_kill_house_requests(province_kill_request, poultry_request)
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
kill_house_request.accepted_real_weight = int(request.data['net_weight'])
kill_house_request.accepted_real_quantity = int(request.data['real_quantity'])
assignment_info.save()
if assignment_info.net_weight != 0 and assignment_info.real_quantity != 0 and assignment_info.car_weight_with_load_image != None:
kill_house_request.assignment_state_archive = 'True'
kill_house_request.save()
return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED)
def update(self, request, pk=None, *args, **kwargs):
image = request.data['image']
role = request.data['role']
now = datetime.now()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15))
image_url = send_image_to_server(image)
# upload_object_resize(image_data=image, bucket_name="profileimagedefault",
# object_name="{0}.jpg".format(str(ran)))
if 'bar_key' in request.data.keys():
bar_key = request.data['bar_key']
request.data.pop('bar_key')
kill_house_request = KillHouseRequest.objects.get(key=bar_key, trash=False)
kill_house_check = KillHouseCheckRequest.objects.get(
province_kill_request__key=kill_house_request.province_kill_request.key)
assignment_info = KillHouseAssignmentInformation.objects.filter(
kill_house_request__key=bar_key).first()
if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True:
if kill_house_request.vet_state == 'pending':
return Response({"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
date_time_of_now = datetime.now().date()
if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True:
if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1):
return Response(
{"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if not assignment_info:
assignment_info = KillHouseAssignmentInformation(kill_house_check=kill_house_check,
kill_house_request=kill_house_request)
assignment_info.save()
# serializer = self.serializer_class(data=request.data)
# if serializer.is_valid():
# assignment_info = serializer.create(validated_data=request.data)
# assignment_info.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran))
assignment_info.car_weight_with_load_image = image_url
assignment_info.importer = {
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(now),
"role": role
}
assignment_info.save()
kill_house_request = KillHouseRequest.objects.get(key=bar_key, trash=False)
if assignment_info.net_weight != 0 and assignment_info.real_quantity != 0 and assignment_info.car_weight_with_load_image != None:
kill_house_request.assignment_state_archive = 'True'
kill_house_request.save()
else:
assingment_info_keys = request.data['bar_keys']
request.data.pop('bar_keys')
for assingment_info_key in assingment_info_keys:
kill_house_request = KillHouseRequest.objects.get(key=assingment_info_key, trash=False)
kill_house_check = KillHouseCheckRequest.objects.get(
province_kill_request__key=kill_house_request.province_kill_request.key)
if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True:
if kill_house_request.vet_state == 'pending':
return Response(
{"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
date_time_of_now = datetime.now().date()
if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True:
if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1):
return Response(
{"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
assignment_info = KillHouseAssignmentInformation.objects.filter(
kill_house_request__key=assingment_info_key).first()
if not assignment_info:
assignment_info = KillHouseAssignmentInformation(kill_house_check=kill_house_check,
kill_house_request=kill_house_request)
assignment_info.save()
if assignment_info.car_weight_with_load_image == None:
# assignment_info.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran))
assignment_info.car_weight_with_load_image = image_url
assignment_info.importer = {
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(now),
"role": role
}
assignment_info.save()
kill_house_request = KillHouseRequest.objects.get(key=assignment_info.kill_house_request.key,
trash=False)
if assignment_info.net_weight != 0 and assignment_info.real_quantity != 0 and assignment_info.car_weight_with_load_image != None:
kill_house_request.assignment_state_archive = 'True'
kill_house_request.save()
return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_200_OK)
# class KillHouseAssignmentInformationForcompletedloadsViewSet(viewsets.ModelViewSet):
# queryset = KillHouseAssignmentInformation.objects.all()
# serializer_class = KillHouseAssignmentInformationSerializer
# permission_classes = [TokenHasReadWriteScope]
#
# def list(self, request, *args, **kwargs):
# # refresh(request.user.id)
# user = SystemUserProfile.objects.get(user=request.user, trash=False)
# now = datetime.now().date()
# date1 = datetime.strptime(str(request.GET['date1']),
# '%Y-%m-%d').date() if 'date1' in request.GET else now
# date2 = datetime.strptime(str(request.GET['date2']),
# '%Y-%m-%d').date() if 'date2' in request.GET else now
# province = user.province.name
# if request.GET['role'] in ('ProvinceFinancial', 'ProvinceOperator'):
# kill_house_assignments = KillHouseAssignmentInformation.objects.filter(
# Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False),
# kill_house_request__killhouse_user__kill_house_operator__address__province__name=province,
# net_weight__gt=0,
# real_quantity__gt=0,
# kill_house_request__kill_request__recive_date__date__gte=date1,
# kill_house_request__kill_request__recive_date__date__lte=date2,
# trash=False).select_related(
# 'kill_house_request__province_request__poultry_request__hatching',
# 'kill_house_request__province_request__poultry_request__poultry',
# 'kill_house_request__province_request__poultry_request__poultry__user__city',
# 'kill_house_request__province_request__poultry_request__poultry__user__province',
# 'kill_house_request__province_request__poultry_request__poultry__user',
#
# 'kill_house_request__kill_request__kill_house',
# 'kill_house_request__kill_request__slaughter_house',
# 'kill_house_request__killhouse_user',
# 'kill_house_request__killhouse_user__kill_house_operator__user',
# 'kill_house_request__add_car__driver',
# 'kill_house_request__real_add_car__driver',
# ).values(
# "kill_house_request__province_request__poultry_request__poultry__user__province__name",
# "kill_house_request__province_request__poultry_request__poultry__user__city__name",
# "kill_house_request__province_request__poultry_request__poultry__user__fullname",
# "kill_house_request__province_request__poultry_request__poultry__user__mobile",
# "kill_house_request__province_request__poultry_request__poultry__unit_name",
# "kill_house_request__province_request__poultry_request__poultry__key",
# "kill_house_request__province_request__poultry_request__order_code",
# "kill_house_request__province_request__poultry_request__quantity",
# "kill_house_request__province_request__poultry_request__id",
# "kill_house_request__province_request__poultry_request__Index_weight",
# "kill_house_request__province_request__poultry_request__chicken_breed",
# "kill_house_request__province_request__poultry_request__create_date",
# "kill_house_request__province_request__poultry_request__send_date",
# "kill_house_request__province_request__poultry_request__cell_type",
# "kill_house_request__province_request__poultry_request__hatching__losses",
# "kill_house_request__province_request__poultry_request__hatching__date",
# "kill_house_request__killhouse_user",
# 'kill_house_request__kill_request__kill_house__name',
# 'kill_house_request__kill_request__slaughter_house__name',
# "kill_house_request__add_car__driver__driver_name",
# "kill_house_request__add_car__driver__driver_mobile",
# "kill_house_request__add_car__driver__type_car",
# "kill_house_request__add_car__driver__pelak",
# "kill_house_request__add_car__driver__health_code",
# "kill_house_request__real_add_car__driver__driver_name",
# "kill_house_request__real_add_car__driver__driver_mobile",
# "kill_house_request__real_add_car__driver__type_car",
# "kill_house_request__real_add_car__driver__pelak",
# "kill_house_request__real_add_car__driver__health_code",
# "kill_house_request__quantity",
# "kill_house_request__bar_code",
# "kill_house_request__quarantine_quantity",
# "kill_house_request__vet_state",
# "kill_house_request__assignment_state_archive",
# "kill_house_request__clearance_code",
# "kill_house_request__traffic_code",
# "kill_house_request__accepted_real_quantity",
# "kill_house_request__accepted_real_weight",
# "kill_house_request",
# "car_weight_without_load",
# "car_weight_without_load_image",
# "car_weight_with_load",
# "car_weight_with_load_image",
# "net_weight",
# "state",
# "real_quantity",
# "protest_time",
#
# # "allocated_car_state"
# )
# else:
# if request.GET['role'] == 'KillHouse':
# operator = KillHouseOperator.objects.get(user=user, trash=False)
# kill_house = KillHouse.objects.filter(kill_house_operator=operator, trash=False)
# else:
# vet = Vet.objects.get(user=user)
# kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False)
# kill_house_list = [kill_house.kill_house.key for kill_house in kill_house_vet]
# kill_house = KillHouse.objects.filter(key__in=kill_house_list)
#
# kill_house_assignments = KillHouseAssignmentInformation.objects.filter(
# # state='pending',
# Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False),
#
# kill_house_request__killhouse_user__in=kill_house,
# # car_weight_with_load_image__isnull=False,
# net_weight__gt=0,
# real_quantity__gt=0,
# trash=False,
# kill_house_request__kill_request__recive_date__date__gte=date1,
# kill_house_request__kill_request__recive_date__date__lte=date2,
# unusual_casualties=False).select_related(
# 'kill_house_request__province_request__poultry_request__hatching',
# 'kill_house_request__province_request__poultry_request__poultry',
# 'kill_house_request__province_request__poultry_request__poultry__user__city',
# 'kill_house_request__province_request__poultry_request__poultry__user__province',
# 'kill_house_request__province_request__poultry_request__poultry__user',
#
# 'kill_house_request__kill_request__kill_house',
# 'kill_house_request__kill_request__slaughter_house',
# 'kill_house_request__killhouse_user',
# 'kill_house_request__killhouse_user__kill_house_operator__user',
# 'kill_house_request__add_car__driver',
# 'kill_house_request__real_add_car__driver',
# ).values(
# "kill_house_request__province_request__poultry_request__poultry__user__province__name",
# "kill_house_request__province_request__poultry_request__poultry__user__city__name",
# "kill_house_request__province_request__poultry_request__poultry__user__fullname",
# "kill_house_request__province_request__poultry_request__poultry__user__mobile",
# "kill_house_request__province_request__poultry_request__poultry__unit_name",
# "kill_house_request__province_request__poultry_request__poultry__key",
# "kill_house_request__province_request__poultry_request__order_code",
# "kill_house_request__province_request__poultry_request__quantity",
# "kill_house_request__province_request__poultry_request__id",
# "kill_house_request__province_request__poultry_request__Index_weight",
# "kill_house_request__province_request__poultry_request__chicken_breed",
# "kill_house_request__province_request__poultry_request__create_date",
# "kill_house_request__province_request__poultry_request__send_date",
# "kill_house_request__province_request__poultry_request__cell_type",
# "kill_house_request__province_request__poultry_request__hatching__losses",
# "kill_house_request__province_request__poultry_request__hatching__date",
# "kill_house_request__killhouse_user",
# 'kill_house_request__kill_request__kill_house__name',
# 'kill_house_request__kill_request__slaughter_house__name',
# "kill_house_request__add_car__driver__driver_name",
# "kill_house_request__add_car__driver__driver_mobile",
# "kill_house_request__add_car__driver__type_car",
# "kill_house_request__add_car__driver__pelak",
# "kill_house_request__add_car__driver__health_code",
# "kill_house_request__real_add_car__driver__driver_name",
# "kill_house_request__real_add_car__driver__driver_mobile",
# "kill_house_request__real_add_car__driver__type_car",
# "kill_house_request__real_add_car__driver__pelak",
# "kill_house_request__real_add_car__driver__health_code",
# "kill_house_request__quantity",
# "kill_house_request__bar_code",
# "kill_house_request__quarantine_quantity",
# "kill_house_request__vet_state",
# "kill_house_request__assignment_state_archive",
# "kill_house_request__clearance_code",
# "kill_house_request__traffic_code",
# "kill_house_request__accepted_real_quantity",
# "kill_house_request__accepted_real_weight",
# "kill_house_request",
# "car_weight_without_load",
# "car_weight_without_load_image",
# "car_weight_with_load",
# "car_weight_with_load_image",
# "net_weight",
# "state",
# "real_quantity",
# "protest_time",
#
# # "allocated_car_state"
# )
#
# assignments_list_final_state = []
# allocation = ShareOfAllocation.objects.all()
# if allocation.count() > 0:
# allocation = allocation.last().total
# else:
# allocation = 0
# for request_data in kill_house_assignments:
# poultry_name_of_bank_user = None
# poultry_bank_name = None
# poultry_card = None
# poultry_account = None
# poultry_shaba = None
# province_name_of_bank_user = None
# province_bank_name = None
# province_card = None
# province_account = None
# province_shaba = None
# kill_house_vet = KillHouseVet.objects.filter(
# kill_house=request_data.get('kill_house_request__killhouse_user'), trash=False).select_related('vet__user').values(
# 'vet__user__fullname',
# 'vet__user__mobile',
# )
# if kill_house_vet.count() > 0:
# kill_house_vet = kill_house_vet.last()
# kill_house_vet_name = kill_house_vet.get('vet__user__fullname')
# kill_house_vet_mobile = kill_house_vet.get('vet__user__mobile')
# if request_data.get('kill_house_request__kill_request__slaughter_house') != None:
# kill_place = request_data.get('kill_house_request__kill_request__slaughter_house__name')
# else:
# kill_place = request_data.get('kill_house_request__kill_request__kill_house__name')
#
# vet_check = VetCheckRequest.objects.filter(
# kill_house_request=request_data.get('kill_house_request'), trash=False).select_related('kill_house_request').values('kill_house_request','create_date').first()
#
# vet_check_date = vet_check.get('create_date') if vet_check else None
# poultry = Poultry.objects.filter(
# key=request_data.get('kill_house_request__province_request__poultry_request__poultry__key'),
# trash=False).select_related('user_bank_info').values(
# 'user_bank_info',
# 'user_bank_info__name_of_bank_user',
# 'user_bank_info__bank_name',
# 'user_bank_info__card',
# 'user_bank_info__account',
# 'user_bank_info__shaba',
# ).first()
# if poultry.get('user_bank_info') != None:
# poultry_name_of_bank_user = poultry.get('user_bank_info__name_of_bank_user')
# poultry_bank_name = poultry.get('user_bank_info__bank_name')
# poultry_card = poultry.get('user_bank_info__card')
# poultry_account = poultry.get('user_bank_info__account')
# poultry_shaba = poultry.get('user_bank_info__shaba')
# operator = ProvinceOperator.objects.filter(trash=False).select_related('user_bank_info').values(
# 'user_bank_info',
# 'user_bank_info__name_of_bank_user',
# 'user_bank_info__bank_name',
# 'user_bank_info__card',
# 'user_bank_info__account',
# 'user_bank_info__shaba',
# )
# if operator.last().get('user_bank_info') != None:
# operator = operator.last()
# province_name_of_bank_user = operator.get('user_bank_info__name_of_bank_user')
# province_bank_name = operator.get('user_bank_info__bank_name')
# province_card = operator.get('user_bank_info__card')
# province_account = operator.get('user_bank_info__account')
# province_shaba = operator.get('user_bank_info__shaba')
#
# internal_dict = {
# "order_code": request_data.get('kill_house_request__province_request__poultry_request__order_code'),
# "poultry_province": request_data.get(
# 'kill_house_request__province_request__poultry_request__poultry__user__province__name'),
# "poultry_city": request_data.get(
# 'kill_house_request__province_request__poultry_request__poultry__user__city__name'),
# "poultry_fullname": request_data.get(
# 'kill_house_request__province_request__poultry_request__poultry__user__fullname'),
# "poultry_mobile": request_data.get(
# 'kill_house_request__province_request__poultry_request__poultry__user__mobile'),
# "poultry_name": request_data.get(
# 'kill_house_request__province_request__poultry_request__poultry__unit_name'),
# "poultry_key": request_data.get('kill_house_request__province_request__poultry_request__poultry__key'),
# "poultry_request_quantity": request_data.get(
# 'kill_house_request__province_request__poultry_request__quantity'),
# "poultry_request_id": request_data.get('kill_house_request__province_request__poultry_request__id'),
# "Index_weight": request_data.get('kill_house_request__province_request__poultry_request__Index_weight'),
# "chicken_breed": request_data.get(
# 'kill_house_request__province_request__poultry_request__chicken_breed'),
# "create_date": request_data.get('kill_house_request__province_request__poultry_request__create_date'),
# "send_date": request_data.get('kill_house_request__province_request__poultry_request__send_date'),
# "cell_type": request_data.get('kill_house_request__province_request__poultry_request__cell_type'),
# "losses": request_data.get('kill_house_request__province_request__poultry_request__hatching__losses'),
# "hatching__date": request_data.get(
# 'kill_house_request__province_request__poultry_request__hatching__date'),
# "driver_name": request_data.get('kill_house_request__add_car__driver__driver_name'),
# "driver_mobile": request_data.get('kill_house_request__add_car__driver__driver_mobile'),
# "type_car": request_data.get('kill_house_request__add_car__driver__type_car'),
# "pelak": request_data.get('kill_house_request__add_car__driver__pelak'),
# "health_code": request_data.get('kill_house_request__add_car__driver__health_code'),
# "real_driver_name": request_data.get('kill_house_request__real_add_car__driver__driver_name'),
# "real_driver_mobile": request_data.get('kill_house_request__real_add_car__driver__driver_mobile'),
# "real_type_car": request_data.get('kill_house_request__real_add_car__driver__type_car'),
# "real_pelak": request_data.get('kill_house_request__real_add_car__driver__pelak'),
# "real_health_code": request_data.get('kill_house_request__real_add_car__driver__health_code'),
# "quantity": request_data.get('kill_house_request__quantity'),
# "bar_code": request_data.get('kill_house_request__bar_code'),
# "quarantine_quantity": request_data.get('kill_house_request__quarantine_quantity'),
# "vet_state": request_data.get('kill_house_request__vet_state'),
# "assignment_state_archive": request_data.get('kill_house_request__assignment_state_archive'),
# "clearance_code": request_data.get('kill_house_request__clearance_code'),
# "traffic_code": request_data.get('kill_house_request__traffic_code'),
# "accepted_real_quantity": request_data.get('kill_house_request__accepted_real_quantity'),
# "accepted_real_weight": request_data.get('kill_house_request__accepted_real_weight'),
# "car_weight_without_load": request_data.get('car_weight_without_load'),
# "car_weight_without_load_image": request_data.get('car_weight_without_load_image'),
# "car_weight_with_load": request_data.get('car_weight_with_load'),
# "car_weight_with_load_image": request_data.get('car_weight_with_load_image'),
# "net_weight": request_data.get('net_weight'),
# "state": request_data.get('state'),
# "real_quantity": request_data.get('real_quantity'),
# "protest_time": request_data.get('protest_time'),
# "average_weight": request_data.get('net_weight') / request_data.get('real_quantity') ,
# "first_weight": request_data.get('kill_house_request__quantity') * request_data.get('kill_house_request__province_request__poultry_request__Index_weight') ,
# "poultry_name_of_bank_user": poultry_name_of_bank_user,
# "poultry_bank_name": poultry_bank_name,
# "poultry_card": poultry_card,
# "poultry_account": poultry_account,
# "poultry_shaba": poultry_shaba,
# "province_name_of_bank_user": province_name_of_bank_user,
# "province_bank_name": province_bank_name,
# "province_card": province_card,
# "province_account": province_account,
# "province_shaba": province_shaba,
# "kill_house_vet_name": kill_house_vet_name,
# "kill_house_vet_mobile": kill_house_vet_mobile,
# "kill_place": kill_place,
# "vet_check_date": vet_check_date,
# "allocation": allocation,
#
# }
#
# assignments_list_final_state.append(internal_dict)
# return Response(len(assignments_list_final_state), status=status.HTTP_200_OK)
class KillHouseAssignmentInformationForcompletedloadsViewSet(viewsets.ModelViewSet):
queryset = KillHouseAssignmentInformation.objects.all()
serializer_class = KillHouseAssignmentInformationForCompletedLoadsSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
province = user.province.name
if request.GET['role'] in ('ProvinceFinancial', 'ProvinceOperator'):
kill_house_assignments = KillHouseAssignmentInformation.objects.filter(
Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False),
kill_house_request__killhouse_user__kill_house_operator__address__province__name=province,
net_weight__gt=0,
real_quantity__gt=0,
kill_house_request__kill_request__recive_date__date__gte=date1,
kill_house_request__kill_request__recive_date__date__lte=date2,
trash=False)
else:
if request.GET['role'] == 'KillHouse':
operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=operator, trash=False)
else:
vet = Vet.objects.get(user=user)
kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False)
kill_house_list = [kill_house.kill_house.key for kill_house in kill_house_vet]
kill_house = KillHouse.objects.filter(key__in=kill_house_list)
kill_house_assignments = KillHouseAssignmentInformation.objects.filter(
# state='pending',
Q(car_weight_with_load_image__isnull=False) | Q(car_weight_without_load_image__isnull=False),
kill_house_request__killhouse_user__in=kill_house,
# car_weight_with_load_image__isnull=False,
net_weight__gt=0,
real_quantity__gt=0,
trash=False,
kill_house_request__kill_request__recive_date__date__gte=date1,
kill_house_request__kill_request__recive_date__date__lte=date2,
unusual_casualties=False)
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_assignments)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_assignments, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به وارد کردن اطلاعات بار توسط کشتارگاه
class KillHouseAssignmentInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseAssignmentInformation.objects.all()
serializer_class = KillHouseAssignmentInformationSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'bar_code',
'bar_document_status__title',
]
# تابع مربوط به وارد کردن اطلاعات بار توسط کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
pic = []
dict1 = {}
role = request.data['role']
request.data.pop('role')
date_time_of_now = datetime.now().date()
kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False)
province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_request.province_kill_request.key)
if OperationLimitation.objects.all().first().vet_check_kill_house_assignment_limitation == True:
if kill_house_request.vet_state == 'pending':
return Response({"result": "به علت عدم تایید تخلیه دامپزشک کشتارگاه امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True:
if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1):
return Response({"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
# if kill_house_request.vet_state == 'pending':
# return Response({"result": "بار توسط دامپزشک تخلیه نشده است !"}, status=status.HTTP_403_FORBIDDEN)
if kill_house_request.province_kill_request != None:
kill_house_check = KillHouseCheckRequest.objects.get(
province_kill_request__key=kill_house_request.province_kill_request.key)
else:
kill_house_check = None
# if 'car_without_load_image' in request.data.keys() and 'car_with_load_image' in request.data.keys():
# if request.data['car_without_load_image'] != None and request.data['car_with_load_image'] != None:
# car_without_load_image = request.data['car_without_load_image']
# car_with_load_image = request.data['car_with_load_image']
# pic.append(car_without_load_image)
# pic.append(car_with_load_image)
# request.data.pop('car_without_load_image')
# request.data.pop('car_with_load_image')
if 'car_with_load_image' in request.data.keys():
if request.data['car_with_load_image'] != None:
car_with_load_image = request.data['car_with_load_image']
pic.append(car_with_load_image)
request.data.pop('car_with_load_image')
request.data.pop('kill_house_request_key')
if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).exists():
return Response({'result': 'already exist'}, status=status.HTTP_403_FORBIDDEN)
if 'killer_key' in request.data.keys():
if request.data['killer_key'] != None:
killer = KillHouse.objects.get(key=request.data['killer_key'])
kill_house_request.killer = killer
request.data.pop('killer_key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
assignment_info = serializer.create(validated_data=request.data)
if kill_house_check != None:
assignment_info.kill_house_check = kill_house_check
assignment_info.kill_house_request = kill_house_request
if len(pic) > 0:
for p in pic:
ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15))
# upload_object_resize(image_data=p, bucket_name="profileimagedefault",
# object_name="{0}.jpg".format(str(ran)))
# if p == car_without_load_image:
# assignment_info.car_weight_without_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(
# str(ran))
# # os.remove("{0}.jpg".format(str(ran)))
# else:
# assignment_info.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran))
assignment_info.car_weight_with_load_image = send_image_to_server(p)
# os.remove("{0}.jpg".format(str(ran)))
kill_house_request.assignment_state_archive = 'True'
kill_house_request.save()
if role == 'Poultry':
dict1.update({
"Poultry": True,
"CityOperator": False,
"ProvinceOperator": False,
"ProvinceFinancial": False,
"KillHouse": False,
})
elif role == 'CityOperator':
dict1.update({
"Poultry": False,
"CityOperator": True,
"ProvinceOperator": False,
"ProvinceFinancial": False,
"KillHouse": False,
})
elif role == 'ProvinceFinancial':
dict1.update({
"Poultry": False,
"CityOperator": False,
"ProvinceOperator": False,
"ProvinceFinancial": True,
"KillHouse": False,
})
elif role == 'ProvinceOperator':
dict1.update({
"Poultry": False,
"CityOperator": False,
"ProvinceOperator": True,
"ProvinceFinancial": False,
"KillHouse": False,
})
else:
dict1.update({
"Poultry": False,
"CityOperator": False,
"ProvinceOperator": False,
"ProvinceFinancial": False,
"KillHouse": True,
})
assignment_info.importer = dict1
now = datetime.now()
houre = PercentageOfLosses.objects.all()
if houre.count() > 0:
houre = houre.last().houre
assignment_info.protest_time = now + timedelta(hours=int(houre))
assignment_info.net_weight = float(assignment_info.car_weight_with_load) - float(
assignment_info.car_weight_without_load)
assignment_info.save()
kill_house_request.active_state = 'inactive'
poultry = PoultryRequest.objects.get(
key=kill_house_request.province_request.city_request_Poultry.poultry_request.key)
poultry.assignment = True
poultry.save()
kill_house_request.accepted_real_quantity = assignment_info.real_quantity
kill_house_request.accepted_real_weight = assignment_info.net_weight
kill_house_request.accepted_assignment_real_quantity = assignment_info.real_quantity
kill_house_request.accepted_assignment_real_weight = assignment_info.net_weight
kill_house_request.save()
hatching = PoultryHatching.objects.get(key=poultry.hatching.key)
update_kill_house_requests(province_kill_request, poultry)
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
kill_house_request.accepted_real_quantity = assignment_info.real_quantity
kill_house_request.accepted_real_weight = assignment_info.net_weight
kill_house_request.save()
assignment_info_serializer = self.serializer_class(assignment_info)
return Response(assignment_info_serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
# تابع مربوط به نمایش اطلاعات بار وارد شده توسط کشتارگاه
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
# user = SystemUserProfile.objects.get(user=request.user)
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house = []
kill_house_requests_list = []
if request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
elif request.GET['role'] == 'KillHouseVet':
kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house')
for kill_house_vet in kill_house_vets:
kill_house.append(kill_house_vet.kill_house)
else:
kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False)
if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user, trash=False)
if 'without_bar_document' in request.GET and request.GET['without_bar_document'] == "true":
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,
assignment_state_archive='True',
bar_document_status__isnull=True,
non_receipt=False,
trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
).order_by('-kill_request__recive_date')
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,
assignment_state_archive='True',
non_receipt=False,
trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
).order_by('-kill_request__recive_date')
else:
if 'without_bar_document' in request.GET and request.GET['without_bar_document'] == "true":
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,
assignment_state_archive='True',
bar_document_status__isnull=True,
non_receipt=False,
trash=False, province_request__poultry_request__poultry__address__city=user.city
).order_by('-kill_request__recive_date')
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,
assignment_state_archive='True',
non_receipt=False,
trash=False, province_request__poultry_request__poultry__address__city=user.city
).order_by('-kill_request__recive_date')
else:
if 'without_bar_document' in request.GET and request.GET['without_bar_document'] == "true":
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive='True',
bar_document_status__isnull=True,
non_receipt=False,
trash=False,
).order_by('-kill_request__recive_date')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive='True',
non_receipt=False,
trash=False,
).order_by('-kill_request__recive_date')
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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_requests_list = ps.filter()
kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_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(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)
# تابع مربوط به نمایش اطلاعات بار وارد شده توسط کشتارگاه
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
role = request.data['role']
request.data.pop('role')
kill_house_assignment = KillHouseAssignmentInformation.objects.get(key=request.data['key'], trash=False)
if kill_house_assignment.state == 'accepted':
return Response({"result": "به علت تایید اطلاعات از سمت استان امکان ویرایش وجود ندارد!"})
kill_house_request = KillHouseRequest.objects.get(key=kill_house_assignment.kill_house_request.key)
province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_request.province_kill_request.key)
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key)
date_time_of_now = datetime.now().date()
if OperationLimitation.objects.all().first().kill_house_assignment_limitation == True:
if date_time_of_now > kill_house_request.kill_request.recive_date.date() + timedelta(days=1):
return Response({"result": "به علت مغایرت در تاریخ ثبت و تاریخ کشتار امکان ثبت اطلاعات وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
car_with_load_image = request.data['car_with_load_image']
request.data.pop('key')
request.data.pop('car_with_load_image')
if 'killer_key' in request.data.keys():
if request.data['killer_key'] != None:
killer = KillHouse.objects.get(key=request.data['killer_key'])
kill_house_request.killer = killer
request.data.pop('killer_key')
pic = []
# if 'car_without_load_image' in request.data.keys():
# car_without_load_image = request.data['car_without_load_image']
# request.data.pop('car_without_load_image')
# pic.append(car_without_load_image)
pic.append(car_with_load_image)
for p in pic:
ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15))
# upload_object_resize(image_data=p, bucket_name="profileimagedefault",
# object_name="{0}.jpg".format(str(ran)))
# if p == car_without_load_image:
# kill_house_assignment.car_weight_without_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran))
# # os.remove("{0}.jpg".format(str(ran)))
#
# else:
# kill_house_assignment.car_weight_with_load_image = ARVAN_Kill_house_URL + "{0}.jpg".format(str(ran))
kill_house_assignment.car_weight_with_load_image = send_image_to_server(p)
# os.remove("{0}.jpg".format(str(ran)))
kill_house_assignment.state = 'pending'
if role == 'Poultry':
kill_house_assignment.poultry_update = True
elif role == 'CityOperator':
kill_house_assignment.city_update = True
elif role == 'ProvinceFinancial':
kill_house_assignment.province_update = True
kill_house_assignment.state = 'pending'
kill_house_assignment.net_weight = request.data['car_weight_with_load'] - request.data[
'car_weight_without_load']
kill_house_assignment.save()
kill_house_request.accepted_real_quantity = request.data['real_quantity']
kill_house_request.accepted_real_weight = request.data['car_weight_with_load'] - request.data[
'car_weight_without_load']
kill_house_request.accepted_assignment_real_quantity = int(request.data['real_quantity'])
kill_house_request.accepted_assignment_real_weight = request.data['car_weight_with_load'] - request.data[
'car_weight_without_load']
kill_house_request.assignment_state_archive = 'True'
kill_house_request.save()
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
update_kill_house_requests(province_kill_request, poultry_request)
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
serializer = self.serializer_class(kill_house_assignment)
serializer.update(instance=kill_house_assignment, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به ایجاد و ویرایش و جذف و نمایش فاکتور از سمت استان برای کشتارگاه
class ProvinceFactorToKillHouseViewSet(viewsets.ModelViewSet):
queryset = ProvinceFactorToKillHouse.objects.all()
serializer_class = ProvinceFactorToKillHouseSerializer
permission_classes = [TokenHasReadWriteScope]
# ویوست مربوط به ایجاد و ویرایش و جذف و نمایش نماینده دامپزشکی برای کشتارگاه
class VetViewSet(viewsets.ModelViewSet):
queryset = Vet.objects.all()
serializer_class = VetSerializer
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = VetFilterSet
pagination_class = CustomPagination
filterset_fields = [
'user__national_id',
'user__base_order',
'user__mobile',
]
# تابع مربوط به ایجاد نماینده دامپزشکی برای کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = UserProfile.objects.get(key=request.data['user_key'], trash=False)
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False)
request.data.pop('user_key')
request.data.pop('kill_house_key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
vet = serializer.create(validated_data=request.data)
vet.kill_house = kill_house
vet.user = user
vet.save()
vet_serializer = self.serializer_class(vet)
return Response(vet_serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
def retrieve(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'kill_house_info' in request.GET:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
vet = Vet.objects.get(user=user, trash=False)
kill_house_vet = KillHouseVet.objects.filter(vet=vet)
if kill_house_vet.count() > 0:
kill_house_vet = kill_house_vet.last()
profile_info = {
'kill_house_name': kill_house_vet.kill_house.name,
'kill_house_user': kill_house_vet.kill_house.kill_house_operator.user.fullname,
'kill_house_mobile': kill_house_vet.kill_house.kill_house_operator.user.mobile,
'kill_house_city': kill_house_vet.kill_house.kill_house_operator.user.city.name,
'kill_house_province': kill_house_vet.kill_house.kill_house_operator.user.province.name,
}
return Response(profile_info, status=status.HTTP_200_OK)
if 'profile' in request.GET:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
user_serializer = SystemUserProfileSerializer(user)
vet = Vet.objects.get(user=user, trash=False)
vet_serializer = VetSerializer(vet)
vet_farm = VetFarm.objects.filter(vet=vet, trash=False)
serializer = VetFarmSerializer(vet_farm, many=True)
kill_house_vet = KillHouseVet.objects.filter(vet=vet)
if kill_house_vet.count() > 0:
kill_house_vet_serializer = KillHouseVetSerializer(kill_house_vet.last())
profile_info = {
# 'profile': user_serializer.data,
'vet': vet_serializer.data,
'kill_house_vet': kill_house_vet_serializer.data
}
else:
profile_info = {
# 'profile': user_serializer.data,
'vet': vet_serializer.data
# 'vet_farms':serializer.data
}
return Response(profile_info, status=status.HTTP_200_OK)
def list(self, request, *args, **kwargs):
value = request.GET.get('value')
search = request.GET.get('search')
vet_farm_flag = request.GET.get('vet_farm')
excluded_ids = set()
if vet_farm_flag:
if vet_farm_flag == 'true':
excluded_ids = set(VetFarm.objects.filter(trash=False).values_list('vet__id', flat=True).distinct())
elif vet_farm_flag == 'false':
excluded_ids = set(
KillHouseVet.objects.filter(trash=False).values_list('vet__id', flat=True).distinct())
else:
vet_farm_ids = set(VetFarm.objects.filter(trash=False).values_list('vet__id', flat=True).distinct())
kill_house_ids = set(KillHouseVet.objects.filter(trash=False).values_list('vet__id', flat=True).distinct())
excluded_ids = vet_farm_ids.union(kill_house_ids)
vets = Vet.objects.filter(trash=False)
if vet_farm_flag:
vets = vets.filter(id__in=excluded_ids)
else:
vets = vets.exclude(id__in=excluded_ids)
if value and search == 'filter' and value.strip() and value != 'undefined':
vets = vets.filter(build_query(VetFarmAndKillHouseFilterSet, value))
page_size = request.query_params.get('page_size')
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(vets)
if page is not None:
serializer_class = (
VetFarmListSerializer if vet_farm_flag == 'true' else VetKillHouseSerializer
if vet_farm_flag == 'false' else VetSerializer
)
serializer = serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = VetKillHouseSerializer(vets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseVetViewSet(viewsets.ModelViewSet):
queryset = KillHouseVet.objects.all()
serializer_class = KillHouseVetSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
if 'role' in request.data.keys():
if request.data['role'] == 'ProvinceInspector' or request.data['role'] == 'ProvinceOperator':
user = SystemUserProfile.objects.get(key=request.data['user_key'])
vet = Vet.objects.get(user=user, trash=False)
request.data.pop('user_key')
request.data.pop('role')
else:
request.data.pop('role')
user = SystemUserProfile.objects.get(user=request.user)
vet = Vet.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.get(key=request.data['key'])
request.data.pop('key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_vet = serializer.create(validated_data=request.data)
kill_house_vet.vet = vet
kill_house_vet.kill_house = kill_house
kill_house_vet.save()
kill_house_vet_serializer = self.serializer_class(kill_house_vet)
return Response(kill_house_vet_serializer.data, status=status.HTTP_201_CREATED)
return Response({"result": "مشکلی پیش آمذه است !"}, status=status.HTTP_403_FORBIDDEN)
def destroy(self, request, pk=None, *args, **kwargs):
try:
user = SystemUserProfile.objects.get(key=request.GET['user_key'])
vet = Vet.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.get(key=request.GET['key'])
kill_house_vet = KillHouseVet.objects.get(kill_house=kill_house, vet=vet, trash=False)
kill_house_vet.trash = True
kill_house_vet.save()
return Response(status=status.HTTP_200_OK)
except:
return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_403_FORBIDDEN)
# ویوست مربوط به تایید یا رد بار رسیده به کشتارگاه توسط نماینده دامپزشکی
class VetCheckRequestViewSet(viewsets.ModelViewSet):
queryset = VetCheckRequest.objects.all()
serializer_class = VetCheckRequestSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به تایید یا رد بار رسیده به کشتارگاه توسط نماینده دامپزشکی
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
vet = Vet.objects.get(user=user, trash=False)
kill_house_vet = KillHouseVet.objects.filter(vet=vet, trash=False).last()
kill_house_req = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False)
evacuation_permit = EvacuationPermit.objects.all().first()
if evacuation_permit:
if evacuation_permit.type == 'force':
if kill_house_req.clearance_code == None:
return Response(
{"result": "قبل از ورود کد قرنطینه توسط دامپزشک فارم امکان تایید تخلیه وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
if OperationLimitation.objects.all().first().kill_house_vet_limitation == True:
if kill_house_req.assignment_state_archive == 'True':
return Response({"result": "به علت ورود اطلاعات بار امکان تایید تخلیه وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
province_kill_request = ProvinceKillRequest.objects.get(key=kill_house_req.province_kill_request.key,
trash=False)
if int(request.data['accepted_real_quantity']) > 0 and request.data['accepted_real_weight'] > 0:
kill_house_req.accepted_real_quantity = int(request.data['accepted_real_quantity'])
kill_house_req.accepted_real_weight = request.data['accepted_real_weight']
kill_house_req.vet_accepted_real_quantity = int(request.data['accepted_real_quantity'])
kill_house_req.vet_accepted_real_weight = request.data['accepted_real_weight']
kill_house_req.save()
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key)
request.data.pop('kill_house_request_key')
if 'accepted_real_quantity' in request.data.keys() and 'accepted_real_weight' in request.data.keys():
if request.data['accepted_real_quantity'] != None and request.data['accepted_real_weight'] != None:
if int(request.data['accepted_real_quantity']) > 0 and request.data['accepted_real_weight'] > 0:
if kill_house_req.assignment_state_archive == 'pending' and kill_house_req.accepted_assignment_real_quantity == 0:
update_kill_house_requests(province_kill_request, poultry_request)
update_province_kill_requests(hatching)
poultry_prediction(hatching.poultry)
# kill_house_req.accepted_real_quantity = int(request.data['accepted_real_quantity'])
kill_house_req.vet_accepted_real_quantity = int(request.data['accepted_real_quantity'])
request.data.pop('accepted_real_quantity')
if 'accepted_real_weight' in request.data.keys():
if request.data['accepted_real_weight'] != None:
# kill_house_req.accepted_real_weight = request.data['accepted_real_weight']
kill_house_req.vet_accepted_real_weight = request.data['accepted_real_weight']
request.data.pop('accepted_real_weight')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
vet_check = serializer.create(validated_data=request.data)
vet_check.kill_house_request = kill_house_req
if vet_check.state == 'accepted':
kill_house_req.vet_state = 'accepted'
kill_house_req.active_state = 'inactive'
kill_house_req.save()
else:
kill_house_req.vet_state = 'rejected'
kill_house_req.active_state = 'inactive'
kill_house_req.save()
vet_check.kill_house_vet = kill_house_vet
vet_check.save()
vet_check_serializer = self.serializer_class(vet_check)
return Response(vet_check_serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی کشتارگاه
class KillHouseRequestExchangeViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequestExchange.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestExchangeSerializer
# تابع مربوط به ایجاد درخواست بورسی کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = UserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.get(user=user, trash=False)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_request_exchange = serializer.create(validated_data=request.data)
kill_house_request_exchange.user = user
kill_house_request_exchange.kill_house = kill_house
kill_house_request_exchange.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی رزرو شده کشتارگاه
class KillHouseRequestExchangeReserveViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequestExchangeReserve.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestExchangeReserveSerializer
# تابع مربوط به ایجاد درخواست بورسی رزرو شده کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = UserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.get(user=user, trash=False)
poultry_exchange = PoultryRequestExchange.objects.get(key=request.data['key'], trash=False)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_request_exchange_reserve = serializer.create(validated_data=request.data)
kill_house_request_exchange_reserve.poultry_exchange = poultry_exchange
kill_house_request_exchange_reserve.kill_house = kill_house
kill_house_request_exchange_reserve.save()
poultry_exchange.state = 'reserved'
poultry_exchange.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی رزرو شده کشتارگاه
class KillHouseRequestActionViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequestAction.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestActionSerializer
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.get(kill_house_operator__user=user, trash=False)
poultry_request = PoultryRequest.objects.get(key=request.data['key'], trash=False)
request.data.pop('key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_auction = serializer.create(validated_data=request.data)
kill_house_auction.kill_house = kill_house
kill_house_auction.poultry_request = poultry_request
kill_house_auction.date = datetime.now() + timedelta(minutes=10)
kill_house_auction.save()
kill_house_auction_serializer = self.serializer_class(kill_house_auction)
return Response(kill_house_auction_serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.get(kill_house_operator=kill_house_operator, trash=False)
queryset = KillHouseRequestAction.objects.filter(kill_house=kill_house, trash=False)
# queryset = WareHouseFactor.objects.all().order_by('-create_date')
serializer = KillHouseRequestActionSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
queryset = KillHouseRequestAction.objects.get(key__exact=request.GET["key"], trash=False)
now = datetime.now()
if now.hour <= queryset.date.hour and now.minute <= queryset.date.minute:
queryset.delete()
return Response({"result": "object deleted"}, status=status.HTTP_200_OK)
else:
return Response({"result": "object can not deleted"}, status=status.HTTP_403_FORBIDDEN)
# ویوست مربوط به ایجاد نمایش و ویرایش و حذف درخواست بورسی رزرو شده کشتارگاه
class KillHouseRequestActionWinnerViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequestActionWinner.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestActionWinnerSerializer
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.get(kill_house_operator=kill_house_operator, trash=False)
queryset = KillHouseRequestActionWinner.objects.filter(kill_house_request_auction__kill_house=kill_house,
trash=False)
# queryset = WareHouseFactor.objects.all().order_by('-create_date')
serializer = KillHouseRequestActionWinnerSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به ایجاد نمایش و ویرایش و ... اضافه کردن ماشین به درخواست بورسی رزرو شده تایید شده کشتارگاه
class KillHouseRequestExchangeAddCarViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequestExchangeAddCar.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestExchangeAddCarSerializer
# تابع مربوط به اضافه کردن ماشین به درخواست بورسی رزرو شده تایید شده کشتارگاه
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
kill_house_reserve = KillHouseRequestExchangeReserve.objects.get(key=request.data['key'], trash=False)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_request_exchange_add_car = serializer.create(validated_data=request.data)
kill_house_request_exchange_add_car.kill_house_reserve = kill_house_reserve
kill_house_request_exchange_add_car.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
class DriverViewSet(viewsets.ModelViewSet):
queryset = KillHouseDriver.objects.all()
serializer_class = KillHouseDriverSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
"""
Show Driver Cars Information
"""
if 'my_car' in request.GET:
# get user object
userprofile = SystemUserProfile.objects.get(
user=request.user, trash=False
)
# get driver object & cars information
# driver = self.queryset.get(user=userprofile, trash=False)
# cars_objects = driver.Kill_house_add_car
# serializer = KillHouseADDCARSerializer(cars_objects)
# return Response(serializer.data, status=status.HTTP_200_OK)
cars = KillHouseDriver.objects.filter(user=userprofile, trash=False)
# cars_objects = KillHouseADDCAR.objects.filter(driver=driver, trash=False)
# serializer = KillHouseADDCARSerializer(cars_objects, many=True)
serializer = KillHouseDriverSerializer(cars, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# Show Driver Kill Requests Allocation
if 'my_allocations' in request.GET:
driver_allocations = []
# get user object
userprofile = SystemUserProfile.objects.get(
user=request.user, trash=False
)
# get driver object & cars information
# driver = self.queryset.get(user=userprofile, trash=False)
# cars_object = driver.Kill_house_add_car
kill_reqs = KillHouseRequest.objects.filter(add_car__driver__user=userprofile, trash=False)
# for item in kill_req:
# if str(cars_object.key) == item.car['key']:
# driver_allocations.append(item)
serializer = KillHouseRequestSerializer(kill_reqs, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response("Enter The Parameter", status=status.HTTP_400_BAD_REQUEST)
def retrieve(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'profile' in request.GET:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_driver = KillHouseDriver.objects.get(user=user, trash=False)
kill_house_driver_serializer = KillHouseDriverSerializer(kill_house_driver)
profile_info = {
'profile': kill_house_driver_serializer.data,
}
return Response(profile_info, status=status.HTTP_200_OK)
class DriverRequestCancelViewSet(viewsets.ModelViewSet):
queryset = DriverRequestCancel.objects.all()
serializer_class = DriverRequestCancelSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
kill_house_request = KillHouseRequest.objects.get(key=request.data['kill_house_request_key'], trash=False)
request.data.pop('kill_house_request_key')
add_car = KillHouseADDCAR.objects.get(key=request.data['Kill_house_add_car_key'], trash=False)
request.data.pop('Kill_house_add_car_key')
if KillHouseAssignmentInformation.objects.filter(kill_house_request=kill_house_request).exists():
return Response({"result": "can not cancel"}, status=status.HTTP_403_FORBIDDEN)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
driver_cancel = serializer.create(validated_data=request.data)
if kill_house_request.province_kill_request != None:
province_kill_request = ProvinceKillRequest.objects.get(
key=kill_house_request.province_kill_request.key, trash=False)
province_kill_request.quantity += kill_house_request.quantity
province_kill_request.save()
else:
kill_house_request_auction = KillHouseRequestActionWinner.objects.get(
key=kill_house_request.kill_house_request_auction_winner.key, trash=False)
kill_house_request_auction.quantity += kill_house_request.quantity
kill_house_request_auction.save()
driver_cancel.kill_house_request = kill_house_request
driver_cancel.Kill_house_add_car = add_car
driver_cancel.save()
kill_house_request.trash = True
kill_house_request.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
class KillHouseComplaintViewSet(viewsets.ModelViewSet):
queryset = KillHouseComplaint.objects.all()
serializer_class = KillHouseComplaintSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
role = request.data['role']
request.data.pop('role')
image_list = []
bar = KillHouseAssignmentInformation.objects.get(key=request.data['bar_key'], trash=False)
request.data.pop('bar_key')
percent = request.data['percent']
request.data.pop('percent')
try:
images = request.data['image']
request.data.pop('image')
except:
images = None
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
complaint = serializer.create(validated_data=request.data)
complaint.bar = bar
if images != None:
for image in images:
image_list.append(send_image_to_server(image))
complaint.image = image_list
if percent != None:
complaint.percent = percent
complaint.save()
bar.unusual_casualties = True
bar.save()
if role == 'KillHouse':
kill_house = KillHouse.objects.get(kill_house_operator__user=user)
kill_house_name = kill_house.kill_house_operator.user.fullname
information = {
"role": role,
"kill_house_name": kill_house.name,
"kill_house_operator_name": kill_house_name,
"date": str(complaint.create_date)
}
elif role == "KillHouseVet":
vet = Vet.objects.get(user=user)
kill_house_vet = KillHouseVet.objects.get(vet=vet)
kill_house_vet_name = kill_house_vet.vet.user.fullname
information = {
"role": role,
"kill_house_vet": kill_house_vet_name,
"date": str(complaint.create_date)
}
complaint.registrar = information
complaint.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
if 'role' in request.GET:
killhousecomplaints = []
if request.GET['role'] == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user)
kill_house = KillHouse.objects.get(kill_house_operator=kill_house_operator)
killhousecomplaints = KillHouseComplaint.objects.filter(
bar__kill_house_request__killhouse_user=kill_house)
if killhousecomplaints.count() > 0:
serializer = KillHouseComplaintSerializer(killhousecomplaints, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif request.GET['role'] == 'KillHouseVet':
vet = Vet.objects.get(user=user)
kill_house_vet = KillHouseVet.objects.get(vet=vet)
kill_house = KillHouse.objects.get(key=kill_house_vet.kill_house.key)
killhousecomplaints = KillHouseComplaint.objects.filter(
bar__kill_house_request__killhouse_user=kill_house)
if killhousecomplaints.count() > 0:
serializer = KillHouseComplaintSerializer(killhousecomplaints, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
else:
killhousecomplaints = KillHouseComplaint.objects.filter(
bar__kill_house_request__killhouse_user__system_address__province__id=user.province.id)
if killhousecomplaints.count() > 0:
serializer = KillHouseComplaintSerializer(killhousecomplaints, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(killhousecomplaints, status=status.HTTP_200_OK)
def update(self, request, *args, **kwargs):
# refresh(request.user.id)
Killhousecomplaint = KillHouseComplaint.objects.get(key=request.data['key'])
new_bar = KillHouseAssignmentInformation.objects.get(key=request.data['bar_key'], trash=False)
request.data.pop('key')
request.data.pop('bar_key')
percent = request.data['percent']
new_title = request.data['title']
new_image = request.data['image']
new_percent = request.data['percent']
new_message = request.data['message']
Killhousecomplaint.bar = new_bar
Killhousecomplaint.title = new_title
Killhousecomplaint.image = new_image
Killhousecomplaint.percent = new_percent
Killhousecomplaint.message = new_message
Killhousecomplaint.save()
return Response(status=status.HTTP_200_OK)
def destroy(self, request, *args, **kwargs):
# refresh(request.user.id)
Killhousecomplaint = KillHouseComplaint.objects.get(key=request.data['key'])
Killhousecomplaint.trash = True
Killhousecomplaint.save()
return Response(status=status.HTTP_200_OK)
class CheckKillHouseComplaintViewSet(viewsets.ModelViewSet):
queryset = CheckKillHouseComplaint.objects.all()
serializer_class = CheckKillHouseComplaintSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
complaint = KillHouseComplaint.objects.get(key=request.data['complaint_key'], trash=False)
request.data.pop('complaint_key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
percent = PercentageOfLosses.objects.all()
if percent.count() > 0:
percent = percent.last()
else:
return Response('dont have PercentageOfLosses ', status=status.HTTP_403_FORBIDDEN)
check = serializer.create(validated_data=request.data)
check.camplaint = complaint
if check.state == 'accepted':
bar = KillHouseAssignmentInformation.objects.get(key=complaint.bar.key)
complaint_percent = complaint.percent
if float(complaint_percent) > float(percent.percent):
main_percent = float(complaint_percent) - float(percent.percent)
bar.car_weight_with_load = float(bar.car_weight_with_load) - (
(main_percent / 100) * (float(bar.car_weight_with_load)))
bar.net_weight = float(bar.net_weight) - (
(main_percent / 100) * (float(bar.net_weight)))
bar.save()
province_factor = ProvinceFactorToKillHouse.objects.filter(
province_check_info__kill_house_assignment__key=complaint.bar.key)
poultry_factor = ProvinceFactorToKillHouseForPoultry.objects.filter(
province_check_info__kill_house_assignment__key=complaint.bar.key)
complaint.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
class KillHouseBarReportingViewSet(viewsets.ModelViewSet):
queryset = KillHouseAssignmentInformation.objects.all()
serializer_class = KillHouseAssignmentInformationSerializer
permission_classes = [AllowAny]
def create(self, request, *args, **kwargs):
return Response(status=status.HTTP_401_UNAUTHORIZED)
def update(self, request, *args, **kwargs):
return Response(status=status.HTTP_401_UNAUTHORIZED)
def destroy(self, request, *args, **kwargs):
return Response(status=status.HTTP_401_UNAUTHORIZED)
def partial_update(self, request, *args, **kwargs):
return Response(status=status.HTTP_401_UNAUTHORIZED)
def list(self, request, *args, **kwargs):
total_list = []
net_weight = 0
api_key = request.GET['api_key']
if api_key == PROJECT_API_KEY:
for kill_house in KillHouse.objects.filter(system_address__province__id=1):
internal_list = []
date_time = datetime.strptime(request.GET['date'], '%Y-%m-%d')
assignments = KillHouseAssignmentInformation.objects.filter(
kill_house_request__killhouse_user=kill_house, create_date__year=date_time.year,
create_date__month=date_time.month, create_date__day=date_time.day)
if assignments.count() > 0:
for assignment in assignments:
net_weight += assignment.net_weight
internal_dict = {
"date": date_time,
"weight": net_weight,
}
internal_list.append(internal_dict)
kill_house_dict = {
"kill_house_name": kill_house.name,
"fullname": kill_house.kill_house_operator.user.fullname,
"mobile": kill_house.kill_house_operator.user.mobile,
"city": kill_house.system_address.city.name,
"province": kill_house.system_address.province.name,
"bar_info": internal_list,
}
total_list.append(kill_house_dict)
return Response(total_list, status=status.HTTP_200_OK)
class CheckUnusualCasualtiesViewSet(viewsets.ModelViewSet):
queryset = CheckUnusualCasualties.objects.all()
serializer_class = CheckUnusualCasualtiesSerializer
permission_classes = [AllowAny]
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
# return Response(user.fullname)
kill_house_complaint = KillHouseComplaint.objects.get(key=request.data['key'])
request.data.pop('key')
bar_info = KillHouseAssignmentInformation.objects.get(key=kill_house_complaint.bar.key)
state = request.data['state']
if state == "accepted":
percentage_losses = PercentageOfLosses.objects.all()
if percentage_losses.count() > 0:
percentage_losses = percentage_losses.last().percent
else:
return Response({"result": "enter percentage of losses"}, status=status.HTTP_403_FORBIDDEN)
weight = kill_house_complaint.bar.net_weight - (kill_house_complaint.bar.net_weight * (
(kill_house_complaint.percent / 100) - (percentage_losses / 100)))
bar_info.weight_withs_losses = weight
bar_info.save()
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
unusualcasualties = serializer.create(validated_data=request.data)
unusualcasualties.complaint = kill_house_complaint
if unusualcasualties.state == 'accepted':
kill_house_complaint.state = 'accepted'
kill_house_complaint.save()
if unusualcasualties.state == 'rejected':
unusualcasualties.message = request.data['message']
kill_house_complaint.state = 'rejected'
kill_house_complaint.message = request.data['message']
kill_house_complaint.save()
unusualcasualties.save()
inter_dict = {
"operatorname": user.fullname,
"create_date": str(unusualcasualties.create_date),
"role": request.data['role'],
"state": unusualcasualties.state,
}
unusualcasualties.role = inter_dict
unusualcasualties.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
@api_view(["POST"])
@csrf_exempt
@permission_classes([AllowAny])
def make_kill_request(request):
user = SystemUserProfile.objects.get(user=request.user)
now = datetime.now().date()
for kill_house in KillHouse.objects.filter(system_address__province=user.province):
debt_amount = 0
percentage = KillHousePercentage.objects.get(kill_house=kill_house)
total_poultry_request = TotalPoultryRequestQuantity.objects.filter(create_date__year=now.year,
create_date__month=now.month,
create_date__day=now.day).order_by('id')
first_average_weight = 0
first_assignment_average_weight = 0
seconde_average_weight = 0
seconde_assignment_average_weight = 0
all_assigntments = KillHouseAssignmentInformation.objects.filter(
kill_house_request__killhouse_user=kill_house).order_by('id')
if all_assigntments.count() > 0:
for all_assigntment in all_assigntments:
first_assignment_average_weight += all_assigntment.net_weight / all_assigntment.real_quantity
first_average_weight += round(first_assignment_average_weight / all_assigntments.count(), 2)
four_all_assigntments = KillHouseAssignmentInformation.objects.filter(
kill_house_request__killhouse_user=kill_house).order_by('id')[:4]
for four_last_assingment in four_all_assigntments:
seconde_assignment_average_weight += four_last_assingment.net_weight / four_last_assingment.real_quantity
seconde_average_weight += round(seconde_assignment_average_weight / four_all_assigntments.count(), 2)
if total_poultry_request.count() > 0:
total_poultry_request = total_poultry_request.last()
if total_poultry_request.input_quantity != 0:
percentage.quantity = int(((percentage.percent / 100) / 100) * total_poultry_request.input_quantity)
else:
percentage.quantity = int(((percentage.percent / 10000) * total_poultry_request.quantity))
percentage.save()
poultry_factors = ProvinceFactorToKillHouseForPoultry.objects.filter(
province_check_info__kill_house_assignment__kill_house_request__killhouse_user=kill_house,
paid_state='pending')
province_factors = ProvinceFactorToKillHouse.objects.filter(
province_check_info__kill_house_assignment__kill_house_request__killhouse_user=kill_house,
paid_state='pending')
if poultry_factors.count() > 0:
for poultry_factor in poultry_factors:
debt_amount += poultry_factor.total_price
if province_factors.count() > 0:
for province_factor in province_factors:
debt_amount += province_factor.total_price
kill_req = KillRequest(
kill_capacity=percentage.quantity,
remain_quantity=percentage.quantity,
recive_time='06 - 14',
recive_date=datetime.now(),
first_average_weight=seconde_average_weight,
second_average_weight=first_average_weight,
kill_house=kill_house
)
kill_req.save()
if debt_amount > 0:
kill_req.debt_amount = debt_amount
kill_req.debt = True
kill_req.save()
return JsonResponse({"msg": "Done"})
class KillHouseNewViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.select_related('kill_house_operator__user').filter(trash=False)
# queryset = KillHouse.objects.filter(trash=False)
serializer_class = KillHouseSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
kill_houses = self.queryset.all()
FullName = [kill_house.kill_house_operator.user.fullname for kill_house in kill_houses]
return Response(FullName, status=status.HTTP_200_OK)
class KillHouseWareHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouseWareHouse.objects.all()
serializer_class = KillHouseWareHouseSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date = datetime.strptime(request.GET['date'],
'%Y-%m-%d').date() if 'date' in request.GET else now
if 'kill_house_key' in request.GET:
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False)
else:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house,
date__date=date,
trash=False).last()
if kill_house_ware_house is None:
ware_house_date = datetime(year=date.year, month=date.month, day=date.day, hour=1, minute=12, second=20)
kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_house,
date=ware_house_date
)
kill_house_ware_house.save()
bar_quantity = 0
allocated_quantity = 0
bar_live_weight = 0
number_of_carcasses = 0
update_number_of_carcasses = 0
weight_of_carcasses = 0
update_weight_of_carcasses = 0
ave_weight_of_carcasses = 0
free_number_of_carcasses = 0
free_weight_of_carcasses = 0
free_sale_number_of_carcasses = 0
free_sale_weight_of_carcasses = 0
free_bar_quantity = 0
free_sale_bar_quantity = 0
total_bar_quantity = 0
total_number_of_carcasses = 0
total_weight_of_carcasses = 0
# assingments = KillHouseAssignmentInformation.objects.filter(kill_house_request__killhouse_user=kill_house,
# state__in=('pending', 'accepted'),
# kill_house_request__kill_request__recive_date__year=date.year,
# kill_house_request__kill_request__recive_date__month=date.month,
# kill_house_request__kill_request__recive_date__day=date.day,
# trash=False).select_related('kill_house_request')
one_day_ago = date - timedelta(days=1)
kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=kill_house,
kill_request__recive_date__date=one_day_ago,
ware_house_confirmation=True, trash=False)
if kill_house_requests.count() > 0:
for kill_house_request in kill_house_requests:
bar_quantity += 1
allocated_quantity += kill_house_request.accepted_real_quantity
bar_live_weight += kill_house_request.accepted_real_weight
number_of_carcasses += kill_house_request.ware_house_accepted_real_quantity
weight_of_carcasses += kill_house_request.ware_house_accepted_real_weight
# kill_house_loss_percentage = KillHousePercentageOfLosses.objects.all().last()
# if kill_house_loss_percentage:
# weight_of_carcasses += kill_house_request.accepted_real_weight - (
# (kill_house_loss_percentage.percent / 100) * kill_house_request.accepted_real_weight)
# else:
# weight_of_carcasses += kill_house_request.accepted_real_weight - (
# (25 / 100) * kill_house_request.accepted_real_weight)
ave_weight_of_carcasses += weight_of_carcasses / number_of_carcasses
free_bars = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house, date__date=date, ware_house=True,
trash=False)
freezing_quantity = 0
freezing_weight = 0
freezing_bars = ColdHouseAllocations.objects.filter(kill_house_ware_house=kill_house_ware_house,
state__in=('pending', 'accepted'), date__date=date,
trash=False)
if len(freezing_bars) > 0:
for freezing_bar in freezing_bars:
freezing_quantity += freezing_bar.accepted_quantity if freezing_bar.accepted_quantity > 0 else freezing_bar.quantity
freezing_weight += freezing_bar.accepted_weight if freezing_bar.accepted_weight > 0 else freezing_bar.weight
if free_bars.count() > 0:
for free_bar in free_bars:
free_bar_quantity += 1
free_number_of_carcasses += free_bar.number_of_carcasses
free_weight_of_carcasses += free_bar.weight_of_carcasses
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house,
date__date=date,
trash=False)
if kill_house_free_sale_bar_info.count() > 0:
for kill_house_free_sale in kill_house_free_sale_bar_info:
free_sale_bar_quantity += 1
free_sale_number_of_carcasses += kill_house_free_sale.number_of_carcasses
free_sale_weight_of_carcasses += kill_house_free_sale.weight_of_carcasses
update_number_of_carcasses = kill_house_ware_house.updated_number_of_carcasses
update_weight_of_carcasses = kill_house_ware_house.updated_weight_of_carcasses
total_bar_quantity = bar_quantity + free_bar_quantity + free_sale_bar_quantity
total_number_of_carcasses = number_of_carcasses + free_number_of_carcasses + kill_house_ware_house.pre_cold_number_of_carcasses_to_ware_house
update_total_number_of_carcasses = update_number_of_carcasses + free_number_of_carcasses + kill_house_ware_house.pre_cold_number_of_carcasses_to_ware_house if update_number_of_carcasses > 0 else 0
total_weight_of_carcasses = weight_of_carcasses + free_weight_of_carcasses + kill_house_ware_house.pre_cold_weight_of_carcasses_to_ware_house
update_total_weight_of_carcasses = update_weight_of_carcasses + free_weight_of_carcasses + kill_house_ware_house.pre_cold_weight_of_carcasses_to_ware_house if update_weight_of_carcasses > 0 else 0
kill_house_ware_house.bar_quantity = bar_quantity
kill_house_ware_house.allocated_quantity = allocated_quantity
kill_house_ware_house.bar_live_weight = bar_live_weight
kill_house_ware_house.number_of_carcasses = number_of_carcasses
kill_house_ware_house.update_number_of_carcasses = update_number_of_carcasses
kill_house_ware_house.weight_of_carcasses = weight_of_carcasses
kill_house_ware_house.update_weight_of_carcasses = update_weight_of_carcasses
kill_house_ware_house.ave_weight_of_carcasses = weight_of_carcasses / number_of_carcasses if number_of_carcasses > 0 else 0
kill_house_ware_house.update_ave_weight_of_carcasses = update_weight_of_carcasses / update_number_of_carcasses if update_number_of_carcasses > 0 else 0
kill_house_ware_house.free_bar_quantity = free_bar_quantity
kill_house_ware_house.number_of_free_carcasses = free_number_of_carcasses
kill_house_ware_house.free_weight_of_carcasses = free_weight_of_carcasses
kill_house_ware_house.free_sale_quantity = free_sale_number_of_carcasses
kill_house_ware_house.free_sale_weight = free_sale_weight_of_carcasses
kill_house_ware_house.total_bar_quantity = total_bar_quantity
kill_house_ware_house.freezing_quantity = freezing_quantity
kill_house_ware_house.freezing_weight = freezing_weight
kill_house_ware_house.total_number_of_carcasses = total_number_of_carcasses
kill_house_ware_house.update_total_number_of_carcasses = update_total_number_of_carcasses
kill_house_ware_house.total_weight_of_carcasses = total_weight_of_carcasses
kill_house_ware_house.update_total_weight_of_carcasses = update_total_weight_of_carcasses
if update_total_weight_of_carcasses == 0:
kill_house_ware_house.remain_total_weight_of_carcasses = total_weight_of_carcasses - kill_house_ware_house.allocated_total_weight_of_carcasses if kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house == 0 else 0
else:
kill_house_ware_house.remain_total_weight_of_carcasses = update_total_weight_of_carcasses - kill_house_ware_house.allocated_total_weight_of_carcasses if kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house == 0 else 0
if update_total_number_of_carcasses == 0:
kill_house_ware_house.remain_total_number_of_carcasses = total_number_of_carcasses - kill_house_ware_house.allocated_total_number_of_carcasses if kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house == 0 else 0
else:
kill_house_ware_house.remain_total_number_of_carcasses = update_total_number_of_carcasses - kill_house_ware_house.allocated_total_number_of_carcasses if kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house == 0 else 0
kill_house_ware_house.final_total_number_of_carcasses = kill_house_ware_house.update_total_number_of_carcasses if kill_house_ware_house.update_total_number_of_carcasses > 0 else kill_house_ware_house.total_number_of_carcasses
kill_house_ware_house.final_total_weight_of_carcasses = kill_house_ware_house.update_total_weight_of_carcasses if kill_house_ware_house.update_total_weight_of_carcasses > 0 else kill_house_ware_house.total_weight_of_carcasses
kill_house_ware_house.save()
if 'state' in request.GET:
total_number_of_carcasses_temp = kill_house_ware_house.update_total_number_of_carcasses if kill_house_ware_house.update_total_number_of_carcasses > 0 else kill_house_ware_house.total_number_of_carcasses
total_weight_of_carcasses_temp = kill_house_ware_house.update_total_weight_of_carcasses if kill_house_ware_house.update_total_weight_of_carcasses > 0 else kill_house_ware_house.total_weight_of_carcasses
update_fields = {
"ware_house_key": kill_house_ware_house.key,
"total_number_of_carcasses": kill_house_ware_house.final_total_number_of_carcasses,
"pre_cold_number_of_carcasses_self_ware_house": kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house,
"pre_cold_weight_of_carcasses_self_ware_house": kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house,
"total_weight_of_carcasses": kill_house_ware_house.final_total_weight_of_carcasses,
"allocated_total_number_of_carcasses": kill_house_ware_house.allocated_total_number_of_carcasses,
"allocated_total_weight_of_carcasses": kill_house_ware_house.allocated_total_weight_of_carcasses,
"remain_total_number_of_carcasses": kill_house_ware_house.remain_total_number_of_carcasses,
"remain_total_weight_of_carcasses": kill_house_ware_house.remain_total_weight_of_carcasses,
"freezing_quantity": kill_house_ware_house.freezing_quantity,
"freezing_weight": kill_house_ware_house.freezing_weight,
"free_sale_quantity": kill_house_ware_house.free_sale_quantity,
"free_sale_weight": kill_house_ware_house.free_sale_weight,
"total_average_weight_of_carcasses": round(
kill_house_ware_house.final_total_weight_of_carcasses / kill_house_ware_house.final_total_number_of_carcasses,
2) if kill_house_ware_house.final_total_number_of_carcasses > 0 else 0,
}
return Response(update_fields, status=status.HTTP_200_OK)
serializer = KillHouseWareHouseSerializer(kill_house_ware_house)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
ware_house = KillHouseWareHouse.objects.get(key=request.data['key'])
ware_house.updated_number_of_carcasses = int(request.data['updated_number_of_carcasses'])
ware_house.updated_weight_of_carcasses = request.data['updated_weight_of_carcasses']
ware_house.total_weight_of_carcasses = request.data[
'updated_weight_of_carcasses'] + ware_house.free_weight_of_carcasses
ware_house.total_number_of_carcasses = int(request.data[
'updated_number_of_carcasses']) + ware_house.number_of_free_carcasses
ware_house.save()
serializer = self.serializer_class(ware_house)
serializer.update(instance=ware_house, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseWareHouseForDispensersViewSet(viewsets.ModelViewSet):
queryset = KillHouseWareHouse.objects.all()
serializer_class = KillHouseWareHouseSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
date1 = datetime.strptime(request.GET['date1'], '%Y-%m-%d').date()
date2 = datetime.strptime(request.GET['date2'], '%Y-%m-%d').date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if request.GET['role'] in ('CityCommerce', 'CityJahad', 'CityPoultry', 'CityOperator'):
kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__system_address__city=user.city,
date__date__gte=date1, date__date__lte=date2,
trash=False)
else:
kill_house_ware_houses = KillHouseWareHouse.objects.filter(date__date__gte=date1, date__date__lte=date2,
trash=False)
result = {
"kill_houses": len(kill_house_ware_houses.values_list('kill_house', flat=True).distinct()),
"total_number_of_carcasses": kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total'] or 0,
"total_weight_of_carcasses": kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total'] or 0,
"pre_cold_number_of_carcasses_self_ware_house":
kill_house_ware_houses.aggregate(total=Sum('pre_cold_number_of_carcasses_self_ware_house'))[
'total'] or 0,
"pre_cold_weight_of_carcasses_self_ware_house":
kill_house_ware_houses.aggregate(total=Sum('pre_cold_weight_of_carcasses_self_ware_house'))[
'total'] or 0,
"allocated_total_number_of_carcasses":
kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total'] or 0,
"allocated_total_weight_of_carcasses":
kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total'] or 0,
"remain_total_number_of_carcasses":
kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total'] or 0,
"remain_total_weight_of_carcasses":
kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total'] or 0,
"freezing_quantity": kill_house_ware_houses.aggregate(total=Sum('freezing_quantity'))['total'] or 0,
"freezing_weight": kill_house_ware_houses.aggregate(total=Sum('freezing_weight'))['total'] or 0,
"free_sale_quantity": kill_house_ware_houses.aggregate(total=Sum('free_sale_quantity'))['total'] or 0,
"free_sale_weight": kill_house_ware_houses.aggregate(total=Sum('free_sale_weight'))['total'] or 0
}
return Response(result, status=status.HTTP_200_OK)
class PreColdKillHouseWareHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouseWareHouse.objects.all()
serializer_class = KillHouseWareHouseSerializer
permission_classes = [TokenHasReadWriteScope]
def create(self, request, *args, **kwargs):
now = datetime.now().date()
kill_house_ware_house = KillHouseWareHouse.objects.get(key=request.data['ware_house_key'])
if kill_house_ware_house.date.date() != now:
return Response({"result": "به علت مغایرت تاریخ امکان پیش سرد وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
tomorrow = kill_house_ware_house.date + timedelta(days=1)
kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house = kill_house_ware_house.remain_total_number_of_carcasses
kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house = kill_house_ware_house.remain_total_weight_of_carcasses
kill_house_ware_house.remain_total_number_of_carcasses = 0
kill_house_ware_house.remain_total_weight_of_carcasses = 0
kill_house_ware_house.save()
tomorrow_kill_house_ware_house = KillHouseWareHouse.objects.filter(kill_house=kill_house_ware_house.kill_house,
date__date=tomorrow.date()).first()
if not tomorrow_kill_house_ware_house:
tomorrow_kill_house_ware_house = KillHouseWareHouse(
kill_house=kill_house_ware_house.kill_house,
date=kill_house_ware_house.date + timedelta(days=1)
)
tomorrow_kill_house_ware_house.save()
tomorrow_kill_house_ware_house.final_total_number_of_carcasses += kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.total_number_of_carcasses += kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.final_total_weight_of_carcasses += kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.total_weight_of_carcasses += kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.remain_total_number_of_carcasses += kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.remain_total_weight_of_carcasses += kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.pre_cold_number_of_carcasses_to_ware_house = kill_house_ware_house.pre_cold_number_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.pre_cold_weight_of_carcasses_to_ware_house = kill_house_ware_house.pre_cold_weight_of_carcasses_self_ware_house
tomorrow_kill_house_ware_house.save()
return Response({"result": "با موفقیت انجام شد!"}, status=status.HTTP_201_CREATED)
class KillHouseFreeSaleBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeSaleBarInformation.objects.all()
serializer_class = KillHouseFreeSaleBarInformationSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFreeSaleBarInformationFilterSet
filterset_fields = [
'type_car',
'pelak',
'clearance_code',
'kill_house__name',
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__first_name',
'kill_house__kill_house_operator__user__last_name',
'kill_house__kill_house_operator__user__mobile',
'buyer__fullname',
'buyer__first_name',
'buyer__last_name',
'buyer__mobile',
'buyer__unit_name',
'buyer_name',
'buyer_mobile',
'province',
'city',
]
def create(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().date()
now_time = datetime.now().time()
quota = request.data['quota']
buyer = None
dispenser = request.data.pop('dispenser',None)
representative = request.data.pop('representative',None)
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')
elif 'buyer_key' in request.data.keys():
kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
buyer = OutProvinceCarcassesBuyer.objects.get(key=request.data['buyer_key'])
request.data.pop('buyer_key')
product = RolesProducts.objects.get(key=request.data['product_key'])
request.data.pop('product_key')
date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date()
production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date()
date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour,
minute=now_time.minute,
second=now_time.second)
production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day,
hour=now_time.hour,
minute=now_time.minute,
second=now_time.second)
request.data.pop('date')
request.data.pop('production_date')
if OperationLimitation.objects.all().first().kill_house_free_sale_limitation == True:
if now != date.date():
return Response({"result": "به علت مغایرت تاریخ امکان فروش بار وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False,
distribution_type='KillHouse',
allow=True,
out=True).first()
if carcass_distribution and datetime.now().time() > carcass_distribution.time:
return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"},
status=status.HTTP_403_FORBIDDEN)
# ware_house = KillHouseWareHouse.objects.get(kill_house=kill_house, date__date=date)
# if request.data['weight_of_carcasses'] > ware_house.remain_total_weight_of_carcasses:
# return Response({"result": "تعداد یا مقدار وارد شده از موجودی انبار بیشتر است !"},
# status=status.HTTP_403_FORBIDDEN)
kill_house_total_input_warehouse_governmental_weight = kill_house.total_input_warehouse_governmental_weight
kill_house_total_input_warehouse_free_weight = kill_house.total_input_warehouse_free_weight
if request.data['sale_type'] == 'free':
quota = request.data['quota']
if quota == 'governmental':
if not kill_house.free_sale_form_governmental_quota:
return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
if quota == 'governmental':
if kill_house.total_input_warehouse_governmental_weight < (
kill_house.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']):
return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house.total_input_warehouse_free_weight < (
kill_house.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']):
return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
if quota == 'governmental':
free_sale_type = request.data['sale_type']
if kill_house.governmental_selling_permission:
if free_sale_type == 'free':
if not kill_house.free_sale_form_governmental_quota:
if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight:
return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight:
return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"},
status=status.HTTP_403_FORBIDDEN)
else:
return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN)
if kill_house.total_commitment_selling_out_province_governmental_weight > 0:
if kill_house.total_selling_out_province_governmental_weight + request.data[
'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_governmental_weight:
return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house.free_selling_permission:
if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight:
return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"},
status=status.HTTP_403_FORBIDDEN)
else:
return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN)
if kill_house.total_commitment_selling_out_province_free_weight > 0:
if kill_house.total_selling_out_province_free_weight + request.data[
'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_free_weight:
return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
ware_house_remain_weight = product.total_remain_weight
allocations_weight = StewardAllocation.objects.filter(trash=False, receiver_state__in=('pending', 'accepted'),
kill_house=kill_house, date__date=now).aggregate(
total=Sum('real_weight_of_carcasses'))['total'] or 0
free_sales_weight = \
KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house=kill_house,
date__date=now).aggregate(
total=Sum('real_weight_of_carcasses'))['total'] or 0
total_weight = ware_house_remain_weight + allocations_weight + free_sales_weight
free_sales_weight += request.data['weight_of_carcasses']
# if kill_house.in_province_selling_limitation and kill_house.in_province_selling_limitation_percent > 0:
# in_province_limitation_weight = int(
# total_weight * (kill_house.in_province_selling_limitation_percent / 100))
# if allocations_weight < in_province_limitation_weight:
# return Response(
# {"result": "به دلیل عدم رعایت حداقل فروش/توزیع داخل استان امکان فروش به خارج استان وجود ندارد!"},
# status=status.HTTP_403_FORBIDDEN)
#
# if kill_house.out_province_selling_limitation and kill_house.out_province_selling_limitation_percent > 0:
# max_out_province_limitation_weight = int(
# total_weight * (kill_house.out_province_selling_limitation_percent / 100))
# if free_sales_weight > max_out_province_limitation_weight:
# return Response({"result": "سقف فروش به خارج استان امروز شما پر شده است!"},
# status=status.HTTP_403_FORBIDDEN)
if KillHouseFreeSaleBarInformation.objects.filter(trash=False, clearance_code=request.data['clearance_code'],
quarantine_weight_of_carcasses__gt=0).exists():
return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"},
status=status.HTTP_403_FORBIDDEN)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_free_sale_bar_info = serializer.create(validated_data=request.data)
kill_house_free_sale_bar_info.kill_house = kill_house
if buyer is not None:
kill_house_free_sale_bar_info.buyer = buyer
kill_house_free_sale_bar_info.buyer_name = buyer.fullname
kill_house_free_sale_bar_info.buyer_mobile = buyer.mobile
kill_house_free_sale_bar_info.city = buyer.city
kill_house_free_sale_bar_info.province = buyer.province
kill_house_free_sale_bar_info.date = date
kill_house_free_sale_bar_info.production_date = production_date
kill_house_free_sale_bar_info.product = product
kill_house_free_sale_bar_info.dispenser = dispenser if dispenser else None
kill_house_free_sale_bar_info.representative = representative if representative else None
kill_house_free_sale_bar_info.real_number_of_carcasses = kill_house_free_sale_bar_info.number_of_carcasses
kill_house_free_sale_bar_info.real_weight_of_carcasses = kill_house_free_sale_bar_info.weight_of_carcasses
# ware_house.allocated_total_number_of_carcasses += kill_house_free_sale_bar_info.number_of_carcasses
# ware_house.allocated_total_weight_of_carcasses += kill_house_free_sale_bar_info.weight_of_carcasses
# ware_house.save()
wage = 0
wage_type = WageType.objects.filter(en_name='carcasse-sell', trash=False).first()
if wage_type.status == True:
wage = wage_type.amount
kill_house_free_sale_bar_info.wage = wage
kill_house_free_sale_bar_info.total_wage_amount = wage * kill_house_free_sale_bar_info.real_weight_of_carcasses
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':
kill_house_free_sale_bar_info.union_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
kill_house_free_sale_bar_info.company_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
kill_house_free_sale_bar_info.guilds_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
kill_house_free_sale_bar_info.city_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
kill_house_free_sale_bar_info.wallet_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.wallet_share_percent = percentage_wage_type.percent
else:
kill_house_free_sale_bar_info.other_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.other_share_percent = percentage_wage_type.percent
kill_house_free_sale_bar_info.save()
allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False,
active=True).first()
if allow_register_code:
number = random.randint(10000, 99000)
kill_house_free_sale_bar_info.registration_code = number
kill_house_free_sale_bar_info.system_registration_code = True
if int(allow_register_code.time) > 0:
kill_house_free_sale_bar_info.active_expire_date_time = True
kill_house_free_sale_bar_info.expire_date_time_registration_code = datetime.now() + timedelta(
minutes=int(allow_register_code.time))
kill_house_free_sale_bar_info.save()
send_sms_for_sale_bar(kill_house_free_sale_bar_info)
get_gid_out_province(kill_house_free_sale_bar_info.id)
kill_house_free_sale_product_warehousing(product)
return Response(serializer.data, status=status.HTTP_201_CREATED)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
kill_house_key = request.GET.get('kill_house_key')
if 'type' in request.GET:
role = request.GET['role']
if date1:
date1 = datetime.strptime(str(date1), '%Y-%m-%d').date()
date2 = datetime.strptime(str(date2), '%Y-%m-%d').date()
if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin',
'ImprovingLivestock', 'AdminX', 'Supporter']:
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
kill_house__key=kill_house_key,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
trash=False)
elif role in ['CityJahad', 'CityPoultry', 'CityOperator']:
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
date__date__gte=date1,
date__date__lte=date2,
kill_house__key=kill_house_key,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
date__date__gte=date1,
date__date__lte=date2,
trash=False)
else:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=kill_house,
date__date__gte=date1,
date__date__lte=date2,
trash=False)
else:
if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin',
'ImprovingLivestock', 'AdminX', 'Supporter']:
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
trash=False, kill_house__key=kill_house_key)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
trash=False)
elif role in ['CityJahad', 'CityPoultry', 'CityOperator']:
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
trash=False, kill_house__key=kill_house_key)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
trash=False)
else:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=kill_house,
trash=False)
if 'search' in request.GET:
kill_house_free_sale_bar_info_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=kill_house_free_sale_bar_info
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_free_sale_bar_info)
kill_house_free_sale_bar_info_list = ps.filter()
kill_house_free_sale_bar_info = [] if len(
kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_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(kill_house_free_sale_bar_info)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
else:
now = datetime.now().date()
date = datetime.strptime(str(request.GET['date']),
'%Y-%m-%d').date() if 'date' in request.GET else now
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'])
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house,
date__year=date.year,
date__month=date.month,
date__day=date.day,
trash=False)
serializer = self.serializer_class(kill_house_free_sale_bar_info, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.data['key'])
product = free_sale_bar.product
kill_house = free_sale_bar.kill_house
if KillHouseFreeSaleBarInformation.objects.filter(trash=False,
clearance_code=request.data.get('clearance_code'),
quarantine_weight_of_carcasses__gt=0).exists() and 'register_code' not in request.data.keys():
return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"},
status=status.HTTP_403_FORBIDDEN)
now = datetime.now().date()
if free_sale_bar.quota == 'governmental':
if free_sale_bar.kill_house.total_input_warehouse_governmental_weight < (
(
free_sale_bar.kill_house.total_selling_warehouse_governmental_weight - free_sale_bar.weight_of_carcasses) +
request.data[
'weight_of_carcasses']):
return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"},
status=status.HTTP_403_FORBIDDEN)
else:
if free_sale_bar.kill_house.total_input_warehouse_free_weight < (
(free_sale_bar.kill_house.total_selling_warehouse_free_weight - free_sale_bar.weight_of_carcasses) +
request.data[
'weight_of_carcasses']):
return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"},
status=status.HTTP_403_FORBIDDEN)
allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False,
active=True).first()
if allow_register_code:
if 'register_code' in request.data.keys():
code = request.data['register_code']
if code != free_sale_bar.registration_code:
return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN)
free_sale_bar.logged_registration_code = code
request.data.pop('register_code')
free_sale_bar.save()
serializer = self.serializer_class(free_sale_bar)
serializer.update(instance=free_sale_bar, validated_data=request.data)
kill_house_free_sale_product_warehousing(product)
free_sale_bar.real_number_of_carcasses = free_sale_bar.number_of_carcasses
free_sale_bar.real_weight_of_carcasses = free_sale_bar.weight_of_carcasses
free_sale_bar.total_wage_amount = free_sale_bar.wage * free_sale_bar.real_weight_of_carcasses
free_sale_bar.save()
kill_house_free_sale_product_warehousing(product)
union_percent = free_sale_bar.union_share_percent / 100 if free_sale_bar.union_share_percent > 0 else 0
company_percent = free_sale_bar.company_share_percent / 100 if free_sale_bar.company_share_percent > 0 else 0
guilds_percent = free_sale_bar.guilds_share_percent / 100 if free_sale_bar.guilds_share_percent > 0 else 0
city_share_percent = free_sale_bar.city_share_percent / 100 if free_sale_bar.city_share_percent > 0 else 0
wallet_share_percent = free_sale_bar.wallet_share_percent / 100 if free_sale_bar.wallet_share_percent > 0 else 0
other_share_percent = free_sale_bar.other_share_percent / 100 if free_sale_bar.other_share_percent > 0 else 0
free_sale_bar.union_share = int(union_percent * free_sale_bar.total_wage_amount)
free_sale_bar.company_share = int(company_percent * free_sale_bar.total_wage_amount)
free_sale_bar.guilds_share = int(guilds_percent * free_sale_bar.total_wage_amount)
free_sale_bar.city_share = int(city_share_percent * free_sale_bar.total_wage_amount)
free_sale_bar.wallet_share = int(wallet_share_percent * free_sale_bar.total_wage_amount)
free_sale_bar.other_share = int(other_share_percent * free_sale_bar.total_wage_amount)
get_gid_out_province(free_sale_bar.id)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.GET['key'])
product = free_sale_bar.product
# ware_house = KillHouseWareHouse.objects.get(kill_house=free_sale_bar.kill_house,
# date__date=free_sale_bar.date.date(), trash=False)
#
# if ware_house.allocated_total_number_of_carcasses != free_sale_bar.real_number_of_carcasses or ware_house.allocated_total_weight_of_carcasses != free_sale_bar.real_weight_of_carcasses:
# if ware_house.remain_total_number_of_carcasses < free_sale_bar.real_number_of_carcasses or ware_house.remain_total_weight_of_carcasses < free_sale_bar.real_weight_of_carcasses:
# return Response({"result": "به علت تخصیص بار به مباشرین و صنف ها امکان حذف بار وجود ندارد!"},
# status=status.HTTP_403_FORBIDDEN)
free_sale_bar.trash = True
free_sale_bar.save()
kill_house_free_sale_product_warehousing(product)
#
# ware_house.allocated_total_number_of_carcasses -= free_sale_bar.real_number_of_carcasses
# ware_house.allocated_total_weight_of_carcasses -= free_sale_bar.real_weight_of_carcasses
# ware_house.save()
return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK)
class PosKillHouseFreeSaleBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeSaleBarInformation.objects.all()
serializer_class = KillHouseFreeSaleBarInformationSerializer
permission_classes = [AllowAny]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFreeSaleBarInformationFilterSet
filterset_fields = [
'type_car',
'pelak',
'clearance_code',
'kill_house__name',
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__first_name',
'kill_house__kill_house_operator__user__last_name',
'kill_house__kill_house_operator__user__mobile',
'buyer__fullname',
'buyer__first_name',
'buyer__last_name',
'buyer__mobile',
'buyer__unit_name',
'buyer_name',
'buyer_mobile',
'province',
'city',
]
def create(self, request, *args, **kwargs):
# user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().date()
now_time = datetime.now().time()
quota = request.data['quota']
pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False)
kill_house = pos.kill_house
buyer = OutProvinceCarcassesBuyer.objects.get(key=request.data['buyer_key'])
request.data.pop('buyer_key')
product = RolesProducts.objects.get(key=request.data['product_key'])
request.data.pop('product_key')
request.data.pop('pos-id')
date = datetime.now()
# date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date()
production_date = datetime.strptime(str(request.data['production_date']), '%Y-%m-%d').date()
# date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour,
# minute=now_time.minute,
# second=now_time.second)
production_date = datetime(year=production_date.year, month=production_date.month, day=production_date.day,
hour=now_time.hour,
minute=now_time.minute,
second=now_time.second)
# request.data.pop('date')
request.data.pop('production_date')
if OperationLimitation.objects.all().first().kill_house_free_sale_limitation == True:
if now != date.date():
return Response({"result": "به علت مغایرت تاریخ امکان فروش بار وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
carcass_distribution = RestrictionCarcassDistribution.objects.filter(trash=False,
distribution_type='KillHouse',
allow=True,
out=True).first()
if carcass_distribution and datetime.now().time() > carcass_distribution.time:
return Response({"result": "لطفا در ساعات مجاز اقدام نمایید!"},
status=status.HTTP_403_FORBIDDEN)
if request.data['sale_type'] == 'free':
quota = request.data['quota']
if quota == 'governmental':
if not kill_house.free_sale_form_governmental_quota:
return Response({"result": "مجاز به فروش آزاد از انبار دولتی نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
if quota == 'governmental':
if kill_house.total_input_warehouse_governmental_weight < (
kill_house.total_selling_warehouse_governmental_weight + request.data['weight_of_carcasses']):
return Response({"result": "مجاز به فروش دولتی بیشتر از ورودی دولتی انبار نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house.total_input_warehouse_free_weight < (
kill_house.total_selling_warehouse_free_weight + request.data['weight_of_carcasses']):
return Response({"result": "مجاز به فروش آزاد بیشتر از ورودی آزاد انبار نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
if quota == 'governmental':
free_sale_type = request.data['sale_type']
if kill_house.governmental_selling_permission:
if free_sale_type == 'free':
if not kill_house.free_sale_form_governmental_quota:
if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight:
return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house.total_commitment_selling_in_province_governmental_weight > kill_house.total_selling_in_province_governmental_weight:
return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"},
status=status.HTTP_403_FORBIDDEN)
else:
return Response({"result": "مجاز به فروش دولتی نمیباشید!"}, status=status.HTTP_403_FORBIDDEN)
if kill_house.total_commitment_selling_out_province_governmental_weight > 0:
if kill_house.total_selling_out_province_governmental_weight + request.data[
'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_governmental_weight:
return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
else:
if kill_house.free_selling_permission:
if kill_house.total_commitment_selling_in_province_free_weight > kill_house.total_selling_in_province_free_weight:
return Response({"result": "ابتدا تعهد داخل استان رو تکمیل کنید!"},
status=status.HTTP_403_FORBIDDEN)
else:
return Response({"result": "مجاز به فروش آزاد نمیباشید!"}, status=status.HTTP_403_FORBIDDEN)
if kill_house.total_commitment_selling_out_province_free_weight > 0:
if kill_house.total_selling_out_province_free_weight + request.data[
'weight_of_carcasses'] > kill_house.total_commitment_selling_out_province_free_weight:
return Response({"result": "به دلیل بیشتر از وزن تعهد مجاز به فروش دولتی نمیباشید!"},
status=status.HTTP_403_FORBIDDEN)
ware_house_remain_weight = product.total_remain_weight
allocations_weight = StewardAllocation.objects.filter(trash=False, receiver_state__in=('pending', 'accepted'),
kill_house=kill_house, date__date=now).aggregate(
total=Sum('real_weight_of_carcasses'))['total'] or 0
free_sales_weight = \
KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house=kill_house,
date__date=now).aggregate(
total=Sum('real_weight_of_carcasses'))['total'] or 0
total_weight = ware_house_remain_weight + allocations_weight + free_sales_weight
free_sales_weight += request.data['weight_of_carcasses']
if KillHouseFreeSaleBarInformation.objects.filter(trash=False, clearance_code=request.data['clearance_code'],
quarantine_weight_of_carcasses__gt=0).exists():
return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"},
status=status.HTTP_403_FORBIDDEN)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_free_sale_bar_info = serializer.create(validated_data=request.data)
kill_house_free_sale_bar_info.kill_house = kill_house
if buyer is not None:
kill_house_free_sale_bar_info.buyer = buyer
kill_house_free_sale_bar_info.buyer_name = buyer.fullname
kill_house_free_sale_bar_info.buyer_mobile = buyer.mobile
kill_house_free_sale_bar_info.city = buyer.city
kill_house_free_sale_bar_info.province = buyer.province
kill_house_free_sale_bar_info.date = date
kill_house_free_sale_bar_info.production_date = production_date
kill_house_free_sale_bar_info.product = product
kill_house_free_sale_bar_info.real_number_of_carcasses = kill_house_free_sale_bar_info.number_of_carcasses
kill_house_free_sale_bar_info.real_weight_of_carcasses = kill_house_free_sale_bar_info.weight_of_carcasses
wage = 0
wage_type = WageType.objects.filter(en_name='carcasse-sell', trash=False).first()
if wage_type.status == True:
wage = wage_type.amount
kill_house_free_sale_bar_info.wage = wage
kill_house_free_sale_bar_info.total_wage_amount = wage * kill_house_free_sale_bar_info.real_weight_of_carcasses
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':
kill_house_free_sale_bar_info.union_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
kill_house_free_sale_bar_info.company_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
kill_house_free_sale_bar_info.guilds_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
kill_house_free_sale_bar_info.city_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
kill_house_free_sale_bar_info.wallet_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.wallet_share_percent = percentage_wage_type.percent
else:
kill_house_free_sale_bar_info.other_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_sale_bar_info.total_wage_amount)
kill_house_free_sale_bar_info.other_share_percent = percentage_wage_type.percent
kill_house_free_sale_bar_info.save()
allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False,
active=True).first()
if allow_register_code:
number = random.randint(10000, 99000)
kill_house_free_sale_bar_info.registration_code = number
kill_house_free_sale_bar_info.system_registration_code = True
if int(allow_register_code.time) > 0:
kill_house_free_sale_bar_info.active_expire_date_time = True
kill_house_free_sale_bar_info.expire_date_time_registration_code = datetime.now() + timedelta(
minutes=int(allow_register_code.time))
kill_house_free_sale_bar_info.save()
send_sms_for_sale_bar(kill_house_free_sale_bar_info)
get_gid_out_province(kill_house_free_sale_bar_info.id)
kill_house_free_sale_product_warehousing(product)
return Response(serializer.data, status=status.HTTP_201_CREATED)
def list(self, request, *args, **kwargs):
pos = POSMachine.objects.get(pos_id=request.GET['pos-id'], trash=False)
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
role = request.GET['role']
if date1:
date1 = datetime.strptime(str(date1), '%Y-%m-%d').date()
date2 = datetime.strptime(str(date2), '%Y-%m-%d').date()
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=pos.kill_house,
date__date__gte=date1,
date__date__lte=date2,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=pos.kill_house,
trash=False)
if 'search' in request.GET:
kill_house_free_sale_bar_info_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=kill_house_free_sale_bar_info
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_free_sale_bar_info)
kill_house_free_sale_bar_info_list = ps.filter()
kill_house_free_sale_bar_info = [] if len(
kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_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(kill_house_free_sale_bar_info)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_free_sale_bar_info, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.data['key'])
product = free_sale_bar.product
kill_house = free_sale_bar.kill_house
if KillHouseFreeSaleBarInformation.objects.filter(trash=False,
clearance_code=request.data.get('clearance_code'),
quarantine_weight_of_carcasses__gt=0).exists():
return Response({"result": "کد قرنطینه در سامانه ثبت شده است!"},
status=status.HTTP_403_FORBIDDEN)
now = datetime.now().date()
if free_sale_bar.quota == 'governmental':
if free_sale_bar.kill_house.total_input_warehouse_governmental_weight < (
(
free_sale_bar.kill_house.total_selling_warehouse_governmental_weight - free_sale_bar.weight_of_carcasses) +
request.data[
'weight_of_carcasses']):
return Response({"result": "وزن وارد شده بیشتر از باقی مانده دولتی می باشد!"},
status=status.HTTP_403_FORBIDDEN)
else:
if free_sale_bar.kill_house.total_input_warehouse_free_weight < (
(free_sale_bar.kill_house.total_selling_warehouse_free_weight - free_sale_bar.weight_of_carcasses) +
request.data[
'weight_of_carcasses']):
return Response({"result": "وزن وارد شده بیشتر از باقی مانده آزاد می باشد!"},
status=status.HTTP_403_FORBIDDEN)
allow_register_code = AllowRegisterCodeForKillHouseFreeSaleBarInformation.objects.filter(trash=False,
active=True).first()
if allow_register_code:
if 'register_code' in request.data.keys():
code = request.data['register_code']
if code != free_sale_bar.registration_code:
return Response({"result": "کد وارد شده صحیح نیست"}, status=status.HTTP_403_FORBIDDEN)
free_sale_bar.logged_registration_code = code
request.data.pop('register_code')
free_sale_bar.save()
serializer = self.serializer_class(free_sale_bar)
serializer.update(instance=free_sale_bar, validated_data=request.data)
kill_house_free_sale_product_warehousing(product)
free_sale_bar.real_number_of_carcasses = free_sale_bar.number_of_carcasses
free_sale_bar.real_weight_of_carcasses = free_sale_bar.weight_of_carcasses
free_sale_bar.total_wage_amount = free_sale_bar.wage * free_sale_bar.real_weight_of_carcasses
free_sale_bar.save()
kill_house_free_sale_product_warehousing(product)
union_percent = free_sale_bar.union_share_percent / 100 if free_sale_bar.union_share_percent > 0 else 0
company_percent = free_sale_bar.company_share_percent / 100 if free_sale_bar.company_share_percent > 0 else 0
guilds_percent = free_sale_bar.guilds_share_percent / 100 if free_sale_bar.guilds_share_percent > 0 else 0
city_share_percent = free_sale_bar.city_share_percent / 100 if free_sale_bar.city_share_percent > 0 else 0
wallet_share_percent = free_sale_bar.wallet_share_percent / 100 if free_sale_bar.wallet_share_percent > 0 else 0
other_share_percent = free_sale_bar.other_share_percent / 100 if free_sale_bar.other_share_percent > 0 else 0
free_sale_bar.union_share = int(union_percent * free_sale_bar.total_wage_amount)
free_sale_bar.company_share = int(company_percent * free_sale_bar.total_wage_amount)
free_sale_bar.guilds_share = int(guilds_percent * free_sale_bar.total_wage_amount)
free_sale_bar.city_share = int(city_share_percent * free_sale_bar.total_wage_amount)
free_sale_bar.wallet_share = int(wallet_share_percent * free_sale_bar.total_wage_amount)
free_sale_bar.other_share = int(other_share_percent * free_sale_bar.total_wage_amount)
get_gid_out_province(free_sale_bar.id)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
free_sale_bar = KillHouseFreeSaleBarInformation.objects.get(key=request.GET['key'])
product = free_sale_bar.product
free_sale_bar.trash = True
free_sale_bar.save()
kill_house_free_sale_product_warehousing(product)
return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK)
class KillHouseFreeSaleBarInformationDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeSaleBarInformation.objects.all()
serializer_class = KillHouseFreeSaleBarInformationSerializer
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFreeSaleBarInformationFilterSet
filterset_fields = [
'type_car',
'pelak',
'clearance_code',
'kill_house__name',
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__first_name',
'kill_house__kill_house_operator__user__last_name',
'kill_house__kill_house_operator__user__mobile',
'buyer__fullname',
'buyer__first_name',
'buyer__last_name',
'buyer__mobile',
'buyer__unit_name',
'buyer_name',
'buyer_mobile',
'province',
'city',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.GET['role']
kill_house_key = request.GET.get('kill_house_key')
date1 = request.GET['date1']
date2 = request.GET['date2']
if date1:
date1 = datetime.strptime(str(date1), '%Y-%m-%d').date()
date2 = datetime.strptime(str(date2), '%Y-%m-%d').date()
if role in ['ProvinceOperator', 'Commerce', 'ProvinceSupervisor''GuildRoom', 'SuperAdmin',
'ImprovingLivestock', 'AdminX', 'Supporter']:
if date1:
ware_houses = KillHouseWareHouse.objects.filter(date__date__gte=date1,
date__date__lte=date2)
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
kill_house__key=kill_house_key,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False)
else:
ware_houses = KillHouseWareHouse.objects.filter(trash=False)
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
kill_house__key=kill_house_key,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False)
kill_houses = KillHouse.objects.filter(trash=False,
pk__in=kill_house_free_sale_bar_info.values_list('kill_house',
flat=True))
buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct())
elif role in ['CityJahad', 'CityPoultry', 'CityOperator']:
if date1:
ware_houses = KillHouseWareHouse.objects.filter(kill_house__system_address__city=user.city,
date__date__gte=date1,
date__date__lte=date2)
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
date__date__gte=date1,
date__date__lte=date2,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
kill_house__key=kill_house_key,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
date__date__gte=date1,
date__date__lte=date2,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False)
else:
ware_houses = KillHouseWareHouse.objects.filter(kill_house__system_address__city=user.city, trash=False)
if kill_house_key and kill_house_key != 'all':
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
kill_house__key=kill_house_key,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__system_address__city=user.city,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False)
kill_houses = KillHouse.objects.filter(trash=False,
pk__in=kill_house_free_sale_bar_info.values_list('kill_house',
flat=True))
buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct())
else:
kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
if date1:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=kill_houses,
date__date__gte=date1,
date__date__lte=date2,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False)
else:
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=kill_houses,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False)
buyers = len(kill_house_free_sale_bar_info.values_list('buyer', flat=True).distinct())
if 'search' in request.GET:
kill_house_free_sale_bar_info_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=kill_house_free_sale_bar_info
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_free_sale_bar_info)
kill_house_free_sale_bar_info_list = ps.filter()
kill_house_free_sale_bar_info = [] if len(
kill_house_free_sale_bar_info_list) == 0 else kill_house_free_sale_bar_info_list
if role == 'KillHouse':
result = {
"number_of_allocations": len(kill_house_free_sale_bar_info),
"number_of_buyers": buyers,
"total_number_of_allocation_carcasses":
kill_house_free_sale_bar_info.aggregate(total=Sum('number_of_carcasses'))['total'] or 0,
"total_weight_of_allocation_carcasses":
kill_house_free_sale_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0,
}
else:
result = {
"number_of_kill_houses": len(kill_houses),
"number_of_allocations": len(kill_house_free_sale_bar_info),
"number_of_buyers": buyers,
"total_number_of_allocation_carcasses":
kill_house_free_sale_bar_info.aggregate(total=Sum('number_of_carcasses'))['total'] or 0,
"total_weight_of_allocation_carcasses": int(
kill_house_free_sale_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0),
"remain_total_number_of_carcasses":
ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[
'total'] or 0,
"remain_total_weight_of_carcasses":
ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[
'total'] or 0,
}
return Response(result, status=status.HTTP_200_OK)
class KillHousebuyersDashboarForFreeSaleBarInformationdViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForKillHouseVetKillHouseSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
role = request.GET['role']
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
else:
kill_house = KillHouse.objects.filter(key=request.GET['kill_house_key'], kill_house_operator__user=user,
trash=False).first()
buyers = OutProvinceCarcassesBuyer.objects.filter(Kill_house=kill_house, trash=False)
free_sales = KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house=kill_house)
total_quantity = free_sales.aggregate(total=Sum('number_of_carcasses'))[
'total'] or 0
total_weight = free_sales.aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
result = {
"buyers": len(buyers),
"number_of_requests": len(free_sales),
"total_quantity": total_quantity,
"total_weight": total_weight,
}
return Response({"result": result}, status=status.HTTP_200_OK)
class KillHouseFreeBarInformationforWageTotalViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeBarInformation.objects.all()
serializer_class = KillHouseFreeBarInformationForWageTotalSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFreeBarInformationFilterSet
filterset_fields = [
'kill_house__name',
'kill_house__kill_house_operator__user__mobile',
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__mobile',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
type = request.GET['type']
if request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
else:
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'])
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] == 'ProvinceOperator':
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
date__date__gte=date1,
date__date__lte=date2,
union_share__gt=0,
archive_wage=False,
trash=False).order_by('id')
elif request.GET['role'] == 'Company':
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
date__date__gte=date1,
date__date__lte=date2,
company_share__gt=0,
archive_wage=False,
trash=False).order_by('id')
elif request.GET['role'] == 'Guilds':
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
date__date__gte=date1,
date__date__lte=date2,
guilds_share__gt=0,
archive_wage=False,
trash=False).order_by('id')
else:
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
date__date__gte=date1,
date__date__lte=date2,
archive_wage=False,
trash=False).order_by('id')
else:
if request.GET['role'] == 'ProvinceOperator':
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
union_share__gt=0,
trash=False).order_by('id')
elif request.GET['role'] == 'Company':
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
company_share__gt=0,
archive_wage=False,
trash=False).order_by('id')
elif request.GET['role'] == 'Guilds':
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
guilds_share__gt=0,
archive_wage=False,
trash=False).order_by('id')
else:
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
buy_type=type,
archive_wage=False,
trash=False).order_by('id')
if 'search' in request.GET:
kill_house_free_bar_info_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=kill_house_free_bar_info
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_free_bar_info)
kill_house_free_bar_info_list = ps.filter()
kill_house_free_bar_info = [] if len(
kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_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(kill_house_free_bar_info)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(kill_house_free_bar_info, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseFreeBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeBarInformation.objects.all()
serializer_class = KillHouseFreeBarInformationSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFreeBarInformationFilterSet
filterset_fields = [
'kill_house__name',
'poultry_name',
'poultry_mobile',
'province',
'bar_code',
'city',
'driver_name',
'driver_mobile',
'bar_clearance_code',
'kill_house__kill_house_operator__user__mobile',
'kill_house__kill_house_operator__user__fullname',
]
def create(self, request, *args, **kwargs):
killer = None
now_time = datetime.now().time()
dispenser = request.data.pop('dispenser',None)
representative = request.data.pop('representative',None)
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
free_commitment_percent = kill_house.out_province_free_buying_commitment_percent
if 'bar_clearance_code' in request.data.keys():
if KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=request.data[
'bar_clearance_code']).exists():
return Response({'result': 'کد قرنطینه قبلا در سامانه ثبت شده است!'}, status=status.HTTP_403_FORBIDDEN)
if 'product_key' not in request.data.keys():
return Response({'result': 'لطفا محصول را انتخاب کنید!'}, status=status.HTTP_403_FORBIDDEN)
product = RolesProducts.objects.get(key=request.data['product_key'])
request.data.pop('product_key')
if 'killer_key' in request.data.keys() and request.data['killer_key'] != None:
killer = KillHouse.objects.get(key=request.data['killer_key'])
request.data.pop('killer_key')
try:
image = request.data['bar_image']
request.data.pop('bar_image')
except:
image = None
date = datetime.strptime(str(request.data['date']), '%Y-%m-%d').date()
date = datetime(year=date.year, month=date.month, day=date.day, hour=now_time.hour,
minute=now_time.minute,
second=now_time.second)
request.data.pop('date')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
kill_house_free_bar_info = serializer.create(validated_data=request.data)
if image != None:
kill_house_free_bar_info.bar_image = send_image_to_server(image)
kill_house_free_bar_info.kill_house = kill_house
kill_house_free_bar_info.date = date
if kill_house_free_bar_info.buy_type == 'carcass':
kill_house_free_bar_info.warehouse_commitment_weight = int(
(free_commitment_percent / 100) * int(kill_house_free_bar_info.weight_of_carcasses))
kill_house_free_bar_info.ware_house = True
if killer:
if killer.killer and killer.type == 'public':
kill_house_free_bar_info.kill_house = killer
kill_house_free_bar_info.public_killer = kill_house
kill_house_free_bar_info.input_warehouse = killer
product = RolesProducts.objects.get(kill_house=killer, trash=False)
else:
kill_house_free_bar_info.exclusive_killer = killer
kill_house_free_bar_info.input_warehouse = killer
product = RolesProducts.objects.get(kill_house=killer, trash=False)
else:
kill_house_free_bar_info.input_warehouse = kill_house
kill_house_free_bar_info.product = product
kill_house_free_bar_info.dispenser = dispenser if dispenser else None
kill_house_free_bar_info.representative = representative if representative else None
kill_house_free_bar_info.bar_code = generate_unique_bar_code()
kill_house_free_bar_info.save()
wage = 0
type = 'live-buy' if kill_house_free_bar_info.buy_type == 'live' else 'carcasse-buy'
wage_type = WageType.objects.filter(en_name=type, trash=False).first()
if wage_type.status == True:
wage = wage_type.amount
kill_house_free_bar_info.wage = wage
kill_house_free_bar_info.total_wage_amount = wage * int(
kill_house_free_bar_info.live_weight) if kill_house_free_bar_info.buy_type == 'live' else wage * int(
kill_house_free_bar_info.weight_of_carcasses)
kill_house_free_bar_info.register_date = datetime.now()
kill_house_free_bar_info.save()
kill_house_free_buying_product_warehousing(product)
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':
kill_house_free_bar_info.union_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
kill_house_free_bar_info.union_share_percent = percentage_wage_type.percent
kill_house_free_bar_info.save()
elif percentage_wage_type.share_type.en_name == 'company':
kill_house_free_bar_info.company_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
kill_house_free_bar_info.company_share_percent = percentage_wage_type.percent
kill_house_free_bar_info.save()
elif percentage_wage_type.share_type.en_name == 'guilds':
kill_house_free_bar_info.guilds_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
kill_house_free_bar_info.guilds_share_percent = percentage_wage_type.percent
kill_house_free_bar_info.save()
elif percentage_wage_type.share_type.en_name == 'city':
kill_house_free_bar_info.city_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
kill_house_free_bar_info.city_share_percent = percentage_wage_type.percent
kill_house_free_bar_info.save()
elif percentage_wage_type.share_type.en_name == 'wallet':
kill_house_free_bar_info.wallet_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
kill_house_free_bar_info.wallet_share_percent = percentage_wage_type.percent
kill_house_free_bar_info.save()
else:
kill_house_free_bar_info.other_share = int(
(percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
kill_house_free_bar_info.other_share_percent = percentage_wage_type.percent
kill_house_free_bar_info.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
type = request.GET.get('type')
date_type = request.GET.get('date_type')
bar_state = request.GET.get('bar_state')
kill_house_free_bar_info_list = []
role = request.GET.get('role')
kill_houses = None
order_by_type = '-date'
if role in ['KillHouse', 'KillHouseVet']:
if role == 'KillHouse':
kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
else:
kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house',
flat=True)
kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False)
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if date_type:
if date_type == 'buy':
filters = {
'register_date__date__gte': date1,
'register_date__date__lte': date2,
'trash': False,
'temporary_trash': False,
'temporary_deleted': False,
'calculate_status': True
}
else:
order_by_type = '-date'
filters = {
'date__date__gte': date1,
'date__date__lte': date2,
'trash': False,
'temporary_trash': False,
'temporary_deleted': False,
'calculate_status': True
}
else:
filters = {
'register_date__date__gte': date1,
'register_date__date__lte': date2,
'trash': False,
'temporary_trash': False,
'temporary_deleted': False,
'calculate_status': True
}
else:
filters = {
'trash': False,
'temporary_trash': False,
'temporary_deleted': False,
'calculate_status': True
}
if type:
filters['buy_type'] = type
if type == 'live':
if bar_state:
if bar_state == 'entered':
filters['weight_of_carcasses__gt'] = 0
else:
filters['weight_of_carcasses'] = 0
if kill_houses is not None:
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
Q(kill_house__in=kill_houses) | Q(exclusive_killer__in=kill_houses) | Q(public_killer__in=kill_houses),
**filters).order_by(order_by_type)
else:
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type)
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=kill_house_free_bar_info
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_free_bar_info)
kill_house_free_bar_info_list = ps.filter()
kill_house_free_bar_info = [] if len(
kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_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(kill_house_free_bar_info)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_free_bar_info, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
free_bar = KillHouseFreeBarInformation.objects.get(key=request.data['key'])
# product = free_bar.product
if 'live_weight' in request.data.keys():
if int(request.data['live_weight']) < free_bar.weight_of_carcasses:
return Response(
{"result": "مقدار وارد شده کمتر از وزن لاشه است! "},
status=status.HTTP_403_FORBIDDEN)
if 'bar_clearance_code' in request.data.keys():
existing_bar = KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=request.data[
'bar_clearance_code']).exclude(id=free_bar.id).first()
if existing_bar:
if existing_bar.register_type == 'automatic':
existing_bar.trash = True
existing_bar.save()
else:
return Response({'result': 'کد قرنطینه قبلا در سامانه ثبت شده است!'},
status=status.HTTP_403_FORBIDDEN)
if 'number_of_carcasses' in request.data.keys():
now = datetime.now().date()
if OperationLimitation.objects.all().first().kill_house_input_bar_limitation == True and \
free_bar.register_type != 'automatic':
if now != free_bar.date.date():
return Response({"result": "به علت وجود مفایرت در تاریخ ثبت امکان ویرایش وجود ندارد! "},
status=status.HTTP_403_FORBIDDEN)
# ware_house = KillHouseWareHouse.objects.filter(kill_house=free_bar.kill_house,
# date__date=free_bar.date.date(), trash=False).first()
# allocation = StewardAllocation.objects.filter(ware_house=ware_house, trash=False)
#
# if len(allocation) > 0:
# if OperationLimitation.objects.all().first().kill_house_input_bar_limitation == True:
# return Response(
# {"result": "به علت وجود تخصیص به مباشر یا صنف برای امروز امکان ویرایش وجود ندارد! "},
# status=status.HTTP_403_FORBIDDEN)
if 'return_entered_bar' in request.data.keys():
free_bar.weight_of_carcasses = 0
free_bar.number_of_carcasses = 0
free_bar.entered_message = None
free_bar.ware_house = False
if 'bar_image' in request.data.keys():
if request.data['bar_image'] != " ":
free_bar.bar_image = send_image_to_server(request.data['bar_image'])
free_bar.save()
request.data.pop('bar_image')
if 'kill_house_vet_state' in request.data.keys():
free_bar.date_of_accept_reject = datetime.now()
free_bar.acceptor_rejector = user.fullname
if 'killer_key' in request.data.keys() and request.data['killer_key'] != None and request.data[
'killer_key'] != '':
exclusive_killer = KillHouse.objects.filter(trash=False, key=request.data['killer_key']).first()
if exclusive_killer.killer and exclusive_killer.type == 'public':
if not free_bar.public_killer:
free_bar.public_killer = free_bar.kill_house
free_bar.kill_house = exclusive_killer
free_bar.input_warehouse = exclusive_killer
product = RolesProducts.objects.filter(kill_house=exclusive_killer, trash=False, name='مرغ گرم').first()
free_bar.product = product
if free_bar.exclusive_killer:
free_bar.exclusive_killer = None
else:
free_bar.exclusive_killer = exclusive_killer
free_bar.input_warehouse = exclusive_killer
product = RolesProducts.objects.filter(kill_house=exclusive_killer, trash=False, name='مرغ گرم').first()
free_bar.product = product
if free_bar.public_killer:
free_bar.kill_house = free_bar.public_killer
free_bar.public_killer = None
request.data.pop('killer_key')
serializer = self.serializer_class(free_bar)
serializer.update(instance=free_bar, validated_data=request.data)
free_commitment_percent = free_bar.kill_house.out_province_free_buying_commitment_percent
free_bar.total_wage_amount = free_bar.wage * int(
free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(free_bar.weight_of_carcasses)
free_bar.warehouse_commitment_weight = int((free_commitment_percent / 100) * int(free_bar.weight_of_carcasses))
if free_bar.exclusive_killer:
product = RolesProducts.objects.get(kill_house=free_bar.exclusive_killer, trash=False)
free_bar.product = product
free_bar.save()
union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0
company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0
guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0
city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0
wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0
other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0
free_bar.union_share = int(union_percent * free_bar.total_wage_amount)
free_bar.company_share = int(company_percent * free_bar.total_wage_amount)
free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount)
free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount)
free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount)
free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount)
free_bar.save()
kill_house_free_buying_product_warehousing(free_bar.product)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
free_bar = KillHouseFreeBarInformation.objects.get(trash=False, key=request.GET['key'])
free_bar.trash = True
free_bar.save()
product = free_bar.product
kill_house_free_buying_product_warehousing(product)
return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK)
class ParentCompanyKillHouseFreeBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeBarInformation.objects.all()
serializer_class = KillHouseFreeBarInformationSerializer
permission_classes = [AllowAny]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFreeBarInformationFilterSet
filterset_fields = [
'kill_house__name',
'poultry_name',
'poultry_mobile',
'province',
'city',
'driver_name',
'driver_mobile',
'bar_clearance_code',
'kill_house__kill_house_operator__user__mobile',
'kill_house__kill_house_operator__user__fullname',
]
def list(self, request, *args, **kwargs):
type = request.GET.get('type')
date_type = request.GET.get('date_type')
bar_state = request.GET.get('bar_state')
kill_house_free_bar_info_list = []
role = request.GET.get('role')
kill_houses = None
order_by_type = '-create_date'
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if date_type:
if date_type == 'buy':
filters = {
'create_date__date__gte': date1,
'create_date__date__lte': date2,
'trash': False,
}
else:
order_by_type = '-date'
filters = {
'date__date__gte': date1,
'date__date__lte': date2,
'trash': False,
}
else:
filters = {
'create_date__date__gte': date1,
'create_date__date__lte': date2,
'trash': False,
}
else:
filters = {
'trash': False
}
if kill_houses is not None:
filters['kill_house__in'] = kill_houses
if type:
filters['buy_type'] = type
if type == 'live':
if bar_state:
if bar_state == 'entered':
filters['weight_of_carcasses__gt'] = 0
else:
filters['weight_of_carcasses'] = 0
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(**filters).order_by(order_by_type)
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=kill_house_free_bar_info
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_free_bar_info)
kill_house_free_bar_info_list = ps.filter()
kill_house_free_bar_info = [] if len(
kill_house_free_bar_info_list) == 0 else kill_house_free_bar_info_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(kill_house_free_bar_info)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_free_bar_info, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseRequestForBarManagementViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForBarManagementSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'bar_code',
'traffic_code',
'clearance_code'
]
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.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = 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.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
kill_house_requests_list = 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, temporary_trash=False, temporary_deleted=False,
message__isnull=False
).select_related('kill_request')
else:
kill_house_requests_list = 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,
non_receipt=False,
trash=False
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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')
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,
non_receipt=False,
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:
kill_house_requests = []
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
aggregate_permission = VetFarmAggregatePermission.objects.filter(
trash=False).first()
if aggregate_permission and aggregate_permission.allow == True:
kill_house_requests_list = 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')
else:
kill_house_requests_list = 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')
else:
aggregate_permission = VetFarmAggregatePermission.objects.filter(
trash=False).first()
if aggregate_permission and aggregate_permission.allow == True:
kill_house_requests_list = KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_request__poultry_request__poultry__in=poultries,
non_receipt=False,
trash=False
).select_related('kill_request').order_by(
'province_request__poultry_request__poultry', 'killhouse_user')
else:
kill_house_requests_list = KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_request__poultry_request__poultry__in=poultries,
non_receipt=False,
trash=False
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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')
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,
non_receipt=False,
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.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = 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:
kill_house_requests = []
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
kill_house_requests_list = 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')
else:
kill_house_requests_list = 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,
non_receipt=False,
trash=False
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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')
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,
non_receipt=False,
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.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
queryset_list = PoultryRequest.objects.filter(poultry__city_operator=city_operator.unit_name,
trash=False, out=False, final_state='pending',
).order_by('send_date')
queryset = [
poultry_req for poultry_req in queryset_list
if date1 <= poultry_req.send_date.date() <= date2
]
elif request.GET['role'] in ['CityCommerce', 'CityVet', 'CityJahad', 'CityPoultry']:
if 'check' in request.GET:
kill_house_requests = []
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
kill_house_requests_list = 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')
else:
kill_house_requests_list = 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,
non_receipt=False,
trash=False
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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')
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,
non_receipt=False,
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'] == 'LiveStockSupport':
if 'check' in request.GET:
kill_house_requests = []
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
kill_house_requests_list = KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_request__poultry_request__freezing=True,
trash=True,
message__isnull=False, temporary_trash=False, temporary_deleted=False
).select_related('kill_request')
else:
kill_house_requests_list = KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_request__poultry_request__freezing=True,
non_receipt=False,
trash=False
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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__freezing=True,
trash=True,
message__isnull=False, temporary_trash=False, temporary_deleted=False
).select_related('kill_request')
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__freezing=True,
non_receipt=False,
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'] == '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.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = 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', 'ProvinceSupervisor', 'SuperAdmin', 'AdminX',
'ImprovingLivestock', '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.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = datetime.now()
queryset = PoultryRequest.objects.filter(poultry__address__province=user.province,
send_date__year=date.year, send_date__month=date.month,
send_date__day=date.day,
trash=False, out=True).order_by('-send_date')
elif 'check' in request.GET:
kill_house_requests = []
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
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, temporary_trash=False, temporary_deleted=False
# message__isnull=False
).select_related('kill_request')
else:
if 'without_quarantine_code_state' in request.GET and request.GET[
'without_quarantine_code_state'] == 'true':
kill_house_requests = KillHouseRequest.objects.filter(
clearance_code__isnull=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
quarantine_quantity__isnull=True,
quarantine_code_state__isnull=True,
non_receipt=False,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).select_related('kill_request')
else:
kill_house_requests = KillHouseRequest.objects.filter(
# (Q(trash=False) | Q(trash=True, clearance_code__isnull=False,
# temporary_trash=False, temporary_deleted=False)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
non_receipt=False,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).select_related('kill_request')
value = request.GET.get('value')
search = request.GET.get('search')
if value and search == 'filter':
if value != 'undefined' and value.strip():
kill_house_requests = kill_house_requests.filter(
build_query(DashboardEnterLoadInformationFilterSet, value)
)
else:
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
).select_related('kill_request')
else:
if 'without_quarantine_code_state' in request.GET and request.GET[
'without_quarantine_code_state'] == 'true':
kill_house_requests = KillHouseRequest.objects.filter(
clearance_code__isnull=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
quarantine_quantity__isnull=True,
quarantine_code_state__isnull=True,
non_receipt=False,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).select_related('kill_request')
else:
kill_house_requests = KillHouseRequest.objects.filter(
# (Q(trash=False) | Q(trash=True, clearance_code__isnull=False)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
non_receipt=False,
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.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
queryset_lists = PoultryRequest.objects.filter(poultry__address__province=user.province,
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
]
# 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.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = 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:
kill_house_requests = []
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
kill_house_requests_list = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house) | Q(killer__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, temporary_trash=False, temporary_deleted=False
# message__isnull=False
).select_related('kill_request')
else:
kill_house_requests_list = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)),
# (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False,
# temporary_deleted=False)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
non_receipt=False,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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) | Q(killer__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, temporary_trash=False, temporary_deleted=False
# message__isnull=False
).select_related('kill_request')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)),
# (Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False,
# temporary_deleted=False)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
non_receipt=False,
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)
else:
if 'date' in request.GET:
date = datetime.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = 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)
class ParentCompanyKillHouseRequestForBarManagementViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForBarManagementSerializer
pagination_class = CustomPagination
permission_classes = [AllowAny]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'bar_code',
'traffic_code',
'clearance_code'
]
def list(self, request, *args, **kwargs):
kill_house_requests = []
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'search' in request.GET:
if 'deleted_requests' in request.GET:
kill_house_requests_list = KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
trash=True, temporary_trash=False, temporary_deleted=False
).select_related('kill_request')
else:
if 'without_quarantine_code_state' in request.GET and request.GET[
'without_quarantine_code_state'] == 'true':
kill_house_requests_list = KillHouseRequest.objects.filter(
clearance_code__isnull=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
quarantine_quantity__isnull=True,
quarantine_code_state__isnull=True,
).select_related('kill_request')
else:
kill_house_requests_list = KillHouseRequest.objects.filter(
(Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False,
temporary_deleted=False)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
).select_related('kill_request')
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 (self.filterset_class(
data=query,
queryset=kill_house_requests_list
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests_list)
kill_house_requests = ps.filter()
else:
kill_house_requests = kill_house_requests_list
else:
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,
trash=True,
).select_related('kill_request')
else:
if 'without_quarantine_code_state' in request.GET and request.GET[
'without_quarantine_code_state'] == 'true':
kill_house_requests = KillHouseRequest.objects.filter(
clearance_code__isnull=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
quarantine_quantity__isnull=True,
quarantine_code_state__isnull=True,
).select_related('kill_request')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(trash=False) | Q(trash=True, clearance_code__isnull=False)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
).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)
class KillHouseRequestForBarManagementWageViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForBarManagementSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'province_request__poultry_request__order_code',
'bar_code',
]
def list(self, request, *args, **kwargs):
if request.GET['role'] == 'KillHouse':
user = SystemUserProfile.objects.get(user=request.user)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
trash=False)
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
trash=False)
else:
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'], trash=False)
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['role'] == 'ProvinceOperator':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_kill_request__union_share__gt=0,
trash=False)
elif request.GET['role'] == 'Company':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_kill_request__company_share__gt=0,
trash=False)
elif request.GET['role'] == 'Guilds':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_kill_request__guilds_share__gt=0,
trash=False)
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
trash=False)
else:
if request.GET['role'] == 'ProvinceOperator':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
province_kill_request__union_share__gt=0,
trash=False)
elif request.GET['role'] == 'Company':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
province_kill_request__company_share__gt=0,
trash=False)
elif request.GET['role'] == 'Guilds':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
province_kill_request__guilds_share__gt=0,
trash=False)
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
trash=False)
if 'search' in request.GET:
kill_house_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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_request_list = ps.filter()
kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_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(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)
class KillHouseRequestForAggregateLoadsViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForBarManagementSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'province_request__poultry_request__order_code',
'bar_code',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
# user = SystemUserProfile.objects.get(user=request.user)
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house = []
kill_house_requests_list = []
if request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
elif request.GET['role'] == 'KillHouseVet':
kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house')
for kill_house_vet in kill_house_vets:
kill_house.append(kill_house_vet.kill_house)
else:
kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False)
if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user, trash=False)
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,
assignment_state_archive='pending',
non_receipt=False,
trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
).order_by('-kill_request__recive_date')
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,
assignment_state_archive='pending',
non_receipt=False,
trash=False, province_request__poultry_request__poultry__address__city=user.city
).order_by('-kill_request__recive_date')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive='pending',
non_receipt=False,
trash=False,
).order_by('-kill_request__recive_date')
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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_requests_list = ps.filter()
kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_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(kill_house_requests)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillingInformationDiscrepancyReportViewSet(viewsets.ModelViewSet):
queryset = PoultryRequest.objects.all()
serializer_class = PoultryRequestLetterForProvinceVetSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
province_operator = ProvinceOperator.objects.filter(
user=SystemUserProfile.objects.get(role__name='ProvinceOperator', province=user.province),
trash=False).select_related(
'user').first()
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user, trash=False)
poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province,
poultry__city_operator=city_operator.unit_name,
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').annotate(
total_quantity=Sum('quantity'),
total_weight=Sum(F('quantity') * F('Index_weight')),
total_remain_quantity=Sum('remain_quantity'),
total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')),
)
elif request.GET['role'] in ['CityJahad', 'CityPoultry']:
poultry_requests = PoultryRequest.objects.filter(poultry__address__province=user.province,
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').annotate(
total_quantity=Sum('quantity'),
total_weight=Sum(F('quantity') * F('Index_weight')),
total_remain_quantity=Sum('remain_quantity'),
total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')),
)
else:
poultry_requests = 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').annotate(
total_quantity=Sum('quantity'),
total_weight=Sum(F('quantity') * F('Index_weight')),
total_remain_quantity=Sum('remain_quantity'),
total_remain_weight=Sum(F('remain_quantity') * F('Index_weight')),
)
poultry_request_total_quantity = poultry_requests.aggregate(total=Sum('total_quantity'))['total']
poultry_request_total_weight = poultry_requests.aggregate(total=Sum('total_weight'))['total']
poultry_request_total_remain_quantity = poultry_requests.aggregate(total=Sum('total_remain_quantity'))['total']
poultry_request_remain_weight = poultry_requests.aggregate(total=Sum('total_remain_weight'))['total']
province_kill_requests = ProvinceKillRequest.objects.filter(
province_request__poultry_request__in=poultry_requests, trash=False,
state__in=('pending', 'accepted')).annotate(
total_quantity=Sum('main_quantity'),
total_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight')),
)
province_kill_requests_total_quantity = province_kill_requests.aggregate(total=Sum('total_quantity'))['total']
province_kill_requests_total_weight = province_kill_requests.aggregate(total=Sum('total_weight'))['total']
province_kill_requests_with_left_over = ProvinceKillRequest.objects.filter(
province_request__poultry_request__in=poultry_requests, trash=False,
state__in=('pending', 'accepted'), quantity__gt=0)
province_kill_requests_serializer = ProvinceKillRequestForKillingInformationDiscrepancyReportSerializer(
province_kill_requests_with_left_over, many=True)
# if 'role' in request.GET:
# if request.GET['role'] == 'ProvinceSupervisor':
# last_date = datetime(2024, 4, 14, 7, 33).date()
# if date2 > last_date and date1 <= last_date:
# kill_house_request_without_clearance_code = KillHouseRequest.objects.filter(
# province_kill_request__in=province_kill_requests, kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=last_date, clearance_code__isnull=True, trash=False)
#
# kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')),
# province_kill_request__in=province_kill_requests, clearance_code__isnull=False,
# quarantine_quantity__isnull=False, trash=False)
# kill_house_request_without_vet_check = KillHouseRequest.objects.filter(
# province_kill_request__in=province_kill_requests, kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=last_date, vet_state='pending', trash=False)
# kill_house_request_without_bar_info = KillHouseRequest.objects.filter(
# province_kill_request__in=province_kill_requests, kill_request__recive_date__date__gte=date1,
# kill_request__recive_date__date__lte=last_date, vet_state='accepted',
# assignment_state_archive='pending',
# trash=False)
# kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(
# quantity__lt=F('vet_accepted_real_quantity')) | Q(
# quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__lt=F('accepted_real_quantity')),
# # kill_request__recive_date__date__gte=date1,
# # kill_request__recive_date__date__lte=last_date,
# province_kill_request__in=province_kill_requests, vet_state='accepted',
# assignment_state_archive='True',
# trash=False)
# elif date2 > last_date and date1 > last_date:
# kill_house_request_without_clearance_code = []
# kill_house_request_without_vet_check = []
# kill_house_request_without_bar_info = []
# kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')),
# province_kill_request__in=province_kill_requests, clearance_code__isnull=False,
# quarantine_quantity__isnull=False, trash=False)
# kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(
# quantity__lt=F('vet_accepted_real_quantity')) | Q(
# quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__lt=F('accepted_real_quantity')),
# province_kill_request__in=province_kill_requests, vet_state='accepted',
# assignment_state_archive='True',
# trash=False)
# else:
#
# kill_house_request_without_clearance_code = KillHouseRequest.objects.filter(
# province_kill_request__in=province_kill_requests, clearance_code__isnull=True, trash=False)
#
# kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')),
# province_kill_request__in=province_kill_requests, clearance_code__isnull=False,
# quarantine_quantity__isnull=False, trash=False)
# kill_house_request_without_vet_check = KillHouseRequest.objects.filter(
# province_kill_request__in=province_kill_requests, vet_state='pending', trash=False)
# kill_house_request_without_bar_info = KillHouseRequest.objects.filter(
# province_kill_request__in=province_kill_requests, vet_state='accepted',
# assignment_state_archive='pending',
# trash=False)
# kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(
# quantity__lt=F('vet_accepted_real_quantity')) | Q(
# quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__lt=F('accepted_real_quantity')),
# province_kill_request__in=province_kill_requests, vet_state='accepted',
# assignment_state_archive='True',
# trash=False)
# else:
kill_house_request_without_clearance_code = KillHouseRequest.objects.filter(
province_kill_request__in=province_kill_requests, clearance_code__isnull=True, trash=False)
kill_house_request_diffrent_quarantine_quantity = KillHouseRequest.objects.filter(
Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')),
province_kill_request__in=province_kill_requests, clearance_code__isnull=False,
quarantine_quantity__isnull=False, trash=False)
kill_house_request_without_vet_check = KillHouseRequest.objects.filter(
province_kill_request__in=province_kill_requests, vet_state='pending', trash=False)
kill_house_request_without_bar_info = KillHouseRequest.objects.filter(
province_kill_request__in=province_kill_requests,
assignment_state_archive='pending',
trash=False)
kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter(
Q(quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')),
province_kill_request__in=province_kill_requests,
assignment_state_archive='True',
trash=False)
# kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(quantity__lt=F('vet_accepted_real_quantity')) | Q(
# quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__gt=F('accepted_real_quantity') | Q(vet_accepted_real_quantity__lt=F('accepted_real_quantity'))),
# province_kill_request__in=province_kill_requests, vet_state='accepted', assignment_state_archive='True',
# trash=False)
# kill_house_request_diffrent_bar_info = KillHouseRequest.objects.filter(
# Q(quantity__gt=F('vet_accepted_real_quantity')) | Q(quantity__lt=F('vet_accepted_real_quantity')) | Q(
# quantity__gt=F('accepted_real_quantity')) | Q(quantity__lt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__gt=F('accepted_real_quantity')) | Q(
# vet_accepted_real_quantity__lt=F('accepted_real_quantity')),
# province_kill_request__in=province_kill_requests, vet_state='accepted', assignment_state_archive='True',
# trash=False)
kill_house_request_without_clearance_code_serializer = KillHouseRequestForBarManagementSerializer(
kill_house_request_without_clearance_code, many=True)
kill_house_request_diffrent_quarantine_quantitye_serializer = KillHouseRequestForBarManagementSerializer(
kill_house_request_diffrent_quarantine_quantity, many=True)
kill_house_request_without_vet_check_serializer = KillHouseRequestForBarManagementSerializer(
kill_house_request_without_vet_check, many=True)
kill_house_request_without_bar_info_serializer = KillHouseRequestForBarManagementSerializer(
kill_house_request_without_bar_info, many=True)
kill_house_request_diffrent_bar_info_serializer = KillHouseRequestForDiffrentBarInfoSerializer(
kill_house_request_diffrent_bar_info, many=True)
return Response({
"part_one": {
"total_requests": poultry_requests.count(),
"poultry_request_total_quantity": poultry_request_total_quantity if poultry_request_total_quantity != None else 0,
"poultry_request_total_weight": poultry_request_total_weight if poultry_request_total_weight != None else 0,
"province_kill_requests_total_quantity": province_kill_requests_total_quantity if province_kill_requests_total_quantity != None else 0,
"province_kill_requests_total_weight": province_kill_requests_total_weight if province_kill_requests_total_weight != None else 0,
"poultry_request_total_remain_quantity": poultry_request_total_remain_quantity if poultry_request_total_remain_quantity != None else 0,
"poultry_request_remain_weight": poultry_request_remain_weight if poultry_request_remain_weight != None else 0,
"operator_fullname": province_operator.user.fullname,
"operator_mobile": province_operator.user.mobile,
"role": "ProvinceOperator",
},
"part_two": province_kill_requests_serializer.data,
"part_three": kill_house_request_without_clearance_code_serializer.data,
"part_seven": kill_house_request_diffrent_quarantine_quantitye_serializer.data,
"part_four": kill_house_request_without_vet_check_serializer.data,
"part_five": kill_house_request_without_bar_info_serializer.data,
"part_six": kill_house_request_diffrent_bar_info_serializer.data,
})
class PoultryRequestForTotalInformationInTableViewSet(viewsets.ModelViewSet):
queryset = PoultryRequest.objects.all()
kill_house_requests_queryset = KillHouseRequest.objects.all()
serializer_class = PoultryRequestForTotalInformationInTableSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = PoultryRequestFilterSet
filterset_fields = poultry_request_new_fields
kill_house_requests_filter_class = KillHouseRequestFilterSet
kill_house_requests_filterset_fields = kill_house_request_filterset_fields
def list(self, request, *args, **kwargs):
poultry_requests_for_search = []
kill_house_request_for_search = []
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'clearance_code' in request.GET:
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
clearance_code__isnull=request.GET[
'clearance_code']).select_related(
'province_request__poultry_request')
poultry_requests = PoultryRequest.objects.filter(
pk__in=kill_house_requests.values('province_request__poultry_request'),
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')
elif 'assignment' in request.GET:
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive=request.GET[
'assignment']).select_related(
'province_request__poultry_request')
poultry_requests = PoultryRequest.objects.filter(
pk__in=kill_house_requests.values('province_request__poultry_request'),
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')
elif 'discharge' in request.GET:
if request.GET['discharge'] == 'pending':
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
vet_state='pending',
assignment_state_archive='pending').select_related(
'province_request__poultry_request')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(vet_state='pending') | Q(vet_state='pending', assignment_state_archive='True')),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, ).select_related(
'province_request__poultry_request')
poultry_requests = PoultryRequest.objects.filter(
pk__in=kill_house_requests.values('province_request__poultry_request'),
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')
else:
poultry_requests = 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')
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_request__poultry_request__in=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 (self.filterset_class(
data=query,
queryset=poultry_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=poultry_requests)
poultry_requests_for_search = ps.filter()
poultry_requests = [] if len(poultry_requests_for_search) == 0 else poultry_requests_for_search
for item in self.kill_house_requests_filterset_fields:
kill_house_request_query = QueryDict('{0}={1}'.format(item, request.GET['value']))
if (self.kill_house_requests_filter_class(
data=kill_house_request_query,
queryset=kill_house_requests
)
).filter():
ks = self.kill_house_requests_filter_class(data=kill_house_request_query,
queryset=kill_house_requests)
kill_house_request_for_search = ks.filter()
kill_house_requests = [] if len(kill_house_request_for_search) == 0 else kill_house_request_for_search
if len(kill_house_requests) > 0:
for kill_house_request in kill_house_requests:
if kill_house_request.province_request.poultry_request not in poultry_requests:
poultry_requests.append(kill_house_request.province_request.poultry_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(poultry_requests)
if page is not None:
serializer = PoultryRequestForTotalInformationInTableSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = PoultryRequestForTotalInformationInTableSerializer(poultry_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class PoultryRequestForTotalInformationViewSet(viewsets.ModelViewSet):
queryset = PoultryRequest.objects.all()
kill_house_requests_queryset = KillHouseRequest.objects.all()
serializer_class = PoultryRequestForTotalInformationSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = PoultryRequestFilterSet
filterset_fields = poultry_request_new_fields
kill_house_requests_filter_class = KillHouseRequestFilterSet
kill_house_requests_filterset_fields = kill_house_request_filterset_fields
def list(self, request, *args, **kwargs):
poultry_requests_for_search = []
kill_house_request_for_search = []
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if 'clearance_code' in request.GET:
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
clearance_code__isnull=request.GET[
'clearance_code']).select_related(
'province_request__poultry_request')
poultry_requests = PoultryRequest.objects.filter(
pk__in=kill_house_requests.values('province_request__poultry_request'),
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')
elif 'assignment' in request.GET:
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive=request.GET[
'assignment']).select_related(
'province_request__poultry_request')
poultry_requests = PoultryRequest.objects.filter(
pk__in=kill_house_requests.values('province_request__poultry_request'),
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')
elif 'discharge' in request.GET:
if request.GET['discharge'] == 'pending':
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
vet_state='pending',
assignment_state_archive='pending').select_related(
'province_request__poultry_request')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(vet_state='pending') | Q(vet_state='pending', assignment_state_archive='True')),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, ).select_related(
'province_request__poultry_request')
poultry_requests = PoultryRequest.objects.filter(
pk__in=kill_house_requests.values('province_request__poultry_request'),
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')
else:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user, trash=False)
poultry_requests = PoultryRequest.objects.filter(
poultry__address__province=user.province,
poultry__city_operator=city_operator.unit_name,
# final_state='pending',
trash=False,
# out=False,
send_date__date__gte=date1,
send_date__date__lte=date2,
).order_by('-send_date')
elif request.GET['role'] in ['CityJahad', 'CityPoultry']:
poultry_requests = PoultryRequest.objects.filter(
poultry__address__city=user.city,
# final_state='pending',
trash=False,
# out=False,
send_date__date__gte=date1,
send_date__date__lte=date2,
).order_by('-send_date')
elif request.GET['role'] == 'LiveStockSupport':
poultry_requests = PoultryRequest.objects.filter(
poultry__address__province=user.province,
freezing=True,
final_state='pending',
trash=False, out=False,
send_date__date__gte=date1,
send_date__date__lte=date2,
).order_by('-send_date')
else:
poultry_requests = PoultryRequest.objects.filter(
poultry__address__province=user.province,
# final_state='pending',
trash=False,
# out=False,
send_date__date__gte=date1,
send_date__date__lte=date2,
).order_by('-send_date')
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
province_request__poultry_request__in=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 (self.filterset_class(
data=query,
queryset=poultry_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=poultry_requests)
poultry_requests_for_search = ps.filter()
poultry_requests = [] if len(poultry_requests_for_search) == 0 else poultry_requests_for_search
for item in self.kill_house_requests_filterset_fields:
kill_house_request_query = QueryDict('{0}={1}'.format(item, request.GET['value']))
if (self.kill_house_requests_filter_class(
data=kill_house_request_query,
queryset=kill_house_requests
)
).filter():
ks = self.kill_house_requests_filter_class(data=kill_house_request_query,
queryset=kill_house_requests)
kill_house_request_for_search = ks.filter()
kill_house_requests = [] if len(kill_house_request_for_search) == 0 else kill_house_request_for_search
if len(kill_house_requests) > 0:
for kill_house_request in kill_house_requests:
if kill_house_request.province_request.poultry_request not in poultry_requests:
poultry_requests.append(kill_house_request.province_request.poultry_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(poultry_requests)
if page is not None:
serializer = PoultryRequestForTotalInformationSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = PoultryRequestForTotalInformationSerializer(poultry_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class GeneralPoultryRequestLetterReportViewSet(viewsets.ModelViewSet):
queryset = PoultryRequest.objects.all()
serializer_class = PoultryRequestLetterForProvinceVetSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date()
if request.GET['type'] == 'broadcast':
date_one_day_ago = date - timedelta(days=1)
else:
date_one_day_ago = date
poultry_requests_first_letter = 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=date_one_day_ago
).order_by('-send_date')
serializer_poultry_requests_first_letter = PoultryRequestForKillingInformationSerializer(
poultry_requests_first_letter, many=True)
poultry_requests_seconde_letter = PoultryRequest.objects.filter(send_date__date=date_one_day_ago,
quantity__gt=F('remain_quantity'),
trash=False)
serializer_poultry_requests_seconde_letter = PoultryRequestLetterForProvinceVetSerializer(
poultry_requests_seconde_letter, many=True)
kill_house_requests_third_letter_part_two = KillHouseRequest.objects.filter(
Q(vet_state='accepted') | Q(assignment_state_archive='True'),
kill_request__recive_date__date=date_one_day_ago,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).only('accepted_real_quantity', 'accepted_real_weight')
kill_house_requests_third_letter_part_two_quantity = \
kill_house_requests_third_letter_part_two.aggregate(total=Sum('accepted_real_quantity'))[
'total']
kill_house_requests_third_letter_part_two_weight = \
kill_house_requests_third_letter_part_two.aggregate(total=Sum('accepted_real_weight'))[
'total']
kill_house_requests_third_letter_part_three = KillHouseRequest.objects.filter(
clearance_code__isnull=False,
kill_request__recive_date__date=date_one_day_ago,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).only('accepted_real_quantity', 'accepted_real_weight')
# total_weight = kill_house_requests_third_letter.aggregate(total=Sum('accepted_real_weight'))[
# 'total']
# total_quantity = kill_house_requests_third_letter.aggregate(total=Sum('accepted_real_quantity'))[
# 'total']
kill_house_requests_third_letter = KillHouseRequest.objects.filter(
kill_request__recive_date__date=date_one_day_ago,
province_request__poultry_request__poultry__address__province=user.province,
trash=False
).select_related('kill_request')
kill_house_requests_third_letter_quantity = kill_house_requests_third_letter.aggregate(total=Sum('quantity'))[
'total']
kill_house_requests_third_letter_weight = kill_house_requests_third_letter.aggregate(
total=Sum(F('accepted_real_weight') * F('province_request__poultry_request__Index_weight')))[
'total']
serializer_kill_house_requests_third_letter = KillHouseRequestForBarManagementSerializer(
kill_house_requests_third_letter, many=True)
province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'),
kill_request__recive_date__date=date_one_day_ago).select_related(
'killhouse_user')
kill_houses = KillHouse.objects.filter(
pk__in=province_kill_requests.values('killhouse_user')
)
kill_house_ware_houses = KillHouseWareHouse.objects.filter(kill_house__in=kill_houses, date__date=date)
steward_allocations = StewardAllocation.objects.filter(
system_registration_code=True,
ware_house__in=kill_house_ware_houses, trash=False,
date__date=date).order_by('id')
total_number_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total']
total_weight_of_carcasses = kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total']
allocated_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('allocated_total_number_of_carcasses'))['total']
allocated_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('allocated_total_weight_of_carcasses'))['total']
remain_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))['total']
remain_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))['total']
province_kill_requests = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'),
kill_request__recive_date__date=date_one_day_ago).select_related(
'killhouse_user')
kill_houses = KillHouse.objects.filter(
pk__in=province_kill_requests.values('killhouse_user')
)
serializer_kill_house_requests_fourth_part_two = KillHouseForAutomaticStewardAllocationSerializer(kill_houses,
context={
'request': request},
many=True)
allocations = StewardAllocation.objects.filter(trash=False, system_registration_code=True,
date__date=date).order_by('id')
real_number_of_carcasses = \
allocations.aggregate(total=Sum('real_number_of_carcasses'))['total']
real_weight_of_carcasses = \
allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total']
serializer_kill_house_requests_fourth_part_three = StewardAllocationSerializer(allocations, many=True)
return Response({
"serializer_poultry_requests_first_letter": serializer_poultry_requests_first_letter.data,
"serializer_poultry_requests_seconde_letter": serializer_poultry_requests_seconde_letter.data,
"serializer_kill_house_requests_third_letter": serializer_kill_house_requests_third_letter.data,
"kill_house_requests_third_letter_quantity": kill_house_requests_third_letter_quantity if kill_house_requests_third_letter_quantity != None else 0,
"kill_house_requests_third_letter_weight": int(
kill_house_requests_third_letter_weight) if kill_house_requests_third_letter_weight != None else 0,
"serializer_kill_house_requests_third_letter_part_two": len(kill_house_requests_third_letter_part_two),
"kill_house_requests_third_letter_part_two_quantity": kill_house_requests_third_letter_part_two_quantity if kill_house_requests_third_letter_part_two_quantity != None else 0,
"kill_house_requests_third_letter_part_two_weight": kill_house_requests_third_letter_part_two_weight if kill_house_requests_third_letter_part_two_weight != None else 0,
"serializer_kill_house_requests_third_letter_part_three": len(kill_house_requests_third_letter_part_three),
"serializer_kill_house_requests_fourth_part_one": {
"buyers": len(kill_house_ware_houses),
"allocations": len(steward_allocations),
"total_number_of_carcasses": total_number_of_carcasses if total_number_of_carcasses != None else 0,
"total_weight_of_carcasses": total_weight_of_carcasses if total_weight_of_carcasses != None else 0,
"allocated_total_number_of_carcasses": allocated_total_number_of_carcasses if allocated_total_number_of_carcasses != None else 0,
"allocated_total_weight_of_carcasses": allocated_total_weight_of_carcasses if allocated_total_weight_of_carcasses != None else 0,
"remain_total_number_of_carcasses": remain_total_number_of_carcasses if remain_total_number_of_carcasses != None else 0,
"remain_total_weight_of_carcasses": remain_total_weight_of_carcasses if remain_total_weight_of_carcasses != None else 0,
},
"serializer_kill_house_requests_fourth_part_two": serializer_kill_house_requests_fourth_part_two.data,
"serializer_kill_house_requests_fourth_part_three": serializer_kill_house_requests_fourth_part_three.data,
"serializer_kill_house_requests_fourth_part_fourth": real_number_of_carcasses if real_number_of_carcasses != None else 0,
"serializer_kill_house_requests_fourth_part_fifth": real_weight_of_carcasses if real_weight_of_carcasses != None else 0,
"serializer_kill_house_requests_fourth_part_sixth": len(allocations),
})
class StewardGuildsAllocationsForStatisticalProfileViewSet(viewsets.ModelViewSet):
queryset = StewardAllocation.objects.all()
serializer_class = StewardAllocationSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date()
allocations = StewardAllocation.objects.filter(trash=False, system_registration_code=True,
date__date=date).order_by('id')
real_number_of_carcasses = \
allocations.aggregate(total=Sum('real_number_of_carcasses'))['total']
real_weight_of_carcasses = \
allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total']
serializer_kill_house_requests_fourth_part_three = StewardAllocationSerializer(allocations, many=True)
return Response({
"real_number_of_carcasses": real_number_of_carcasses if real_number_of_carcasses != None else 0,
"real_weight_of_carcasses": real_weight_of_carcasses if real_weight_of_carcasses != None else 0,
"allocations": len(allocations),
})
# kill_house_requests=KillHouseRequest.objects.filter(killhouse_user__id=5,trash=True,clearance_code__isnull=False,message__isnull=True)
# for kill_house_request in kill_house_requests:
# kill_house_request.message='عدم ارسال راننده توسط کشتارگاه'
# kill_house_request.bar_remover={
# "date": str(kill_house_request.create_date.date()),
# "role":"KillHouse",
# "mobile": "09143488339",
# "full_name": "حامد صمدی"
# }
# kill_house_request.save()
class DetailOfKillingViewSet(viewsets.ViewSet):
permission_classes = [TokenHasReadWriteScope]
def hatching_55_90_data(self, request):
if 'role' in request.GET:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(trash=False, user__user=request.user)
hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1,
chicken_age__range=(55, 90),
poultry__city_operator=city_operator.unit_name, ).order_by(
'id')
elif request.GET['role'] in ['CityJahad', 'CityPoultry']:
user = SystemUserProfile.objects.get(user=request.user)
hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1,
chicken_age__range=(55, 90),
poultry__user__city=user.city).order_by('id')
else:
hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1,
chicken_age__range=(55, 90)).order_by('id')
else:
hatching_between_50_70 = PoultryHatching.objects.filter(trash=False, left_over__gt=F('quantity') * 0.1,
chicken_age__range=(55, 90)).order_by('id')
min_list = []
all_poultry_hatching_quantity = hatching_between_50_70.aggregate(total=Sum('quantity'))['total']
all_poultry_hatching_killed_quantity = hatching_between_50_70.aggregate(total=Sum('killed_quantity'))['total']
all_poultry_hatching_left_over = hatching_between_50_70.aggregate(total=Sum('left_over'))['total']
all_left_over_ninty_percent = \
hatching_between_50_70.aggregate(total=Sum(F('quantity') * 90 / 100) - Sum(F('killed_quantity')))['total']
archive_hatch = hatching_between_50_70.filter(archive=True, allow_hatching='True')
active_hatch = hatching_between_50_70.filter(archive=False, allow_hatching='pending')
archive_hatching_quantity = \
archive_hatch.aggregate(total=Sum('quantity'))['total']
left_over_active_hatch = \
active_hatch.aggregate(total=Sum('quantity'))['total'] or 0
for poultry_hatching in hatching_between_50_70:
if poultry_hatching.chicken_age not in min_list:
min_list.append(poultry_hatching.chicken_age)
min_list = sorted(min_list)
all_total_commitment = hatching_between_50_70.aggregate(total_quantity=Sum('total_commitment')).get(
'total_quantity', 0)
all_governmental_killed_quantity = hatching_between_50_70.aggregate(
total_quantity=Sum('governmental_killed_quantity')).get(
'total_quantity', 0)
all_free_killed_quantity = hatching_between_50_70.aggregate(
total_quantity=Sum('free_killed_quantity')).get(
'total_quantity', 0)
all_total_killed_weight = hatching_between_50_70.aggregate(
total_quantity=Sum('total_killed_weight')).get(
'total_quantity', 0)
all_governmental_quantity = hatching_between_50_70.aggregate(
total_quantity=Sum('governmental_quantity')).get(
'total_quantity', 0)
all_free_quantity = hatching_between_50_70.aggregate(
total_quantity=Sum('free_quantity')).get(
'total_quantity', 0)
all_out_province_killed_quantity = hatching_between_50_70.aggregate(
total_quantity=Sum('out_province_killed_quantity')).get(
'total_quantity', 0)
all_out_province_killed_weight = hatching_between_50_70.aggregate(
total_quantity=Sum('out_province_killed_weight')).get(
'total_quantity', 0)
return {
'poultry': len(hatching_between_50_70),
'hatching_quantity': all_poultry_hatching_quantity,
'len_archive_hatching': len(archive_hatch),
'archive_hatching_quantity': archive_hatching_quantity,
'len_active_hatching': len(active_hatch),
'active_hatching_quantity': left_over_active_hatch,
'hatching_killed_quantity': all_poultry_hatching_killed_quantity,
'hatching_killed_weight': int(all_total_killed_weight),
'hatching_left_over': all_poultry_hatching_left_over,
'hatching_left_over_ninty_percent': all_left_over_ninty_percent,
'min_age': min_list[0] if len(min_list) > 0 else None,
'max_age': min_list[len(min_list) - 1] if len(min_list) > 0 else None,
'total_commitment': all_total_commitment,
'governmental_quantity': all_governmental_quantity,
'governmental_weight': int(all_governmental_killed_quantity),
'free_quantity': all_free_quantity,
'free_weight': all_free_killed_quantity,
'out_province_killed_quantity': all_out_province_killed_quantity,
'out_province_killed_weight': all_out_province_killed_weight
}
def get_kill_house_for_detail(self, kill_req):
poultry_request = (PoultryRequest.objects.filter(trash=False, pk__in=kill_req.values(
'province_request__poultry_request'))
.only('quantity', 'Index_weight')).annotate(
total_quantity=Sum('quantity'),
total_weight=Sum(F('quantity') * F('Index_weight'))
)
total_requests_quantity = poultry_request.aggregate(total=Sum('total_quantity'))['total']
total_requests_weight = poultry_request.aggregate(total=Sum('total_weight'))['total']
all_quantity = kill_req.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
all_weighte = kill_req.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
all_governmental_quantity = \
kill_req.filter(province_request__poultry_request__free_sale_in_province=False).aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
all_governmental_weight = \
kill_req.filter(province_request__poultry_request__free_sale_in_province=False).aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
all_free_quantity = kill_req.filter(province_request__poultry_request__free_sale_in_province=True).aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
all_free_weight = kill_req.filter(province_request__poultry_request__free_sale_in_province=True).aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
all_age = []
if kill_req:
for kill in kill_req:
# weight = kill.get('quantity') * kill.get(
# 'province_kill_request__province_request__poultry_request__Index_weight')
# all_weighte += weight
age = (kill.get('province_request__poultry_request__send_date').date() -
kill.get('province_request__poultry_request__hatching__date').date()).days + 1
if age not in all_age:
all_age.append(age)
# difference_bars = kill_req.filter(
# Q(quantity__gt=F('quarantine_quantity')) | Q(quantity__lt=F('quarantine_quantity')),quarantine_quantity__gt=0)
#
#
# final_real_quantity=-0
# difference_bar = len(difference_bars)
# greater_bars_quantity = difference_bars.filter(quantity__gt=F('quarantine_quantity'))
# real_greater_bars_quantity = (greater_bars_quantity.aggregate(total=Sum('quarantine_quantity'))['total'] or 0 ) - (greater_bars_quantity.aggregate(total=Sum('quantity'))['total'] or 0 )
# less_bars_quantity = difference_bars.filter(quantity__lt=F('quarantine_quantity'))
# real_less_bars_quantity = (less_bars_quantity.aggregate(total=Sum('quarantine_quantity'))['total'] or 0 ) - (less_bars_quantity.aggregate(total=Sum('quantity'))['total'] or 0 )
#
# final_real_quantity = real_greater_bars_quantity + real_less_bars_quantity if real_greater_bars_quantity > 0 else (-1 * real_greater_bars_quantity) + real_less_bars_quantity
difference_bars = kill_req.filter(
Q(accepted_real_quantity__gt=F('quarantine_quantity')) | Q(
accepted_real_quantity__lt=F('quarantine_quantity')), quarantine_quantity__gt=0)
final_real_quantity = -0
difference_bar = len(difference_bars)
greater_bars_quantity = difference_bars.filter(accepted_real_quantity__gt=F('quarantine_quantity'))
real_greater_bars_quantity = (greater_bars_quantity.aggregate(total=Sum('quarantine_quantity'))[
'total'] or 0) - (
greater_bars_quantity.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0)
less_bars_quantity = difference_bars.filter(accepted_real_quantity__lt=F('quarantine_quantity'))
real_less_bars_quantity = (less_bars_quantity.aggregate(total=Sum('quarantine_quantity'))['total'] or 0) - (
less_bars_quantity.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0)
final_real_quantity = real_greater_bars_quantity + real_less_bars_quantity if real_greater_bars_quantity > 0 else (
-1 * real_greater_bars_quantity) + real_less_bars_quantity
hasnt_code = kill_req.filter(clearance_code__isnull=True)
all_quarantine_quantity_hasnt_code = hasnt_code.aggregate(total_quantity=Sum('quantity')).get(
'total_quantity', 0)
has_code = kill_req.filter(clearance_code__isnull=False)
all_quarantine_quantity_has_code = has_code.aggregate(total_quantity=Sum('quantity')).get(
'total_quantity', 0)
has_qarantine = kill_req.filter(quarantine_quantity__isnull=False)
all_has_qarantine = has_qarantine.aggregate(total_quantity=Sum('quarantine_quantity')).get(
'total_quantity', 0)
all_age1 = sorted(all_age)
return {
'poultry_request': len(poultry_request),
'poultry_request_quantity': total_requests_quantity if total_requests_quantity != None else 0,
'poultry_request_weight': int(total_requests_weight) if total_requests_weight != None else 0,
'min_age': all_age1[0] if len(all_age1) > 0 else '-',
'max_age': all_age1[len(all_age1) - 1] if len(all_age1) > 0 else '-',
'avg_age': int((sum(all_age1)) / len(all_age1)) if len(all_age1) > 0 else '-',
'len_kill_request': len(kill_req),
'kill_request_quantity': all_quantity if all_quantity != None else 0,
'kill_request_weight': int(all_weighte),
'avg_weight': round(all_weighte / all_quantity, 1) if all_weighte > 0 and all_quantity > 0 else 0,
'len_kill_request_has_code': len(has_code),
'quantity_of_kill_request_has_code': all_quarantine_quantity_has_code if all_quarantine_quantity_has_code != None else 0,
'len_kill_request_has_quarantine': len(has_qarantine),
'quantity_of_kill_request_has_quarantine': all_has_qarantine if all_has_qarantine != None else 0,
'len_kill_request_has_not_code': len(hasnt_code),
'quantity_of_kill_request_has_not_code': all_quarantine_quantity_hasnt_code if all_quarantine_quantity_hasnt_code != None else 0,
'difference_bar': difference_bar,
'final_real_quantity': final_real_quantity,
'all_governmental_quantity': all_governmental_quantity,
'all_governmental_weight': all_governmental_weight,
'all_free_quantity': all_free_quantity,
'all_free_weight': all_free_weight,
}
def steward_ware_house_total_report_daily_broad_cast(self, steward):
number_of_steward1 = Steward.objects.filter(
pk__in=steward.values('steward')
)
steward_allocations = StewardAllocation.objects.filter(
Q(type='manual') | Q(type='auto', system_registration_code=True),
steward_ware_house__in=steward, receiver_state__in=('pending', 'accepted'),
trash=False).order_by(
'id')
guild_allocations1 = steward_allocations.filter(guilds__isnull=False, trash=False)
number_of_guild1 = guild_allocations1.values('guilds').distinct().count() if guild_allocations1 else 0
total_number_of_free_carcasses1 = steward.aggregate(total=Sum('number_of_free_carcasses'))[
'total'] or 0
total_free_weight_of_carcasses1 = steward.aggregate(total=Sum('weight_of_free_carcasses'))[
'total'] or 0
total_number_of_carcasses1 = steward.aggregate(total=Sum('number_of_carcasses'))[
'total'] or 0
total_weight_of_carcasses1 = steward.aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
final_total_number_of_carcasses1 = \
steward.aggregate(total=Sum('real_number_of_carcasses'))[
'total'] or 0
final_total_weight_of_carcasses1 = \
steward.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_remain_quantity1 = \
steward.aggregate(total=Sum('remain_total_number_of_carcasses'))[
'total'] or 0
total_remain_weight1 = \
steward.aggregate(total=Sum('remain_total_weight_of_carcasses'))[
'total'] or 0
total_allocated_quantity1 = \
steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[
'total'] or 0
total_allocated_weight1 = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_accepted_allocated_quantity1 = \
steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[
'total'] or 0
total_accepted_allocated_weight1 = \
steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[
'total'] or 0
return {
"buyers": len(number_of_steward1),
"incoming_quantity_of_cold_house": 0,
"incoming_weight_of_cold_house": 0,
"total_pre_cold_quantity": 0,
"total_pre_cold_weight": 0,
"total_number_of_free_carcasses": total_number_of_free_carcasses1,
"total_free_weight_of_carcasses": total_free_weight_of_carcasses1,
"total_number_of_carcasses": total_number_of_carcasses1,
"total_weight_of_carcasses": int(total_weight_of_carcasses1),
"final_total_number_of_carcasses": final_total_number_of_carcasses1,
"final_total_weight_of_carcasses": int(final_total_weight_of_carcasses1),
"total_allocated_quantity": total_allocated_quantity1,
"total_allocated_weight": int(total_allocated_weight1),
"total_accepted_allocated_quantity": total_accepted_allocated_quantity1,
"total_accepted_allocated_weight": int(total_accepted_allocated_weight1),
"total_remain_quantity": total_remain_quantity1,
"total_remain_weight": int(total_remain_weight1),
"number_of_guild": number_of_guild1,
}
def kill_house_ware_house_total_report_daily_broad_cast(self, kill):
number_of_kill_houses = KillHouse.objects.filter(
pk__in=kill.values('kill_house')
)
steward_allocations = StewardAllocation.objects.filter(
Q(type='manual') | Q(type='auto', system_registration_code=True),
ware_house__in=kill, receiver_state__in=('pending', 'accepted'), trash=False).order_by(
'id')
guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False)
number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0
steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False, trash=False)
number_of_steward = steward_allocations_for_number_of_steward.values(
'steward').distinct().count() if steward_allocations_for_number_of_steward else 0
total_pre_cold_quantity = \
kill.aggregate(total=Sum('pre_cold_number_of_carcasses_to_ware_house'))[
'total'] or 0
total_pre_cold_weight = \
kill.aggregate(total=Sum('pre_cold_weight_of_carcasses_to_ware_house'))[
'total'] or 0
total_number_of_free_carcasses = kill.aggregate(total=Sum('number_of_free_carcasses'))[
'total'] or 0
total_free_weight_of_carcasses = kill.aggregate(total=Sum('free_weight_of_carcasses'))[
'total'] or 0
total_number_of_carcasses = kill.aggregate(total=Sum('number_of_carcasses'))[
'total'] or 0
total_weight_of_carcasses = kill.aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
final_total_number_of_carcasses = \
kill.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total'] or 0
final_total_weight_of_carcasses = \
kill.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total'] or 0
total_remain_quantity = \
kill.aggregate(total=Sum('remain_total_number_of_carcasses'))[
'total'] or 0
total_remain_weight = \
kill.aggregate(total=Sum('remain_total_weight_of_carcasses'))[
'total'] or 0
total_allocated_quantity = \
steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[
'total'] or 0
total_allocated_weight = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_accepted_allocated_quantity = \
steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[
'total'] or 0
total_accepted_allocated_weight = \
steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[
'total'] or 0
return {
"buyers": len(number_of_kill_houses),
"incoming_quantity_of_cold_house": 0,
"incoming_weight_of_cold_house": 0,
"total_pre_cold_quantity": total_pre_cold_quantity,
"total_pre_cold_weight": int(total_pre_cold_weight),
"total_number_of_free_carcasses": total_number_of_free_carcasses,
"total_free_weight_of_carcasses": int(total_free_weight_of_carcasses),
"total_number_of_carcasses": total_number_of_carcasses,
"total_weight_of_carcasses": int(total_weight_of_carcasses),
"final_total_number_of_carcasses": final_total_number_of_carcasses,
"final_total_weight_of_carcasses": int(final_total_weight_of_carcasses),
"total_allocated_quantity": total_allocated_quantity,
"total_allocated_weight": int(total_allocated_weight),
"total_accepted_allocated_quantity": total_accepted_allocated_quantity,
"total_accepted_allocated_weight": int(total_accepted_allocated_weight),
"total_remain_quantity": total_remain_quantity,
"total_remain_weight": int(total_remain_weight),
"number_of_guild": number_of_guild,
"number_of_steward": number_of_steward,
}
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date1 = datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date() if 'date2' in request.GET else now
if 'role' in request.GET:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(trash=False, user__user=request.user)
filtered_kill_reqs = KillHouseRequest.objects.filter(
Q(trash=False) | Q(trash=True, clearance_code__isnull=False),
province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'-create_date').select_related(
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True,
out_province_request_cancel=False,
province_state='accepted',
poultry__city_operator=city_operator.unit_name,
send_date__date__gte=date1,
send_date__date__lte=date2)
elif request.GET['role'] in ['CityJahad', 'CityPoultry']:
user = SystemUserProfile.objects.get(user=request.user)
filtered_kill_reqs = KillHouseRequest.objects.filter(
Q(trash=False) | Q(trash=True, clearance_code__isnull=False),
province_request__poultry_request__poultry__user__city=user.city,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'-create_date').select_related(
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True,
out_province_request_cancel=False,
poultry__user__city=user.city,
province_state='accepted',
send_date__date__gte=date1,
send_date__date__lte=date2)
else:
filtered_kill_reqs = KillHouseRequest.objects.filter(
Q(trash=False) | Q(trash=True, clearance_code__isnull=False),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'-create_date').select_related(
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True,
out_province_request_cancel=False,
province_state='accepted',
send_date__date__gte=date1,
send_date__date__lte=date2)
else:
filtered_kill_reqs = KillHouseRequest.objects.filter(
Q(trash=False) | Q(trash=True, clearance_code__isnull=False),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'-create_date').select_related(
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
out_true_poultry_request = PoultryRequest.objects.filter(trash=False, out=True,
out_province_request_cancel=False,
province_state='accepted',
send_date__date__gte=date1,
send_date__date__lte=date2)
kill_req = self.get_kill_house_for_detail(filtered_kill_reqs)
filtered_kill_reqs_not_code_but_have_assigment = filtered_kill_reqs.filter(
Q(assignment_state_archive='True', vet_state='pending')
| Q(vet_state='accepted'), clearance_code__isnull=True)
bar_government = filtered_kill_reqs.filter(
province_request__poultry_request__free_sale_in_province=False)
accepted_real_quantity_bar_government = bar_government.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity', 0) or 0
accepted_real_wight_bar_government = bar_government.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity', 0) or 0
bar_government_quarantine_quantity = bar_government.filter(quarantine_quantity__isnull=False)
accepted_real_quantity_bar_government_quarantine_quantity = bar_government_quarantine_quantity.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
bar_free = filtered_kill_reqs.filter(province_request__poultry_request__free_sale_in_province=True)
accepted_real_quantity_bar_free = bar_free.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
accepted_real_wight_bar_free = bar_free.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
bar_free_quarantine_quantity = bar_free.filter(quarantine_quantity__isnull=False)
accepted_real_quantity_bar_free_quarantine_quantity = bar_free_quarantine_quantity.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
bar_free_has_code = len(bar_free.filter(clearance_code__isnull=False))
quantity_out_true_poultry_request = out_true_poultry_request.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
bar_complete_with_kill_house_and_vet = filtered_kill_reqs.filter(
trash=False)
bar_complete_with_vet = filtered_kill_reqs.filter(
vet_state='accepted')
accepted_real_quantity_with_kill_house_and_vet = bar_complete_with_kill_house_and_vet.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
accepted_real_wight_with_kill_house_and_vet = bar_complete_with_kill_house_and_vet.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
all_vet_accepted_real_quantity_with_kill_house_and_vet = bar_complete_with_vet.aggregate(
total_quantity=Sum('vet_accepted_real_quantity')).get(
'total_quantity') or 0
all_vet_accepted_real_weight_with_kill_house_and_vet = bar_complete_with_vet.aggregate(
total_quantity=Sum('vet_accepted_real_weight')).get(
'total_quantity') or 0
bar_complete_with_kill_house = filtered_kill_reqs.filter(
assignment_state_archive='True')
accepted_real_wight_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
accepted_real_quantity_no_code = filtered_kill_reqs_not_code_but_have_assigment.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
accepted_real_wight_no_code = filtered_kill_reqs_not_code_but_have_assigment.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
if accepted_real_wight_with_kill_house_and_vet != None:
less_25 = (accepted_real_wight_with_kill_house_and_vet * 75) / 100
else:
less_25 = 0
filtered_kill_reqs_not_assigment_all = filtered_kill_reqs.filter(
assignment_state_archive='pending', vet_state='pending')
accepted_real_quantity_not_assigment_all = filtered_kill_reqs_not_assigment_all.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity', 0) or 0
accepted_real_wight_not_assigment_all = filtered_kill_reqs_not_assigment_all.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity', 0) or 0
filtered_kill_reqs_havent_kill_house = filtered_kill_reqs.filter(
assignment_state_archive='pending'
, vet_state='accepted')
accepted_real_quantity_havent_kill_house = filtered_kill_reqs_havent_kill_house.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
accepted_real_wight_havent_kill_house = filtered_kill_reqs_havent_kill_house.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
accepted_real_quantity_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity', 0) or 0
accepted_real_weight_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity', 0) or 0
accepted_real_quantity_final1 = filtered_kill_reqs.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity', 0) or 0
accepted_real_weight_final1 = filtered_kill_reqs.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity', 0) or 0
kill_house_ware_houses = KillHouseWareHouse.objects.filter(
Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q(
pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=date1,
date__date__lte=date2, trash=False)
kill_house_data = self.kill_house_ware_house_total_report_daily_broad_cast(kill_house_ware_houses)
steward_ware_houses = StewardWareHouse.objects.filter(
Q(weight_of_carcasses__gt=0) | Q(weight_of_free_carcasses__gt=0), date__date__gte=date1,
date__date__lte=date2, trash=False)
steward = self.steward_ware_house_total_report_daily_broad_cast(steward_ware_houses)
return Response({
'age55_age90': self.hatching_55_90_data(request),
'kill_request': kill_req,
'free_and_government_kill_request': {
'len_government': len(bar_government),
'quantity_government': accepted_real_quantity_bar_government,
'weight_government': int(accepted_real_wight_bar_government),
'len_government_quarantine_quantity': len(bar_government_quarantine_quantity),
'real_quantity_bar_government_quarantine_quantity': accepted_real_quantity_bar_government_quarantine_quantity,
'len_free': len(bar_free),
'quantity_free': accepted_real_quantity_bar_free,
'weight_free': accepted_real_wight_bar_free,
'len_free_quarantine_quantity': len(bar_free_quarantine_quantity),
'real_quantity_bar_free_quarantine_quantity': accepted_real_quantity_bar_free_quarantine_quantity,
'len_free_has_code': bar_free_has_code,
'len_out_kill_request': len(out_true_poultry_request),
'quantity_out_kill_request': quantity_out_true_poultry_request,
},
'complete_kill_request': {
'len_complete_with_kill_house_and_vet': len(bar_complete_with_kill_house_and_vet),
'quantity_with_kill_house_and_vet': accepted_real_quantity_with_kill_house_and_vet,
'weight_with_kill_house_and_vet': int(accepted_real_wight_with_kill_house_and_vet),
"avg_weight": round(
accepted_real_wight_with_kill_house_and_vet / accepted_real_quantity_with_kill_house_and_vet,
1) if accepted_real_wight_with_kill_house_and_vet > 0 else 0,
'less_25': int(less_25),
'len_complete_with_vet': len(bar_complete_with_vet),
'quantity_complete_with_vet': all_vet_accepted_real_quantity_with_kill_house_and_vet,
'weight_complete_with_vet': int(all_vet_accepted_real_weight_with_kill_house_and_vet),
'len_complete_with_kill_house': len(bar_complete_with_kill_house),
'quantity_final_kill_house': accepted_real_quantity_final,
'weight_final_kill_house': int(accepted_real_wight_final),
'len_kill_reqs_has_not_code': len(filtered_kill_reqs_not_code_but_have_assigment),
'quantity_kill_reqs_has_not_code': accepted_real_quantity_no_code,
'weight_kill_reqs_has_not_code': int(accepted_real_wight_no_code),
},
'kill_request_has_not_assigment': {
'len_kill_reqs_not_assigment': len(filtered_kill_reqs_not_assigment_all),
'quantity_kill_reqs_not_assigment': accepted_real_quantity_not_assigment_all,
'weight_kill_reqs_not_assigment': int(accepted_real_wight_not_assigment_all),
'len_kill_request_has_not_complete': len(filtered_kill_reqs_havent_kill_house),
'quantity_kill_request_has_not_complete': accepted_real_quantity_havent_kill_house,
'weight_kill_request_has_not_complete': int(accepted_real_wight_havent_kill_house),
},
'final_quantity_and_weight': {
'final_quantity': accepted_real_quantity_final1,
'final_weight': int(accepted_real_weight_final1),
},
'kill_house_ware_house_total_report_daily_broad_cast': kill_house_data,
'steward_ware_house_total_report_daily_broad_cast': steward
})
class ComprehensiveReportOfTheSlaughterhouseViewSet(viewsets.ViewSet):
permission_classes = [AllowAny]
def all_kill_request(self, date1, date2):
filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
).order_by(
'-create_date').select_related(
'province_request__poultry_request__hatching', 'province_request__poultry_request').only(
'province_kill_request__province_request__poultry_request__Index_weight',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'ware_house_accepted_real_weight',
'ware_house_accepted_real_quantity')
all_kill_req_quantity = filtered_kill_reqs.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
weight = filtered_kill_reqs.aggregate(
total_quantity=Sum(
F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[
'total_quantity'] or 0
all_kill_req_quantity_reciver = filtered_kill_reqs.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
all_kill_req_weight_reciver = filtered_kill_reqs.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
all_ware_house_accepted_real_quantity = filtered_kill_reqs.aggregate(
total_quantity=Sum('ware_house_accepted_real_quantity')).get(
'total_quantity') or 0
all_ware_house_accepted_real_weight = filtered_kill_reqs.aggregate(
total_quantity=Sum('ware_house_accepted_real_weight')).get(
'total_quantity') or 0
return {
"quantity_of_create_bar": all_kill_req_quantity,
"weight_of_create_bar": int(weight),
"quantity_of_receive_bar": all_kill_req_quantity_reciver,
"weight_of_receive_bar": int(all_kill_req_weight_reciver),
"weight_with_twenty_five_percent_receive": int(
(all_kill_req_weight_reciver * 75) / 100) if all_kill_req_weight_reciver > 0 else 0,
"quantity_warehouse": all_ware_house_accepted_real_quantity,
"weight_warehouse": int(all_ware_house_accepted_real_weight),
"quantity_percent_warehouse": int(
all_ware_house_accepted_real_quantity * 100 / all_kill_req_quantity_reciver) if all_ware_house_accepted_real_quantity > 0 else 0,
"weight_percent_warehouse": int(
all_ware_house_accepted_real_weight * 100 / all_kill_req_weight_reciver) if all_ware_house_accepted_real_weight > 0 else 0,
"quantity_percent_receive": int(
all_kill_req_quantity_reciver * 100 / all_kill_req_quantity) if all_kill_req_quantity_reciver > 0 else 0,
"weight_percent_receive": int(
(all_kill_req_weight_reciver * 100) / weight) if all_kill_req_weight_reciver > 0 else 0
}
def general_broadcast_information(self, tomorrow_date1, tomorrow_date2, filtered_kill_reqs, kill_free_info):
number_of_kill_house = filtered_kill_reqs.values(
'killhouse_user').distinct().count() if filtered_kill_reqs else 0
all_quantity_out_false = filtered_kill_reqs.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
weight = filtered_kill_reqs.aggregate(
total_quantity=Sum(
F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[
'total_quantity'] or 0
all_quantity_out_true = kill_free_info.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
all_weight_out_true = kill_free_info.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
kill_house_ware_houses = KillHouseWareHouse.objects.filter(
Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q(
pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1,
date__date__lte=tomorrow_date2, trash=False)
final_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total'] or 0
final_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total'] or 0
steward_allocations = StewardAllocation.objects.filter(
Q(type='manual') | Q(type='auto', system_registration_code=True),
ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'),
trash=False).order_by(
'id')
total_allocated_quantity = \
steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[
'total'] or 0
total_allocated_weight = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_accepted_allocated_quantity = \
steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[
'total'] or 0
total_accepted_allocated_weight = \
steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[
'total'] or 0
total_remain_quantity = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[
'total'] or 0
total_remain_weight = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[
'total'] or 0
steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False,
trash=False)
number_of_steward = steward_allocations_for_number_of_steward.values(
'steward').distinct().count() if steward_allocations_for_number_of_steward else 0
guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False)
number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0
return {
"number_of_buyer": number_of_kill_house,
"quantity_of_kill_request_in_province": all_quantity_out_false,
"weight_of_kill_request_in_province": int(weight),
"quantity_of_kill_request_out_province": all_quantity_out_true,
"weight_of_kill_request_out_province": int(all_weight_out_true),
"quantity_carcasses": final_total_number_of_carcasses,
"weight_carcasses": int(final_total_weight_of_carcasses),
"allocated_quantity": total_allocated_quantity,
"allocated_weight": int(total_allocated_weight),
"accepted_allocated_quantity": total_accepted_allocated_quantity,
"accepted_allocated_weight": int(total_accepted_allocated_weight),
"remain_quantity": total_remain_quantity,
"remain_weight": int(total_remain_weight),
"percent_warehouse": int((
total_allocated_quantity * 100) / final_total_number_of_carcasses) if total_allocated_quantity and final_total_number_of_carcasses > 0 else 0,
"number_of_stewards": number_of_steward,
"number_of_giulds": number_of_guild,
"date1": tomorrow_date1,
"date2": tomorrow_date2,
}
def kill_request_and_broadcast(self, tomorrow_date1, tomorrow_date2, filtered_kill_reqs, kill_free_info):
list1 = []
kill_houses = KillHouse.objects.filter(trash=False).select_related('kill_house_operator__user__city').exclude(
out_province=True)
for kill_house in kill_houses:
kill_free_information = kill_free_info.filter(kill_house=kill_house)
tomorrow_kill_request = filtered_kill_reqs.filter(killhouse_user=kill_house)
if tomorrow_kill_request:
tomorrow_kill_request_not_assigment = tomorrow_kill_request.filter(assignment_state_archive='pending',
vet_state='accepted')
all_kill_req_quantity = tomorrow_kill_request.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
all_kill_req_quantity_reciver = tomorrow_kill_request.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
all_kill_req_weight_reciver = tomorrow_kill_request.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
all_ware_house_accepted_real_quantity = tomorrow_kill_request.aggregate(
total_quantity=Sum('ware_house_accepted_real_quantity')).get(
'total_quantity') or 0
weight = tomorrow_kill_request.aggregate(
total_quantity=Sum(
F('quantity') * F('province_kill_request__province_request__poultry_request__Index_weight')))[
'total_quantity'] or 0
kill_house_ware_houses = KillHouseWareHouse.objects.filter(
Q(weight_of_carcasses__gt=0) | Q(free_weight_of_carcasses__gt=0) | Q(
pre_cold_weight_of_carcasses_to_ware_house__gt=0), date__date__gte=tomorrow_date1,
date__date__lte=tomorrow_date2, kill_house=kill_house, trash=False)
steward_allocations = StewardAllocation.objects.filter(
Q(type='manual') | Q(type='auto', system_registration_code=True),
ware_house__in=kill_house_ware_houses, receiver_state__in=('pending', 'accepted'),
trash=False).order_by(
'id')
total_allocated_quantity = \
steward_allocations.aggregate(total=Sum('real_number_of_carcasses'))[
'total'] or 0
total_allocated_weight = \
steward_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_accepted_allocated_quantity = \
steward_allocations.aggregate(total=Sum('receiver_real_number_of_carcasses'))[
'total'] or 0
total_accepted_allocated_weight = \
steward_allocations.aggregate(total=Sum('receiver_real_weight_of_carcasses'))[
'total'] or 0
total_remain_quantity = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_number_of_carcasses'))[
'total'] or 0
total_remain_weight = \
kill_house_ware_houses.aggregate(total=Sum('remain_total_weight_of_carcasses'))[
'total'] or 0
final_total_number_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('final_total_number_of_carcasses'))[
'total'] or 0
final_total_weight_of_carcasses = \
kill_house_ware_houses.aggregate(total=Sum('final_total_weight_of_carcasses'))[
'total'] or 0
steward_allocations_for_number_of_steward = steward_allocations.filter(steward__isnull=False,
trash=False)
number_of_steward = steward_allocations_for_number_of_steward.values(
'steward').distinct().count() if steward_allocations_for_number_of_steward else 0
guild_allocations = steward_allocations.filter(guilds__isnull=False, trash=False)
number_of_guild = guild_allocations.values('guilds').distinct().count() if guild_allocations else 0
all_kill_req_quantity_not_assigment = tomorrow_kill_request_not_assigment.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
all_kill_req_weight_not_assigment = tomorrow_kill_request_not_assigment.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
all_quantity_out_true = kill_free_information.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
all_weight_out_true = kill_free_information.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
twenty_five_percent = (int(all_kill_req_weight_reciver) * 75) / 100
reciver_percent = int(
int(all_kill_req_quantity_reciver) * 100) / all_kill_req_quantity if all_kill_req_quantity_reciver > 0 else 0
lashe_25_percent = int(
final_total_number_of_carcasses * 100 / all_kill_req_quantity_reciver) if final_total_number_of_carcasses > 0 else 0
weight_lashe_25_percent = int(
final_total_weight_of_carcasses * 100 / all_kill_req_weight_reciver) if final_total_weight_of_carcasses > 0 else 0
remain_percent = int((
total_remain_quantity * 100) / all_ware_house_accepted_real_quantity) if total_remain_quantity and all_ware_house_accepted_real_quantity > 0 else 0
all_num = number_of_steward + number_of_guild
hasnt_code = len(
tomorrow_kill_request.filter(assignment_state_archive='True', clearance_code__isnull=True))
percent_hasnt_code = round(hasnt_code * 100 / len(tomorrow_kill_request)) if len(
tomorrow_kill_request) > 0 else 0
has_code = len(
tomorrow_kill_request.filter(assignment_state_archive='pending', clearance_code__isnull=False))
percent_has_code = round(has_code * 100 / len(tomorrow_kill_request)) if len(
tomorrow_kill_request) > 0 else 0
has_assignment = len(
tomorrow_kill_request.filter(assignment_state_archive='True'))
percent_has_assignment = round(has_assignment * 100 / len(tomorrow_kill_request)) if len(
tomorrow_kill_request) > 0 else 0
hasnt_assignment = len(
tomorrow_kill_request.filter(assignment_state_archive='pending'))
percent_hasnt_assignment = round(hasnt_assignment * 100 / len(tomorrow_kill_request)) if len(
tomorrow_kill_request) > 0 else 0
accepeted_bar = len(
tomorrow_kill_request.filter(bar_document_status__title='بدون مشکل'))
percent_accepeted_bar = round(accepeted_bar * 100 / has_assignment) if has_assignment > 0 else 0
diffrent_bar = len(
tomorrow_kill_request.filter(bar_document_status__title='مغایرت دارد'))
percent_diffrent_bar = round(diffrent_bar * 100 / has_assignment) if has_assignment > 0 else 0
no_quality = len(
tomorrow_kill_request.filter(bar_document_status__title='فاقد کیفیت'))
percent_no_quality = round(no_quality * 100 / has_assignment) if has_assignment > 0 else 0
low_quality = len(
tomorrow_kill_request.filter(bar_document_status__title='کیفیت پایین'))
percent_low_quality = round(low_quality * 100 / has_assignment) if has_assignment > 0 else 0
dict_1 = {
"name": kill_house.name,
"city": kill_house.kill_house_operator.user.city.name,
"kill_req_quantity": all_kill_req_quantity,
"kill_req_weight": int(weight),
"quantity_receiver": all_kill_req_quantity_reciver,
"weight_receiver": int(all_kill_req_weight_reciver),
"twenty_five_percent_weight": int(twenty_five_percent),
"receiver_percent": reciver_percent,
"quantity_of_carcasses": final_total_number_of_carcasses,
"weight_of_carcasses": int(final_total_weight_of_carcasses),
"quantity_of_lashe_percent": lashe_25_percent,
"weight_of_lashe_percent": int(weight_lashe_25_percent),
"quantity_out_province": all_quantity_out_true,
"weight_out_province": int(all_weight_out_true),
"total_number_of_carcasses": final_total_number_of_carcasses,
"total_weight_of_carcasses": int(final_total_weight_of_carcasses),
"allocated_quantity": total_allocated_quantity,
"allocated_weight": int(total_allocated_weight),
"accepted_allocated_quantity": total_accepted_allocated_quantity,
"accepted_allocated_weight": int(total_accepted_allocated_weight),
"remain_quantity": total_remain_quantity,
"remain_weight": int(total_remain_weight),
"remain_percent": remain_percent,
"steward_and_guild": all_num,
"len_kill_req_not_complete": len(tomorrow_kill_request_not_assigment),
"quantity_kill_req_not_complete": all_kill_req_quantity_not_assigment,
"weight_kill_req_not_complete": int(all_kill_req_weight_not_assigment),
"len_hasnt_code": hasnt_code,
"percent_hasnt_code": percent_hasnt_code,
"len_has_code": has_code,
"percent_has_code": percent_has_code,
"has_assignment": has_assignment,
"percent_has_assignment": percent_has_assignment,
"accepeted_bar": accepeted_bar,
"percent_accepeted_bar": percent_accepeted_bar,
"diffrent_bar": diffrent_bar,
"percent_diffrent_bar": percent_diffrent_bar,
"no_quality": no_quality,
"percent_no_quality": percent_no_quality,
"low_quality": low_quality,
"percent_low_quality": percent_low_quality,
"hasnt_assignment": hasnt_assignment,
"percent_hasnt_assignment": percent_hasnt_assignment,
}
list1.append(dict_1)
return list1
def list(self, request):
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
tomorrow_date1 = date1 + timedelta(days=1)
tomorrow_date2 = date2 + timedelta(days=1)
filtered_kill_reqs = KillHouseRequest.objects.filter(trash=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
).order_by(
'-create_date').select_related(
'killhouse_user', 'province_request__poultry_request',
'province_request__poultry_request__poultry').only(
'killhouse_user',
'kill_request__slaughter_house',
'kill_request__slaughter_house__name',
'province_request__poultry_request__poultry',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'province_request__poultry_request__send_date',
'province_request__poultry_request__hatching__date',
'ware_house_accepted_real_weight',
'ware_house_accepted_real_quantity',
'killhouse_user__kill_house_operator__user__city__name')
kill_free_info = KillHouseFreeBarInformation.objects.filter(trash=False, date__date__gte=tomorrow_date1,
date__date__lte=tomorrow_date2).only(
'weight_of_carcasses', 'number_of_carcasses')
kill_request = self.all_kill_request(date1, date2)
general_broadcast_informations = self.general_broadcast_information(tomorrow_date1, tomorrow_date2,
filtered_kill_reqs, kill_free_info)
kill_request_and_broadcasts = self.kill_request_and_broadcast(tomorrow_date1, tomorrow_date2,
filtered_kill_reqs, kill_free_info)
return Response({
"all_kill_request": kill_request,
"general_broadcast_informations": general_broadcast_informations,
"kill_request_and_broadcast": kill_request_and_broadcasts
}
)
class DetailOfKillingDashboardView(viewsets.ViewSet):
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardEnterLoadInformationFilterSet
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date1 = datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date() if 'date2' in request.GET else now
value = request.GET.get('value')
search = request.GET.get('search')
if request.GET.get('type') == 'assignment':
filtered_kill_request = KillHouseRequest.objects.filter(
trash=False,
calculate_status=True,
non_receipt=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, assignment_state_archive='True').order_by(
'-create_date').select_related(
'killhouse_user',
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
else:
filtered_kill_request = KillHouseRequest.objects.filter(
trash=False,
calculate_status=True,
non_receipt=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'-create_date').select_related(
'killhouse_user',
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
user = SystemUserProfile.objects.get(user=request.user)
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(trash=False, user=user)
filtered_kill_request = filtered_kill_request.filter(
province_request__poultry_request__poultry__city_operator=city_operator.unit_name)
elif request.GET['role'] == 'VetFarm':
vet = Vet.objects.filter(user=user, trash=False).last()
if vet:
poultry_set = set()
vet_farms = VetFarm.objects.filter(vet=vet, trash=False)
for vet_farm in vet_farms:
poultry_set.add(vet_farm.poultry)
poultries = list(poultry_set)
filtered_kill_request = filtered_kill_request.filter(
province_request__poultry_request__poultry__in=poultries
)
elif request.GET['role'] in ['CityJahad', 'CityPoultry']:
filtered_kill_request = filtered_kill_request.filter(
province_request__poultry_request__poultry__address__city=user.city)
elif request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
filtered_kill_request = filtered_kill_request.filter(
killhouse_user=kill_house)
elif request.GET['role'] == 'KillHouseVet':
kill_house = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house')
filtered_kill_request = filtered_kill_request.filter(
(Q(killhouse_user__id__in=kill_house) | Q(kill_request__slaughter_house__id__in=kill_house)))
else:
if request.GET.get('without_quarantine_code_state') == 'true':
filtered_kill_request = filtered_kill_request.filter(
clearance_code__isnull=False,
quarantine_quantity__isnull=True,
quarantine_code_state__isnull=True,
)
elif request.GET.get('without_bar_document') == "true":
filtered_kill_request = filtered_kill_request.filter(
assignment_state_archive='True',
bar_document_status__isnull=True,
)
else:
filtered_kill_request = filtered_kill_request
if value and search == 'filter':
if value != 'undefined' and value.strip():
filtered_kill_request = filtered_kill_request.filter(
build_query(self.filterset_class, value)
)
ware_house_bars = filtered_kill_request.filter(ware_house_confirmation=True)
ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[
'total'] or 0
ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[
'total'] or 0
bar_complete_with_kill_house = filtered_kill_request.filter(
assignment_state_archive='True')
accepted_real_wight_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
accepted_real_quantity_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity', 0) or 0
detail_of_killing = DetailOfKillingViewSet()
bars = dict(list(detail_of_killing.get_kill_house_for_detail(filtered_kill_request).items())[3:])
dict1 = {**bars,
'len_complete_with_vet': 0,
'quantity_complete_with_vet': 0,
'weight_complete_with_vet': 0,
'ware_house_bars': len(ware_house_bars),
'ware_house_bars_quantity': ware_house_bars_quantity,
'ware_house_bars_weight': ware_house_bars_weight,
'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len(
ware_house_bars) if ware_house_bars else 0,
'len_complete_with_kill_house': len(bar_complete_with_kill_house),
'quantity_final_kill_house': accepted_real_quantity_final,
'weight_final_kill_house': int(accepted_real_wight_final),
}
return Response(dict1)
class ParentCompanyDetailOfKillingDashboardView(viewsets.ViewSet):
permission_classes = [AllowAny]
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardEnterLoadInformationFilterSet
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date1 = datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date() if 'date2' in request.GET else now
value = request.GET.get('value')
search = request.GET.get('search')
if request.GET.get('type') == 'assignment':
filtered_kill_request = KillHouseRequest.objects.filter(
trash=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, assignment_state_archive='True').order_by(
'-create_date').select_related(
'killhouse_user',
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
else:
filtered_kill_request = KillHouseRequest.objects.filter(
trash=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'-create_date').select_related(
'killhouse_user',
'province_request__poultry_request',
'add_car__driver',
).only('province_request', 'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state', 'vet_accepted_real_quantity',
'vet_accepted_real_weight', 'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date').values(
'province_request',
'province_request__poultry_request',
'province_request__poultry_request__send_date',
'province_kill_request__province_request__poultry_request__Index_weight',
'clearance_code',
'quantity',
'accepted_real_weight',
'accepted_real_quantity',
'vet_state',
'vet_accepted_real_quantity',
'vet_accepted_real_weight',
'quarantine_quantity',
'province_request__poultry_request__hatching__date',
'province_request__poultry_request__send_date'
)
if request.GET.get('without_quarantine_code_state') == 'true':
filtered_kill_request = filtered_kill_request.filter(
clearance_code__isnull=False,
quarantine_quantity__isnull=True,
quarantine_code_state__isnull=True,
)
elif request.GET.get('without_bar_document') == "true":
filtered_kill_request = filtered_kill_request.filter(
assignment_state_archive='True',
bar_document_status__isnull=True,
)
else:
filtered_kill_request = filtered_kill_request
if value and search == 'filter':
if value != 'undefined' and value.strip():
filtered_kill_request = filtered_kill_request.filter(
build_query(self.filterset_class, value)
)
ware_house_bars = filtered_kill_request.filter(ware_house_confirmation=True)
ware_house_bars_quantity = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_quantity'))[
'total'] or 0
ware_house_bars_weight = ware_house_bars.aggregate(total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
ware_house_bars_weight_lose = ware_house_bars.aggregate(total=Sum('weight_loss'))[
'total'] or 0
bar_complete_with_kill_house = filtered_kill_request.filter(
assignment_state_archive='True')
accepted_real_wight_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
accepted_real_quantity_final = bar_complete_with_kill_house.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity', 0) or 0
detail_of_killing = DetailOfKillingViewSet()
bars = dict(list(detail_of_killing.get_kill_house_for_detail(filtered_kill_request).items())[3:])
dict1 = {**bars,
'len_complete_with_vet': 0,
'quantity_complete_with_vet': 0,
'weight_complete_with_vet': 0,
'ware_house_bars': len(ware_house_bars),
'ware_house_bars_quantity': ware_house_bars_quantity,
'ware_house_bars_weight': ware_house_bars_weight,
'ware_house_bars_weight_lose': ware_house_bars_weight_lose / len(
ware_house_bars) if ware_house_bars else 0,
'len_complete_with_kill_house': len(bar_complete_with_kill_house),
'quantity_final_kill_house': accepted_real_quantity_final,
'weight_final_kill_house': int(accepted_real_wight_final),
}
return Response(dict1)
class SlaughterHouseTransactionViewSet(viewsets.ModelViewSet):
queryset = SlaughterHouseTransaction.objects.all()
serializer_class = SlaughterHouseTransactionSerializer
permission_classes = [TokenHasReadWriteScope]
class KillHouseWageDashbordInWeightViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseWageSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if request.GET['role'] == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user)
kill_houses = KillHouse.objects.filter(kill_house_operator=kill_house_operator, out_province=False,
trash=False)
# kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator,out_province=False,trash=False).first()
# serializer = self.serializer_class(kill_house)
else:
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
serializer = self.serializer_class(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class TotalWageInformationExclusiveKillerViewset(viewsets.ModelViewSet):
queryset = KillRequest.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = TotalWageInformationKillHouseExclusiveKillerSerializer
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
kill_house_key = request.GET.get('kill_house_key')
if kill_house_key:
kill_house = KillHouse.objects.filter(key=kill_house_key, trash=False).first()
else:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
serializer = self.serializer_class(kill_house).data
return Response(serializer, status=status.HTTP_200_OK)
class PoultryRequestLetterForProvinceVetViewSet(viewsets.ModelViewSet):
queryset = PoultryRequest.objects.all()
serializer_class = PoultryRequestLetterForProvinceVetSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
if 'order_code' in request.GET:
poultry_request = PoultryRequest.objects.get(order_code=int(request.GET['order_code']), trash=False)
serializer = PoultryRequestLetterForProvinceVetSerializer(poultry_request)
else:
date = 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 = PoultryRequestLetterForProvinceVetSerializer(poultry_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class ProvinceRequestLetterForProvinceViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseLetterForProvinceSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
# user=SystemUserProfile.objects.get(user=request.user,trash=False)
date = datetime.strptime(str(request.GET['date']), '%Y-%m-%d').date()
province_kill_requests = ProvinceKillRequest.objects.filter(kill_request__recive_date__date=date, trash=False,
state__in=('pending', 'accepted'),
return_to_province=False)
kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user', flat=True))
serializer = self.serializer_class(kill_houses, many=True, context={'date': date})
if WageType.objects.filter(en_name='poultry-sell-out-province', status=True).exists():
poultry_requests = PoultryRequest.objects.filter(send_date__date=date, out=True,
out_province_request_cancel=False,
trash=False, state_process='accepted',
province_state='accepted', wage_pay=True) \
.select_related('hatching', 'poultry', 'poultry__address__city', 'poultry__address__province',
'poultry__user') \
.order_by('-send_date')
else:
poultry_requests = PoultryRequest.objects.filter(send_date__date=date, out=True,
out_province_request_cancel=False,
trash=False, state_process='accepted',
province_state='accepted') \
.select_related('hatching', 'poultry', 'poultry__address__city', 'poultry__address__province',
'poultry__user') \
.order_by('-send_date')
poultry_out = PoultryRequestoutProvinceSerializer(poultry_requests, many=True)
dict1 = {
'allocation': serializer.data,
'out_province': poultry_out.data,
}
return Response(dict1, status=status.HTTP_200_OK)
class KillHousetestSerializer:
pass
class KillHouseFortestViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHousetestSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
serializer = self.get_serializer(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class DeleteKillHouseRequest(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.filter(trash=False)
serializer_class = KillHouseRequestSerializer
permission_classes = [TokenHasReadWriteScope]
def destroy(self, request, *args, **kwargs):
kill_house_request = KillHouseRequest.objects.get(trash=False, bar_code=request.GET['bar_code'])
if kill_house_request.assignment_state_archive == 'True':
kill_house_assignment = KillHouseAssignmentInformation.objects.get(kill_house_request=kill_house_request)
kill_house_assignment.trash = True
kill_house_assignment.save()
kill_house_request.trash = True
kill_house_request.save()
update_kill_house_requests(kill_house_request.province_kill_request,
kill_house_request.province_request.poultry_request)
update_province_kill_requests(kill_house_request.province_request.poultry_request.hatching)
poultry_prediction(kill_house_request.province_request.poultry_request.hatching)
if kill_house_request.ware_house_confirmation == True:
product = RolesProducts.objects.filter(trash=False, kill_house=kill_house_request.killhouse_user).first()
kill_house_requests_product_warehousing(product)
return Response({'result': 'Success'}, status=status.HTTP_200_OK)
class DashboardEnterLoadInformationView(viewsets.ViewSet):
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardEnterLoadInformationFilterSet
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date1 = datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date() if 'date2' in request.GET else now
value = request.GET.get('value')
search = request.GET.get('search')
user = SystemUserProfile.objects.get(user=request.user)
kill_house = []
if request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
elif request.GET['role'] == 'KillHouseVet':
kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house')
for kill_house_vet in kill_house_vets:
kill_house.append(kill_house_vet.kill_house)
else:
kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False)
if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user, trash=False)
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,
assignment_state_archive='pending',
non_receipt=False,
trash=False, province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
).order_by('-kill_request__recive_date')
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,
assignment_state_archive='pending',
non_receipt=False,
trash=False, province_request__poultry_request__poultry__address__city=user.city
).order_by('-kill_request__recive_date')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
assignment_state_archive='pending',
non_receipt=False,
trash=False,
).order_by('-kill_request__recive_date')
if value and search == 'filter':
if value != 'undefined' and value.strip():
kill_house_requests = kill_house_requests.filter(
build_query(self.filterset_class, value)
)
first_quantity = kill_house_requests.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
first_weight = kill_house_requests.aggregate(
total_quantity=Sum(F('province_request__poultry_request__Index_weight') * F('quantity'))).get(
'total_quantity') or 0
vet_accepted_real_quantity = kill_house_requests.aggregate(
total_quantity=Sum('vet_accepted_real_quantity')).get(
'total_quantity') or 0
vet_accepted_real_weight = kill_house_requests.aggregate(
total_quantity=Sum('vet_accepted_real_weight')).get(
'total_quantity') or 0
dict1 = {
"lenKillHouseRequest": len(kill_house_requests),
'firstQuantity': first_quantity,
'firstWeight': int(first_weight),
'vetAcceptedRealQuantity': vet_accepted_real_quantity,
'vetAcceptedRealWeight': vet_accepted_real_weight,
}
return Response(dict1)
class DashboardDeleteBarView(viewsets.ViewSet):
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardEnterLoadInformationFilterSet
def list(self, request, *args, **kwargs):
now = datetime.now().date()
date1 = datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date() if 'date2' in request.GET else now
value = request.GET.get('value')
search = request.GET.get('search')
user = SystemUserProfile.objects.get(user=request.user)
kill_house_requests_list = KillHouseRequest.objects.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, trash=True, temporary_trash=False,
temporary_deleted=False).select_related('kill_request')
if request.GET['role'] == 'VetSupervisor':
kill_house_requests_list = kill_house_requests_list.filter(
province_request__poultry_request__poultry__address__province=user.province,
)
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)
kill_house_requests_list = kill_house_requests_list.filter(
province_request__poultry_request__poultry__in=poultries,
).select_related('kill_request')
elif request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user)
kill_house_requests_list = kill_house_requests_list.filter(
province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
).select_related('kill_request')
elif request.GET['role'] in ['CityCommerce', 'CityVet', 'CityJahad', 'CityPoultry']:
kill_house_requests_list = kill_house_requests_list.filter(
province_request__poultry_request__poultry__address__city=user.city,
).select_related('kill_request')
elif request.GET['role'] == 'LiveStockSupport':
kill_house_requests_list = kill_house_requests_list.filter(
province_request__poultry_request__freezing=True,
).select_related('kill_request')
elif request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
kill_house_requests_list = kill_house_requests_list.filter(
(Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house) | Q(killer__in=kill_house)),
province_request__poultry_request__poultry__address__province=user.province,
).select_related('kill_request')
else:
kill_house_requests_list = kill_house_requests_list.filter(
province_request__poultry_request__poultry__address__province=user.province,
).select_related('kill_request')
if value and search == 'filter':
if value != 'undefined' and value.strip():
kill_house_requests_list = kill_house_requests_list.filter(
build_query(self.filterset_class, value)
)
first_quantity = kill_house_requests_list.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
first_weight = kill_house_requests_list.aggregate(
total_quantity=Sum(F('province_request__poultry_request__Index_weight') * F('quantity'))).get(
'total_quantity') or 0
len_has_code = len(kill_house_requests_list.filter(clearance_code__isnull=False))
len_hasnt_code = len(kill_house_requests_list.filter(clearance_code__isnull=True))
kill_house = kill_house_requests_list.values_list('kill_request__kill_house', flat=True).distinct()
dict1 = {
"lenKillHouseRequest": len(kill_house_requests_list),
'firstQuantity': first_quantity,
'firstWeight': int(first_weight),
'lenHasCode': len_has_code,
'lenHasntCode': len_hasnt_code,
'lenKillHouse': len(kill_house),
}
return Response(dict1)
class DahsnoardProvinceKillRequestViewSet(viewsets.ModelViewSet):
queryset = ProvinceKillRequest.objects.all()
serializer_class = ProvinceKillRequestSerializer
permission_classes = [TokenHasReadWriteScope]
filterset_class = ProvinceKillRequestNewFilterSet
# تابع مربوط به نمایش تخصیصات به کشتارگاها توسط استان
def list(self, request, *args, **kwargs):
now = datetime.now().date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = datetime.strptime(str(request.GET['date1']),
'%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']),
'%Y-%m-%d').date() if 'date2' in request.GET else now
if request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user,
trash=False)
trash = True if 'deleted_object' in request.GET else False
province_kill_requests = ProvinceKillRequest.objects.filter(Q(killhouse_user__in=kill_house) | Q(
kill_request__slaughter_house__in=kill_house),
trash=trash,
delete_message__isnull=False if trash else True,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
temporary_trash=False, temporary_deleted=False,
).select_related(
'province_request__poultry_request').order_by(
'province_request__city_request_Poultry__poultry_request__send_date')
else:
trash = True if 'deleted_object' in request.GET else False
province_kill_requests = ProvinceKillRequest.objects.filter(
province_request__city_request_Poultry__poultry_request__poultry__user__province=user.province,
trash=trash,
delete_message__isnull=False if trash else True,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, temporary_trash=False, temporary_deleted=False,
).select_related(
'province_request__poultry_request__poultry',
'province_request__city_request_Poultry__poultry_request__poultry__user',
'province_request__city_request_Poultry__poultry_request__poultry__user__city',
'kill_request__kill_house',
'kill_request__kill_house__kill_house_operator__user',
'kill_request__kill_house__system_address__city'
).order_by('province_request__poultry_request__send_date')
if 'allocated_car_state' in request.GET:
province_kill_requests = province_kill_requests.filter(first_car_allocated_quantity=0)
value = request.GET.get('value')
search = request.GET.get('filter')
if value and search == 'search':
if value != 'undefined' and value.strip():
province_kill_requests = province_kill_requests.filter(
build_query(self.filterset_class, value)
)
kill_requests = KillHouseRequest.objects.filter(province_kill_request__in=province_kill_requests, trash=False)
accepted_province_kill_requests = province_kill_requests.filter(state='accepted')
pending_province_kill_requests = province_kill_requests.filter(state='pending')
rejected_province_kill_requests = province_kill_requests.filter(state='rejected')
quantity = province_kill_requests.aggregate(
total_quantity=Sum('total_killed_quantity')).get(
'total_quantity') or 0
weight = province_kill_requests.aggregate(
total_quantity=Sum('total_killed_weight')).get(
'total_quantity') or 0
accepted_quantity = accepted_province_kill_requests.aggregate(
total_quantity=Sum('total_killed_quantity')).get(
'total_quantity') or 0
pending_quantity = pending_province_kill_requests.aggregate(
total_quantity=Sum('total_killed_quantity')).get(
'total_quantity') or 0
rejected_quantity = rejected_province_kill_requests.aggregate(
total_quantity=Sum('total_killed_quantity')).get(
'total_quantity') or 0
has_car = province_kill_requests.filter(first_car_allocated_quantity__gt=0)
has_car_quantity = has_car.aggregate(
total_quantity=Sum('total_killed_quantity')).get(
'total_quantity') or 0
has_car_weight = has_car.aggregate(
total_quantity=Sum('total_killed_weight')).get(
'total_quantity') or 0
hasnt_car = province_kill_requests.filter(first_car_allocated_quantity=0)
hasnt_car_quantity = hasnt_car.aggregate(
total_quantity=Sum('total_killed_quantity')).get(
'total_quantity') or 0
hasnt_car_weight = hasnt_car.aggregate(
total_quantity=Sum('total_killed_weight')).get(
'total_quantity') or 0
real_quantity = kill_requests.aggregate(
total_quantity=Sum('accepted_real_quantity')).get(
'total_quantity') or 0
real_weight = kill_requests.aggregate(
total_quantity=Sum('accepted_real_weight')).get(
'total_quantity') or 0
internal_dict_infos = {
"lenProvinceRequest": len(province_kill_requests),
"quantity": quantity,
"weight": int(weight),
"acceptedProvinceKillRequests": len(accepted_province_kill_requests),
"acceptedProvinceKillRequestsQuantity": accepted_quantity,
"pendingProvinceKillRequests": len(pending_province_kill_requests),
"pendingProvinceKillRequestsQuantity": pending_quantity,
"rejectedProvinceKillRequests": len(rejected_province_kill_requests),
"rejectedProvinceKillRequestsQuantity": rejected_quantity,
"lenHasCar": len(has_car),
"hasCarQuantity": has_car_quantity,
"hasCarWeight": has_car_weight,
"lenKillRequests": len(kill_requests),
"realQuantity": real_quantity,
"realWeight": real_weight,
"lenHasntCar": len(hasnt_car),
"hasntCarQuantity": hasnt_car_quantity,
"hasntCarWeight": hasnt_car_weight,
}
return Response(internal_dict_infos, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.data['role']
request.data.pop('role')
if 'type' in request.data.keys():
if request.data['type'] == 'archive':
user_fullname = user.fullname
date = str(datetime.now())
archive_province_kill_request_wage_threading = threading.Thread(
target=provincearchiveprovincekillrequestforwage,
args=(
request.data['province_kill_request_list'], request.data['message'], role, user_fullname, date
))
archive_province_kill_request_wage_threading.start()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
elif request.data['type'] == 'return_archive':
user_fullname = user.fullname
date = str(datetime.now().date())
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'])
province_kill_request.archive_by_province = False
if 'return_archive_message' in request.data.keys():
province_kill_request.return_archive_message = request.data['return_archive_message']
province_kill_request.returner = {
"fullname": user_fullname,
"date": date,
"role": role
}
province_kill_request.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
else:
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'])
if province_kill_request.prev_total_amount == None:
province_kill_request.prev_total_amount = province_kill_request.total_amount
province_kill_request.total_amount_editor = {
"role": role,
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now())
}
province_kill_request.save()
serializer = self.serializer_class(province_kill_request)
serializer.update(instance=province_kill_request, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'delete_allocation' in request.GET:
province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'],
trash=False)
if province_kill_request.quantity != province_kill_request.main_quantity:
return Response({"result": "برای تخصیص ماشین ثبت شده امکان حذف وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key,
trash=False)
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= province_kill_request.total_killed_weight
# hatching.free_killed_quantity -= int(province_kill_request.main_quantity * poultry_request.Index_weight)
hatching.free_quantity -= province_kill_request.total_killed_quantity
# hatching.free_quantity -= province_kill_request.main_quantity
else:
hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight
# hatching.governmental_killed_quantity -= int(
# province_kill_request.main_quantity * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_request.total_killed_quantity
# hatching.governmental_quantity -= province_kill_request.main_quantity
# hatching.killed_quantity -= province_kill_request.main_quantity
hatching.save()
if poultry_request.remain_quantity > 0:
# province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity
poultry_request.save()
else:
# province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity
poultry_request.save()
# poultry_request.quantity -= province_kill_request.quantity
# poultry_request.first_quantity -= province_kill_request.quantity
# poultry_request.previous_quantity -= province_kill_request.quantity
# poultry_request.save()
# if poultry_request.quantity == 0:
# poultry_request.trash = True
# poultry_request.save()
# hatching.left_over += province_kill_request.quantity
# hatching.state = 'pending'
# hatching.allow_hatching = 'pending'
# hatching.save()
kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
kill_request.remain_quantity += province_kill_request.main_quantity
kill_request.save()
province_kill_request.delete_message = request.GET['message']
province_kill_request.trash = True
province_kill_request.save()
return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK)
elif 'return_allocation_quantity' in request.GET:
province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'],
trash=False)
if province_kill_request.quantity == 0:
return Response({"result": "باقی مانده تخصیص صفر است امکان بازگشت تعداد وجود ندارد"},
status=status.HTTP_403_FORBIDDEN)
amount = province_kill_request.quantity
poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key,
trash=False)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
if province_kill_request.main_quantity - province_kill_request.quantity == 0:
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity
poultry_request.save()
# kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
# kill_request.remain_quantity += province_kill_request.main_quantity
# kill_request.save()
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= province_kill_request.total_killed_weight
# hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.free_quantity -= province_kill_request.total_killed_quantity
# hatching.free_quantity -= amount
else:
hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight
# hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_request.total_killed_quantity
# hatching.governmental_quantity -= amount
# hatching.killed_quantity -= amount
hatching.save()
# province_kill_request.trash = True
province_kill_request.quantity = 0
province_kill_request.total_killed_quantity = 0
province_kill_request.total_killed_weight = 0
province_kill_request.return_to_province = True
province_kill_request.save()
else:
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
province_check.quantity += province_kill_request.main_quantity - province_kill_request.quantity
province_check.save()
poultry_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity
poultry_request.save()
# kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
# kill_request.remain_quantity += province_kill_request.main_quantity - province_kill_request.quantity
# kill_request.save()
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= int((
province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight)
# hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.free_quantity -= province_kill_request.total_killed_quantity
# hatching.free_quantity -= amount
else:
hatching.governmental_killed_quantity -= int((
province_kill_request.main_quantity - province_kill_request.quantity) * poultry_request.Index_weight)
# hatching.governmental_killed_quantity -= int(amount * poultry_request.Index_weight)
hatching.governmental_quantity -= province_kill_request.main_quantity - province_kill_request.quantity
# hatching.governmental_quantity -= amount
# hatching.killed_quantity -= amount
hatching.save()
province_kill_request.main_quantity = province_kill_request.main_quantity - province_kill_request.quantity
province_kill_request.quantity = 0
province_kill_request.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
queryset = ProvinceKillRequest.objects.get(key=request.GET['key'])
poultry_request = PoultryRequest.objects.get(key=queryset.province_request.poultry_request.key)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
check = KillHouseCheckRequest.objects.filter(province_kill_request=queryset, state='accepted')
if check.count() > 0:
return Response({"result": "can not delete"}, status=status.HTTP_403_FORBIDDEN)
province = ProvinceCheckOperatorRequest.objects.get(key=queryset.province_request.key)
province.quantity += queryset.quantity
province.save()
kill_request = KillRequest.objects.get(key=queryset.kill_request.key)
kill_request.remain_quantity += queryset.quantity
kill_request.save()
# queryset.delete()
poultry_request.remain_quantity += queryset.quantity
poultry_request.save()
if poultry_request.export == True:
hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
hatching.export_killed_quantity -= int(request.data['quantity'])
elif poultry_request.free_sale_in_province == True:
hatching.free_killed_quantity -= queryset.total_killed_weight
# hatching.free_killed_quantity -= int(queryset.quantity * poultry_request.Index_weight)
hatching.free_quantity -= queryset.total_killed_quantity
else:
hatching.governmental_killed_quantity -= queryset.total_killed_weight
# hatching.governmental_killed_quantity -= int(
# queryset.quantity * poultry_request.Index_weight)
hatching.governmental_quantity -= queryset.total_killed_quantity
# hatching.killed_quantity -= queryset.total_killed_quantity
hatching.save()
queryset.delete()
return Response(status=status.HTTP_200_OK)
class DashboardKillHouseFreeBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeBarInformation.objects.all()
serializer_class = KillHouseFreeBarInformationSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardKillHouseFreeBarInformationFilterSet
def list(self, request, *args, **kwargs):
value = request.GET.get('value')
search = request.GET.get('search')
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
if date1:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
type = request.GET['type']
if request.GET['role'] in ['KillHouse', 'KillHouseVet']:
if request.GET['role'] == 'KillHouse':
kill_houses = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
else:
kill_house_ids = KillHouseVet.objects.filter(vet__user=user, trash=False).values_list('kill_house',
flat=True)
kill_houses = KillHouse.objects.filter(id__in=kill_house_ids, trash=False)
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
Q(kill_house__in=kill_houses) | Q(exclusive_killer__in=kill_houses) | Q(public_killer__in=kill_houses),
buy_type=type,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False).order_by('-date')
else:
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
buy_type=type,
calculate_status=True,
temporary_trash=False,
temporary_deleted=False,
trash=False).order_by('-date')
if date1:
kill_house_free_bar_info = kill_house_free_bar_info.filter(register_date__date__gte=date1,
register_date__date__lte=date2)
if value and search == 'filter':
if value != 'undefined' and value.strip():
kill_house_free_bar_info = kill_house_free_bar_info.filter(
build_query(self.filterset_class, value)
)
quantity = kill_house_free_bar_info.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
live_weight = kill_house_free_bar_info.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
number_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
weight_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
if type == 'live':
quantity = kill_house_free_bar_info.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
live_weight = kill_house_free_bar_info.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
number_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
weight_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0)
entered_quantity = entered_bars.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
entered_live_weight = entered_bars.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
entered_number_of_carcasses = entered_bars.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
entered_weight_of_carcasses = entered_bars.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0)
not_entered_quantity = not_entered_bars.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
not_entered_live_weight = not_entered_bars.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
not_entered_number_of_carcasses = not_entered_bars.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
not_entered_weight_of_carcasses = not_entered_bars.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
result = {
'total_bars': len(kill_house_free_bar_info),
'total_bars_quantity': quantity,
'total_bars_live_Weight': live_weight,
'total_bars_numberOfCarcasses': number_of_carcasses,
'total_bars_weightOfCarcasses': weight_of_carcasses,
'entered_total_bars': len(entered_bars),
'entered_total_bars_quantity': entered_quantity,
'entered_total_bars_live_Weight': entered_live_weight,
'entered_total_bars_numberOfCarcasses': entered_number_of_carcasses,
'entered_total_bars_weightOfCarcasses': entered_weight_of_carcasses,
'not_entered_total_bars': len(not_entered_bars),
'not_entered_total_bars_quantity': not_entered_quantity,
'not_entered_total_bars_live_Weight': not_entered_live_weight,
'not_entered_total_bars_numberOfCarcasses': not_entered_number_of_carcasses,
'not_entered_total_bars_weightOfCarcasses': not_entered_weight_of_carcasses,
}
else:
result = {
'total_bars': len(kill_house_free_bar_info),
'total_bars_quantity': quantity,
'total_bars_live_Weight': live_weight,
'total_bars_numberOfCarcasses': number_of_carcasses,
'total_bars_weightOfCarcasses': weight_of_carcasses,
}
return Response(result, status=status.HTTP_200_OK)
class ParentCopmanyDashboardKillHouseFreeBarInformationViewSet(viewsets.ModelViewSet):
queryset = KillHouseFreeBarInformation.objects.all()
serializer_class = KillHouseFreeBarInformationSerializer
permission_classes = [AllowAny]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardKillHouseFreeBarInformationFilterSet
def list(self, request, *args, **kwargs):
type = request.GET['type']
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
buy_type=type,
trash=False).order_by('-date')
quantity = kill_house_free_bar_info.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
live_weight = kill_house_free_bar_info.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
number_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
weight_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
if type == 'live':
quantity = kill_house_free_bar_info.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
live_weight = kill_house_free_bar_info.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
number_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
weight_of_carcasses = kill_house_free_bar_info.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses__gt=0)
entered_quantity = entered_bars.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
entered_live_weight = entered_bars.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
entered_number_of_carcasses = entered_bars.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
entered_weight_of_carcasses = entered_bars.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
not_entered_bars = kill_house_free_bar_info.filter(weight_of_carcasses=0)
not_entered_quantity = not_entered_bars.aggregate(
total_quantity=Sum('quantity')).get(
'total_quantity') or 0
not_entered_live_weight = not_entered_bars.aggregate(
total_quantity=Sum('live_weight')).get(
'total_quantity') or 0
not_entered_number_of_carcasses = not_entered_bars.aggregate(
total_quantity=Sum('number_of_carcasses')).get(
'total_quantity') or 0
not_entered_weight_of_carcasses = not_entered_bars.aggregate(
total_quantity=Sum('weight_of_carcasses')).get(
'total_quantity') or 0
result = {
'total_bars': len(kill_house_free_bar_info),
'total_bars_quantity': quantity,
'total_bars_live_Weight': live_weight,
'total_bars_numberOfCarcasses': number_of_carcasses,
'total_bars_weightOfCarcasses': weight_of_carcasses,
'entered_total_bars': len(entered_bars),
'entered_total_bars_quantity': entered_quantity,
'entered_total_bars_live_Weight': entered_live_weight,
'entered_total_bars_numberOfCarcasses': entered_number_of_carcasses,
'entered_total_bars_weightOfCarcasses': entered_weight_of_carcasses,
'not_entered_total_bars': len(not_entered_bars),
'not_entered_total_bars_quantity': not_entered_quantity,
'not_entered_total_bars_live_Weight': not_entered_live_weight,
'not_entered_total_bars_numberOfCarcasses': not_entered_number_of_carcasses,
'not_entered_total_bars_weightOfCarcasses': not_entered_weight_of_carcasses,
}
else:
result = {
'total_bars': len(kill_house_free_bar_info),
'total_bars_quantity': quantity,
'total_bars_live_Weight': live_weight,
'total_bars_numberOfCarcasses': number_of_carcasses,
'total_bars_weightOfCarcasses': weight_of_carcasses,
}
return Response(result, status=status.HTTP_200_OK)
class DashboardKillRequestViewSet(viewsets.ModelViewSet):
queryset = KillRequest.objects.all()
serializer_class = KillHouseFreeBarInformationSerializer
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = DashboardKillRequestFilterSet
def list(self, request, *args, **kwargs):
value = request.GET.get('value')
search = request.GET.get('search')
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
user = SystemUserProfile.objects.get(user=request.user, trash=False)
querysets = KillRequest.objects.filter(
recive_date__date__gte=date1,
recive_date__date__lte=date2, poultry__isnull=False,
trash=False).order_by(
'recive_date')
if request.GET['role'] == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator=kill_house_operator, trash=False)
querysets = querysets.filter(kill_house__in=kill_house).order_by('recive_date')
elif request.GET['role'] in ['ProvinceOperator', 'SuperAdmin', 'AdminX']:
if 'direct_buying' in request.GET:
querysets = querysets.filter(market=False,
final_accept=True,
direct_buying_state__in=(
'accepted', 'rejected', 'deleted', 'pending'),
export_status=False, trash=False
)
if 'export' in request.GET:
if request.GET['type'] == 'pending':
querysets = querysets.filter(export_status=True,
export_state='pending'
)
else:
querysets = querysets.filter(export_status=True,
export_state__in=(
'accepted', 'rejected', 'deleted'),
)
if value and search == 'filter':
if value != 'undefined' and value.strip():
querysets = querysets.filter(
build_query(self.filterset_class, value)
)
quantity = querysets.aggregate(
total_quantity=Sum('kill_capacity')).get(
'total_quantity') or 0
free_direct_buying_true_quantity = querysets.aggregate(
total_quantity=Sum('kill_capacity', filter=Q(free_direct_buying=True))).get(
'total_quantity') or 0
free_direct_buying_false_quantity = querysets.aggregate(
total_quantity=Sum('kill_capacity', filter=Q(free_direct_buying=False))).get(
'total_quantity') or 0
left_over = querysets.aggregate(
total_quantity=Sum('remain_quantity')).get(
'total_quantity') or 0
amount = querysets.aggregate(
total_quantity=Avg('amount')).get(
'total_quantity') or 0
index_wight = querysets.aggregate(
total_quantity=Avg('Index_weight')).get(
'total_quantity') or 0
dict1 = {
'lenKillRequest': querysets.count(),
'lenKillRequestHasFreeDirectBuying': querysets.filter(free_direct_buying=True).count(),
'lenKillRequestHasntFreeDirectBuying': querysets.filter(free_direct_buying=False).count(),
'quantity': quantity,
'leftOver': left_over,
'remainQuantity': quantity - left_over,
'amount': amount,
'indexWight': index_wight,
'freeDirectBuyingTrueQuantity': free_direct_buying_true_quantity,
'freeDirectBuyingFalseQuantity': free_direct_buying_false_quantity,
}
return Response(dict1, status=status.HTTP_200_OK)
class InputBarsForKillHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForInputBarsSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'province_request__poultry_request__order_code',
'bar_code',
]
def list(self, request, *args, **kwargs):
quota = request.GET.get('quota')
if quota == 'governmental':
quota_filter = {'province_request__poultry_request__free_sale_in_province': False}
elif quota == 'free':
quota_filter = {'province_request__poultry_request__free_sale_in_province': True}
else:
quota_filter = None
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 'date1' in request.GET and request.GET['date1']:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
if request.GET['type'] == 'entered':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
ware_house_confirmation=True, trash=False, calculate_status=True).order_by(
'-kill_request__recive_date')
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
ware_house_confirmation=False, non_receipt=False, trash=False, calculate_status=True).order_by(
'-kill_request__recive_date')
else:
if request.GET['type'] == 'entered':
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
ware_house_confirmation=True, trash=False, calculate_status=True).order_by(
'-kill_request__recive_date')
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
ware_house_confirmation=False, non_receipt=False, trash=False, calculate_status=True).order_by(
'-kill_request__recive_date')
if quota_filter:
kill_house_requests = kill_house_requests.filter(**quota_filter)
if 'search' in request.GET:
kill_house_requests_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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_requests_list = ps.filter()
kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_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(kill_house_requests)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class InputBarsForKillHouseDashboardViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForInputBarsSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
role = request.GET.get('role')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if role in ('Steward', 'Guild'):
guild = Guilds.objects.get(user=user, active=True, trash=False)
if 'date1' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
allocations = StewardAllocation.objects.filter(
Q(to_steward=guild) | Q(to_guilds=guild), date__date__gte=date1, date__date__lte=date2,
trash=False, calculate_status=True, system_registration_code=True)
else:
allocations = StewardAllocation.objects.filter(
Q(to_steward=guild) | Q(to_guilds=guild),
trash=False, calculate_status=True, system_registration_code=True)
entered_allocations = allocations.filter(receiver_state='accepted')
not_entered_allocations = allocations.filter(receiver_state='pending')
rejected_allocations = allocations.filter(receiver_state='rejected')
total_allocations_quantity = allocations.filter(receiver_state__in=('pending', 'accepted')).aggregate(
total=Sum('real_number_of_carcasses'))[
'total'] or 0
total_allocations_weight = allocations.filter(receiver_state__in=('pending', 'accepted')).aggregate(
total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_entered_allocations_quantity = \
entered_allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] or 0
total_entered_allocations_weight = \
entered_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
total_not_entered_allocations_quantity = \
not_entered_allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] or 0
total_not_entered_allocations_weight = \
not_entered_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
total_rejected_allocations_quantity = \
rejected_allocations.aggregate(total=Sum('real_number_of_carcasses'))['total'] or 0
total_rejected_allocations_weight = \
rejected_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
result = {
"total_bars": len(allocations),
"total_bars_quantity": total_allocations_quantity,
"total_bars_weight": total_allocations_weight,
"total_entered_bars": len(entered_allocations),
"total_entered_bars_quantity": total_entered_allocations_quantity,
"total_entered_bars_weight": total_entered_allocations_weight,
"total_not_entered_bars": len(not_entered_allocations),
"total_not_entered_bars_quantity": total_not_entered_allocations_quantity,
"total_not_entered_kill_house_requests_weight": total_not_entered_allocations_weight,
"total_rejected_bars": len(rejected_allocations),
"total_rejected_bars_quantity": total_rejected_allocations_quantity,
"total_rejected_bars_weight": total_rejected_allocations_weight,
}
else:
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related(
'system_address__province').first()
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
trash=False, calculate_status=True).order_by('-kill_request__recive_date')
entered_kill_house_requests = kill_house_requests.filter(ware_house_confirmation=True)
not_entered_kill_house_requests = kill_house_requests.filter(ware_house_confirmation=False)
total_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
total_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
total_entered_kill_house_requests_quantity = \
entered_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0
total_entered_kill_house_requests_weight = \
entered_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
total_entered_kill_house_requests_carcasses = \
entered_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_quantity'))['total'] or 0
total_entered_kill_house_requests_carcasses_weight = \
entered_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))['total'] or 0
total_not_entered_kill_house_requests_quantity = \
not_entered_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))['total'] or 0
total_not_entered_kill_house_requests_weight = \
not_entered_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
result = {
"total_bars": len(kill_house_requests),
"total_bars_quantity": total_kill_house_requests_quantity,
"total_bars_weight": total_kill_house_requests_weight,
"total_entered_bars": len(entered_kill_house_requests),
"total_entered_bars_quantity": total_entered_kill_house_requests_quantity,
"total_entered_bars_weight": total_entered_kill_house_requests_weight,
"total_entered_bars_carcasses": total_entered_kill_house_requests_carcasses,
"total_entered_bars_carcasses_weight": total_entered_kill_house_requests_carcasses_weight,
"total_not_entered_bars": len(not_entered_kill_house_requests),
"total_not_entered_bars_quantity": total_not_entered_kill_house_requests_quantity,
"total_not_entered_kill_house_requests_weight": total_not_entered_kill_house_requests_weight,
}
return Response(result, status=status.HTTP_200_OK)
class BarDifferenceRequestViewSet(viewsets.ModelViewSet):
queryset = BarDifferenceRequest.objects.all()
serializer_class = BarDifferenceRequestSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = BarDifferenceRequestFilterSet
filterset_fields = [
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__mobile',
'hatching__poultry__user__fullname',
'hatching__poultry__user__mobile'
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
role = request.GET.get('role')
state = request.GET.get('state')
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
filters = {
'trash': False,
}
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related(
'system_address__province').first()
filters['kill_house'] = kill_house
if state == 'pending':
filters['state'] = 'pending'
else:
filters['state__in'] = ('accepted', 'rejected')
if date1:
filters['create_date__date__gte'] = date1
filters['create_date__date__lte'] = date2
bar_requests = BarDifferenceRequest.objects.filter(**filters).order_by('-id')
if 'search' in request.GET:
bar_requests_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=bar_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=bar_requests)
bar_requests_list = ps.filter()
bar_requests = [] if len(bar_requests_list) == 0 else bar_requests_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(bar_requests)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(bar_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def create(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
hatching = PoultryHatching.objects.get(key=request.data['hatching_key'], trash=False)
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'], trash=False)
images = None
acceptor_images = None
request.data.pop('hatching_key')
request.data.pop('kill_house_key')
if 'images' in request.data.keys():
images = request.data['images']
request.data.pop('images')
if 'acceptor_images' in request.data.keys():
acceptor_images = request.data['acceptor_images']
request.data.pop('acceptor_images')
image_list = []
acceptor_image_list = []
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
bar_request = serializer.create(validated_data=request.data)
bar_request.hatching = hatching
bar_request.kill_house = kill_house
bar_request.register_fullname = user.fullname
bar_request.register_mobile = user.mobile
bar_request.weight = int(bar_request.quantity) * bar_request.hatching.poultry.real_killing_ave_weight
if images != None:
for image in images:
image_list.append(send_image_to_server(image))
bar_request.violation_image = image_list
if acceptor_images != None:
for acceptor_image in acceptor_images:
acceptor_image_list.append(send_image_to_server(acceptor_image))
bar_request.acceptor_image = acceptor_image_list
bar_request.save()
send_sms_for_bar_difference_request(kill_house.kill_house_operator.user.mobile, request.data['quantity'],
hatching.poultry.unit_name)
send_ticket_for_bar_difference_request(user, kill_house.kill_house_operator.user, request.data['quantity'],
hatching.poultry.unit_name)
serializer_request = self.serializer_class(bar_request)
return Response(serializer_request.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
def update(self, request, pk=None, *args, **kwargs):
bar_request = BarDifferenceRequest.objects.get(key=request.data['bar_key'])
request.data.pop('bar_key')
if 'kill_house_check' in request.data.keys():
request.data.pop('kill_house_check')
if request.data['state'] == 'accepted':
user = SystemUserProfile.objects.get(user=request.user, trash=False)
bar_request.acceptor_fullname = user.fullname
bar_request.acceptor_mobile = user.mobile
bar_request.acceptor_date = datetime.now()
# bar_request.weight = bar_request.quantity * bar_request.hatching.poultry.real_killing_ave_weight
bar_request.hatching.bar_difference_request_quantity += bar_request.quantity
bar_request.hatching.bar_difference_request_weight += bar_request.weight
bar_request.hatching.save()
bar_request.save()
if 'images' in request.data.keys():
images = request.data['images']
request.data.pop('images')
image_list = []
if images != None:
for image in images:
image_list.append(send_image_to_server(image))
bar_request.violation_image = image_list
if 'acceptor_images' in request.data.keys():
acceptor_images = request.data['acceptor_images']
request.data.pop('acceptor_images')
acceptor_images_list = []
if acceptor_images != None:
for acceptor_image in acceptor_images:
acceptor_images_list.append(send_image_to_server(acceptor_image))
bar_request.acceptor_image = acceptor_images_list
serializer = self.serializer_class(bar_request)
serializer.update(instance=bar_request, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
bar_request = BarDifferenceRequest.objects.get(key=request.GET['bar_key'], trash=False)
if bar_request.state == 'accepted':
bar_request.hatching.bar_difference_request_quantity -= bar_request.quantity
bar_request.hatching.bar_difference_request_weight -= bar_request.weight
bar_request.hatching.save()
bar_request.trash = True
bar_request.save()
return Response({"result": "با موفقیت حذف شد."},
status=status.HTTP_200_OK)
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def get_hatching_kill_ingo(request):
hatching = PoultryHatching.objects.get(key=request.GET['hatching_key'])
kill_house = KillHouse.objects.get(key=request.GET['kill_house_key'])
total_quantity = 0
total_weight = 0
Province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
state__in=('pending', 'accepted'),
return_to_province=False,
province_request__poultry_request__hatching=hatching)
first_total_quantity = \
Province_kill_requests.aggregate(total=Sum('main_quantity'))[
'total'] or 0
total_quantity = \
Province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
'total'] or 0
total_weight = \
Province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
'total'] or 0
difference_quantity = first_total_quantity - total_quantity
# kill_house_requests = KillHouseRequest.objects.filter(Q(killhouse_user=obj.kill_house) | Q(killer=obj.kill_house),trash=False,
# province_request__poultry_request__hatching=obj.hatching)
#
#
# total_quantity +=\
# kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
# 'total'] or 0
# total_weight +=\
# kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
# 'total'] or 0
result = {
"first_total_quantity": first_total_quantity,
"total_quantity": total_quantity,
"difference_quantity": difference_quantity,
"total_weight": total_weight,
}
return Response(result,
status=status.HTTP_200_OK)
@api_view(["GET"])
@csrf_exempt
@permission_classes([TokenHasReadWriteScope])
def dashboard_monitoring_bar_and_killing(request):
now = datetime.now().date()
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() if 'date1' in request.GET else now
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() if 'date1' in request.GET else now
kill_house_free_bar = KillHouseFreeBarInformation.objects.filter(Q(date__date__gte=date1,
date__date__lte=date2,
buy_type='carcass') | Q(
create_date__date__gte=date1, create_date__date__lte=date2, buy_type='live'),
trash=False,
archive_wage=False,
).only(
'quantity',
'live_weight',
'number_of_carcasses',
'weight_of_carcasses',
'send_date',
'type',
'out'
)
kill_house_free_bar_aggregates = kill_house_free_bar.aggregate(
total_quantity_live=Sum('quantity', filter=Q(buy_type='live')),
total_weight_live=Sum('live_weight', filter=Q(buy_type='live')),
total_count=Count('id', filter=Q(buy_type='live')),
total_weight=Sum('weight_of_carcasses', filter=Q(buy_type='live')),
total_count_carcass=Count('id', filter=Q(buy_type='carcass')),
total_weight_carcass=Sum('weight_of_carcasses', filter=Q(buy_type='carcass')),
total_quantity_carcass=Sum('number_of_carcasses', filter=Q(buy_type='carcass')),
)
if kill_house_free_bar_aggregates['total_quantity_live'] != 0:
ratio = round(
((kill_house_free_bar_aggregates['total_weight_live'] or 0) / (
kill_house_free_bar_aggregates['total_quantity_live']
or 0))
, 1) if (kill_house_free_bar_aggregates['total_quantity_live'] or 0) > 0 else 0
else:
ratio = 0
province_kill_request = ProvinceKillRequest.objects.filter(state__in=('pending', 'accepted'),
wage_pay=False,
archive_wage=False,
return_to_province=False,
trash=False,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2). \
select_related('province_request__poultry_request').only(
'total_killed_quantity',
'province_request__poultry_request__Index_weight',
)
province_kill_request_aggregates = province_kill_request.aggregate(
total_count=Count('id', filter=Q(first_car_allocated_quantity=0)),
total_quantity=Sum('total_killed_quantity', filter=Q(first_car_allocated_quantity=0)),
total_index_weight=Avg('province_request__poultry_request__Index_weight',
filter=Q(first_car_allocated_quantity=0)),
total_count_new=Count('id'),
total_quantity_new=Sum('total_killed_quantity'),
total_weight_new=Sum('total_killed_weight'),
total_index_weight_new=Avg('province_request__poultry_request__Index_weight'),
)
poultry_request = PoultryRequest.objects.filter(
trash=False,
state_process__in=('pending', 'accepted'),
province_state__in=('pending', 'accepted'),
out_province_request_cancel=False,
temporary_trash=False,
temporary_deleted=False, send_date__date__gte=date1,
send_date__date__lte=date2
).only(
'quantity',
'Index_weight',
).annotate(
item_weight=F('Index_weight') * F('quantity')
)
poultry_request_aggregates = poultry_request.aggregate(
total_count=Count('id', filter=Q(out=True)),
total_quantity=Sum('quantity', filter=Q(out=True)),
total_ave_weight=Avg('Index_weight', filter=Q(out=True)),
total_weight=Sum('item_weight', filter=Q(out=True)),
total_count_killing=Count('id'),
total_quantity_killing=Sum('quantity'),
total_ave_weight_killing=Avg('Index_weight'),
total_weight_killing=Sum('item_weight')
)
kill_house_request = KillHouseRequest.objects.filter(
trash=False,
temporary_trash=False,
temporary_deleted=False, kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2
).select_related('province_kill_request__province_request__poultry_request__Index_weight').only(
'quantity',
'province_kill_request__province_request__poultry_request__Index_weight',
'accepted_real_weight',
'accepted_real_quantity',
)
kill_house_request_aggregates = kill_house_request.aggregate(
total_count=Count('id'),
total_quantity=Sum('accepted_real_quantity'),
total_quantity_has_quarantine=Sum('accepted_real_quantity', filter=Q(quarantine_quantity__gt=0)),
total_count_has_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)),
total_weight=Sum('accepted_real_weight'),
total_ave_weight=Avg('province_kill_request__province_request__poultry_request__Index_weight'),
total_ave_age=Avg('province_kill_request__province_request__poultry_request__hatching__chicken_age'),
total_quarantine=Count('id', filter=Q(quarantine_quantity__gt=0)),
total_quarantine_quantity=Sum('quarantine_quantity', filter=Q(quarantine_quantity__gt=0)),
total_quarantine_discharge_confirmation=Count('id', filter=Q(quarantine_quantity__gt=0,
assignment_state_archive='True')),
total_quarantine_discharge_confirmation_quantity=Sum('accepted_real_quantity',
filter=Q(quarantine_quantity__gt=0,
assignment_state_archive='True')),
)
province_request_count = province_kill_request_aggregates['total_count_new'] or 0
province_request_quantity = province_kill_request_aggregates['total_quantity_new'] or 0
province_request_weight = province_kill_request_aggregates['total_weight_new'] or 0
total_free_sell_count = kill_house_free_bar_aggregates['total_count'] or 0
total_free_sell_quantity = kill_house_free_bar_aggregates['total_quantity_live'] or 0
total_free_sell_weight = kill_house_free_bar_aggregates['total_weight_live'] or 0
avgWeight = round(
(province_request_weight + total_free_sell_weight) / (province_request_quantity + total_free_sell_quantity),
1) if (province_request_quantity + total_free_sell_quantity) > 0 else 0
result_dict = {
'freeLiveBar': {
'count': kill_house_free_bar_aggregates['total_count'] or 0,
'quantity': kill_house_free_bar_aggregates['total_quantity_live'] or 0,
'weight': kill_house_free_bar_aggregates['total_weight_live'] or 0,
'weightCarcass': kill_house_free_bar_aggregates['total_weight_carcass'] or 0,
'avgWeight': ratio,
},
'provinceKillRequestWithoutBar': {
'count': province_kill_request_aggregates['total_count'] or 0,
'quantity': province_kill_request_aggregates['total_quantity'] or 0,
'indexWeight': round((province_kill_request_aggregates['total_index_weight'] or 0), 1),
},
'outLiveBar': {
'count': poultry_request_aggregates['total_count'] or 0,
'quantity': poultry_request_aggregates['total_quantity'] or 0,
'weight': poultry_request_aggregates['total_weight'] or 0,
'avgWeight': round((poultry_request_aggregates['total_ave_weight'] or 0), 1),
},
'bar': {
'count': kill_house_request_aggregates['total_count'] or 0,
'count_has_quarantine': kill_house_request_aggregates['total_count_has_quarantine'] or 0,
'quantity': kill_house_request_aggregates['total_quantity'] or 0,
'quantity_has_quarantine': kill_house_request_aggregates['total_quantity_has_quarantine'] or 0,
'weight': kill_house_request_aggregates['total_weight'] or 0,
'avgWeight': round((kill_house_request_aggregates['total_ave_weight'] or 0), 1),
'avgAge': int(kill_house_request_aggregates['total_ave_age'] or 0),
'total_quarantine': kill_house_request_aggregates['total_quarantine'] or 0,
'total_quarantine_quantity': kill_house_request_aggregates['total_quarantine_quantity'] or 0,
'total_quarantine_discharge_confirmation': kill_house_request_aggregates[
'total_quarantine_discharge_confirmation'] or 0,
'total_quarantine_discharge_confirmation_quantity': kill_house_request_aggregates[
'total_quarantine_discharge_confirmation_quantity'] or 0,
},
'killingInfo': {
'count': province_request_count + total_free_sell_count,
'quantity': province_request_quantity + total_free_sell_quantity,
'weight': province_request_weight + total_free_sell_weight,
'avgWeight': avgWeight,
},
'buyFreeCarcasses': {
'count': kill_house_free_bar_aggregates['total_count_carcass'] or 0,
'quantity': kill_house_free_bar_aggregates['total_quantity_carcass'] or 0,
'weight': kill_house_free_bar_aggregates['total_weight_carcass'] or 0,
}
}
return Response(result_dict, status=status.HTTP_200_OK)
@api_view(["GET"])
@csrf_exempt
@permission_classes([TokenHasReadWriteScope])
def dashboarad_bar_for_kill_house(request):
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'province_request__poultry_request__order_code',
'bar_code',
]
user = SystemUserProfile.objects.get(user=request.user)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user=kill_house) | Q(
kill_request__slaughter_house=kill_house) | Q(killer=kill_house)),
(Q(trash=False) | Q(trash=True, clearance_code__isnull=False, temporary_trash=False,
temporary_deleted=False)),
province_request__poultry_request__poultry__address__province=user.province,
).select_related('kill_request')
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house_requests = kill_house_requests.filter(
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2)
if 'search' in request.GET:
kill_house_request_list = []
if request.GET['search'] == 'filter':
if request.GET['value'] != "" and request.GET['value'] != 'undefined':
for item in filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (filterset_class(
data=query,
queryset=kill_house_requests
)
).filter():
ps = filterset_class(data=query, queryset=kill_house_requests)
kill_house_request_list = ps.filter()
kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_request_list
kill_house_requests_aggregate = kill_house_requests.aggregate(
first_quantity=Sum('quantity'),
first_weight=Sum('quantity') * Avg('province_request__poultry_request__Index_weight'),
first_index_weight=Avg('province_request__poultry_request__Index_weight'),
accepted_real_quantity=Sum('accepted_real_quantity'),
accepted_real_weight=Sum('accepted_real_weight'),
assignment_state_archive_pending=Count('id', filter=Q(assignment_state_archive='pending')),
assignment_state_archive_accepted=Count('id', filter=Q(assignment_state_archive='accepted')),
clearance_code_count=Count('id', filter=Q(clearance_code__isnull=False)),
)
result_dict = {
'count': kill_house_requests.count(),
'firstQuantity': kill_house_requests_aggregate['first_quantity'] or 0,
'firstWeight': int(kill_house_requests_aggregate['first_weight'] or 0),
'firstIndexWeight': round((kill_house_requests_aggregate['first_index_weight'] or 0), 1),
'acceptedRealQuantity': kill_house_requests_aggregate['accepted_real_quantity'] or 0,
'acceptedRealWeight': int(kill_house_requests_aggregate['accepted_real_weight'] or 0),
'finalIndexWeight': round((kill_house_requests_aggregate['accepted_real_weight'] or 0) /
(kill_house_requests_aggregate['accepted_real_quantity'] or 0), 1)
if (kill_house_requests_aggregate['accepted_real_quantity'] or 0) > 0 else 0,
'assignmentStateArchivePending': kill_house_requests_aggregate['assignment_state_archive_pending'] or 0,
'assignmentStateArchiveAccepted': kill_house_requests_aggregate['assignment_state_archive_accepted'] or 0,
'clearanceCodeCount': kill_house_requests_aggregate['clearance_code_count'] or 0,
}
return Response(result_dict, status=status.HTTP_200_OK)
@api_view(["GET"])
@csrf_exempt
@permission_classes([TokenHasReadWriteScope])
def dashboard_bar_difference_request(request):
filterset_class = BarDifferenceRequestFilterSet
filterset_fields = [
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__mobile',
'hatching__poultry__user__fullname',
'hatching__poultry__user__mobile'
]
user = SystemUserProfile.objects.get(user=request.user, trash=False)
# if request.GET['role'] == 'KillHouse':
# kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related(
# 'system_address__province').first()
# if request.GET['state'] == 'pending':
# bar_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False,
# state='pending').order_by('id')
# else:
# bar_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False,
# state__in=('accepted', 'rejected')).order_by('id')
# else:
# if request.GET['state'] == 'pending':
# bar_requests = BarDifferenceRequest.objects.filter(trash=False, state='pending').order_by('id')
# else:
# bar_requests = BarDifferenceRequest.objects.filter(trash=False,
# state__in=('accepted', 'rejected')).order_by('id')
role = request.GET.get('role')
state = request.GET.get('state')
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
filters = {
'trash': False,
}
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).select_related(
'system_address__province').first()
filters['kill_house'] = kill_house
if state == 'pending':
filters['state'] = 'pending'
else:
filters['state__in'] = ('accepted', 'rejected')
if date1:
filters['create_date__date__gte'] = date1
filters['create_date__date__lte'] = date2
bar_requests = BarDifferenceRequest.objects.filter(**filters).order_by('-id')
if 'search' in request.GET:
bar_requests_list = []
if request.GET['search'] == 'filter':
if request.GET['value'] != "" and request.GET['value'] != 'undefined':
for item in filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (filterset_class(
data=query,
queryset=bar_requests
)
).filter():
ps = filterset_class(data=query, queryset=bar_requests)
bar_requests_list = ps.filter()
bar_requests = [] if len(bar_requests_list) == 0 else bar_requests_list
serializer = BarDifferenceRequestSerializer(bar_requests, many=True)
bar_info_list = [item['bar_info'] for item in serializer.data]
difference_quantity = sum(item["first_total_quantity"] for item in bar_info_list) - \
sum(item["total_quantity"] for item in bar_info_list)
bar_requests_aggregate = bar_requests.aggregate(
count=Count('id'),
weight=Sum('weight'),
quantity=Sum('quantity'),
)
result_dict = {
'count': bar_requests_aggregate['count'] or 0,
'weight': bar_requests_aggregate['weight'] or 0,
'quantity': bar_requests_aggregate['quantity'] or 0,
"firstTotalQuantity": sum(item["first_total_quantity"] for item in bar_info_list),
"totalQuantity": sum(item["total_quantity"] for item in bar_info_list),
"differenceQuantity": difference_quantity,
"totalWeight": sum(item["total_weight"] for item in bar_info_list),
}
return Response(result_dict, status=status.HTTP_200_OK)
class KillHousePerformanceDashboardViewSet(APIView):
permission_classes = [TokenHasReadWriteScope]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
'kill_house', flat=True)
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).exclude(id__in=kill_house_ids).order_by(
'id')
serializer = KillHouseForPerformanceDashboardSerializer(kill_houses, many=True,
context={'date1': date1, 'date2': date2, })
return Response(serializer.data, status=status.HTTP_200_OK)
class NonReceiptKillHouseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestForBarManagementSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'province_request__poultry_request__order_code',
'bar_code',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house = []
kill_house_requests_list = []
if request.GET['role'] == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False)
elif request.GET['role'] == 'KillHouseVet':
kill_house_vets = KillHouseVet.objects.filter(vet__user=user, trash=False).select_related('kill_house')
for kill_house_vet in kill_house_vets:
kill_house.append(kill_house_vet.kill_house)
else:
kill_house = KillHouse.objects.filter(system_address__province=user.province, trash=False)
if request.GET['role'] in ['CityOperator', 'CityJahad', 'CityPoultry']:
if request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user, trash=False)
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,
main_non_receipt=True,
non_receipt=True,
province_request__poultry_request__poultry__city_operator=city_operator.unit_name,
).order_by('-kill_request__recive_date')
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,
main_non_receipt=True,
non_receipt=True,
province_request__poultry_request__poultry__address__city=user.city
).order_by('-kill_request__recive_date')
else:
kill_house_requests = KillHouseRequest.objects.filter(
(Q(killhouse_user__in=kill_house) | Q(kill_request__slaughter_house__in=kill_house) | Q(
killer__in=kill_house)),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2,
main_non_receipt=True,
non_receipt=True
).order_by('-kill_request__recive_date')
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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_requests_list = ps.filter()
kill_house_requests = [] if len(kill_house_requests_list) == 0 else kill_house_requests_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(kill_house_requests)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_house_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now()
role = request.data.get('role')
message = request.data.get('message')
state = request.data.get('state')
key = request.data.get('key')
kill_house_request = KillHouseRequest.objects.get(key=key)
if kill_house_request.assignment_state_archive == 'True':
return Response({"result": "به دلیل وارد کردن اطلاعات بار امکان ثبت عدم وصول وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
kill_house_request.non_receipt_state = state
kill_house_request.message = message
kill_house_request.bar_remover = {
"full_name": user.fullname,
"role": role,
"mobile": user.mobile,
"date": str(now)
}
kill_house_request.trash = True if state == 'accepted' else False
kill_house_request.save()
if state == 'accepted':
update_kill_house_requests(kill_house_request.province_kill_request,
kill_house_request.province_request.poultry_request)
update_province_kill_requests(kill_house_request.province_request.poultry_request.hatching)
return Response({"result": "با موفقیت انجام شد."}, status=status.HTTP_200_OK)
class ReturnNonReceiptKillHouseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseRequestForBarManagementSerializer
def update(self, request, *args, **kwargs):
key = request.data.get('key')
kill_house_request = KillHouseRequest.objects.get(key=key)
trash = kill_house_request.trash
if kill_house_request.non_receipt_return:
return Response({"result": "عدم وصول برای این بار قبلا ثبت و لغو گردیده!"})
kill_house_request.trash = False
kill_house_request.non_receipt = request.data['non_receipt']
kill_house_request.non_receipt_return = request.data['non_receipt_return']
kill_house_request.non_receipt_return_message = request.data['non_receipt_return_message']
kill_house_request.save()
if trash:
update_kill_house_requests(kill_house_request.province_kill_request,
kill_house_request.province_request.poultry_request)
update_province_kill_requests(kill_house_request.province_request.poultry_request.hatching)
return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_200_OK)
class DirectBuyingPaymentViewSet(viewsets.ModelViewSet):
queryset = DirectBuyingPayment.objects.all()
serializer_class = DirectBuyingPaymentSerializer
permission_classes = [TokenHasReadWriteScope]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = DirectBuyingPaymentFilterSet
filterset_fields = [
'province_kill_request__kill_request__kill_house__name',
'province_kill_request__kill_request__kill_house__kill_house_operator__user__fullname',
'province_kill_request__kill_request__kill_house__kill_house_operator__user__first_name',
'province_kill_request__kill_request__kill_house__kill_house_operator__user__last_name',
'province_kill_request__kill_request__kill_house__kill_house_operator__user__mobile',
]
def create(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['province_kill_request_key'])
now = datetime.now()
image = request.data.pop('image', None)
request.data.pop('province_kill_request_key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
payment = serializer.create(validated_data=request.data)
payment.province_kill_request = province_kill_request
payment.date = now
payment.payment_registrar = user.fullname
payment.payment_registrar_mobile = user.mobile
payment.image = send_image_to_server(image)
payment.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def list(self, request, *args, **kwargs):
province_kill_request = ProvinceKillRequest.objects.get(key=request.GET['province_kill_request_key'])
filter = {'trash': False, 'province_kill_request': province_kill_request}
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
if date1:
filter['date1'] = datetime.strptime(str(date1), '%Y-%m-%d').date()
filter['date2'] = datetime.strptime(str(date2), '%Y-%m-%d').date()
payments = DirectBuyingPayment.objects.filter(**filter)
if 'search' in request.GET:
payments_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=payments
)
).filter():
ps = self.filterset_class(data=query, queryset=payments)
payments_list = ps.filter()
payments = [] if len(
payments_list) == 0 else payments_list
if request.GET.get('page'):
page_size = request.query_params.get('page_size', None)
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(payments)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(payments, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
payment = DirectBuyingPayment.objects.get(key=request.data['key'])
image = request.data.pop('image', None)
if image:
payment.image = send_image_to_server(image)
payment.save()
serializer = self.serializer_class(payment)
serializer.update(instance=payment, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
payment = DirectBuyingPayment.objects.get(key=request.GET['key'])
payment.trash = True
payment.save()
return Response({"result": "بار با موفقیت حذف شد !"}, status=status.HTTP_200_OK)
class ProvinceKillRequestDirectBuyingViewSet(viewsets.ModelViewSet):
queryset = ProvinceKillRequest.objects.all()
serializer_class = ProvinceKillRequestForDirectBuyingSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = ProvinceKillRequestFilterSet
filterset_fields = [
'province_request__poultry_request__chicken_breed',
'province_request__poultry_request__order_code',
'province_request__poultry_request__poultry__address__city__name',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
role = request.GET.get('role')
state = request.GET.get('status')
filter = {
'trash': False,
'payment_deadline': True,
'return_to_province': False,
'payment_deadline_archive': False if state == 'active' else True,
}
if date1:
filter['kill_request__recive_date__date__gte'] = datetime.strptime(date1, '%Y-%m-%d').date()
filter['kill_request__recive_date__date__lte'] = datetime.strptime(date2, '%Y-%m-%d').date()
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
filter['killhouse_user'] = kill_house
elif role in ('CityJahad', 'CityOperator', 'CityCommerce', 'CityVet', 'CitySupervisor', 'CityPoultry'):
filter['kill_request__poultry__address__city'] = user.city
province_kill_requests = ProvinceKillRequest.objects.filter(**filter).select_related('kill_request',
'kill_request__poultry_hatching',
'kill_request__poultry').only(
'kill_request', 'kill_request__poultry_hatching', 'kill_request__poultry').order_by('payment_deadline_date')
if 'search' in request.GET:
province_kill_requests_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=province_kill_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=province_kill_requests)
province_kill_requests_list = ps.filter()
province_kill_requests = [] if len(
province_kill_requests_list) == 0 else province_kill_requests_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(province_kill_requests)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(province_kill_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
province_kill_request = ProvinceKillRequest.objects.get(key=request.data['key'])
check = request.data.pop('check', None)
archive = request.data.pop('archive', None)
if 'final_accept' in request.data.keys():
role = request.data.pop('role', None)
if request.data['final_accept'] == True:
province_kill_request.payment_deadline_state = 'checking' if role == 'KillHouse' else 'accepted'
province_kill_request.final_accept_registrar = user.fullname
province_kill_request.final_accept_registrar_mobile = user.mobile
province_kill_request.final_accept_date = datetime.now()
if role != 'KillHouse':
province_kill_request.payment_deadline_checker_fullname = user.fullname
province_kill_request.payment_deadline_checker_mobile = user.mobile
province_kill_request.payment_deadline_check_date = datetime.now()
province_kill_request.payment_deadline_archive_message = 'تایید و تسویه کامل'
province_kill_request.payment_deadline_archive = True
province_kill_request.save()
if check:
state = request.data.pop('state', None)
province_kill_request.payment_deadline_checker_fullname = user.fullname
province_kill_request.payment_deadline_checker_mobile = user.mobile
province_kill_request.payment_deadline_check_date = datetime.now()
province_kill_request.payment_deadline_archive = True if state == 'accepted' else False
province_kill_request.payment_deadline_state = state
if province_kill_request.payment_deadline_state == 'rejected':
province_kill_request.final_accept = False
if archive:
province_kill_request.payment_deadline_checker_fullname = user.fullname
province_kill_request.payment_deadline_checker_mobile = user.mobile
province_kill_request.payment_deadline_check_date = datetime.now()
province_kill_request.payment_deadline_archive = True
province_kill_request.payment_deadline_state = 'archive'
if 'extension_payment_deadline_days' in request.data.keys():
province_kill_request.extension_payment_deadline_date = province_kill_request.payment_deadline_date + timedelta(
days=request.data['extension_payment_deadline_days'])
province_kill_request.kill_request.extension_payment_deadline_days = request.data[
'extension_payment_deadline_days']
province_kill_request.kill_request.extension_payment_deadline_date = province_kill_request.extension_payment_deadline_date
province_kill_request.kill_request.save()
province_kill_request.save()
serializer = self.serializer_class(province_kill_request)
serializer.update(instance=province_kill_request, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class MarketKillRequestViewSet(viewsets.ModelViewSet):
queryset = KillRequest.objects.all()
serializer_class = KillRequestForDirectBuyingSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillRequestFilterSet
filterset_fields = [
'kill_house__kill_house_operator__user__mobile',
'kill_house__kill_house_operator__user__fullname',
'kill_house__kill_house_operator__user__first_name',
'kill_house__kill_house_operator__user__last_name',
'poultry_request__chicken_breed',
'poultry_request__order_code',
'poultry_request__poultry__address__city__name',
'poultry_request__poultry__user__mobile',
'poultry_request__poultry__user__fullname',
]
def calculate_province_kill_request_wage(self, kill_request):
province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=kill_request.poultry_request)
wage_type = WageType.objects.filter(en_name='province-kill-request', trash=False).first()
wage = wage_type.amount if wage_type.status == True else 0
percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
trash=False)
province_killrequest = ProvinceKillRequest(
killhouse_user=kill_request.kill_house,
kill_request=kill_request,
province_request=province_check,
quantity=kill_request.kill_capacity,
total_killed_quantity=kill_request.kill_capacity,
total_killed_weight=int(kill_request.kill_capacity * kill_request.poultry_request.Index_weight),
main_quantity=kill_request.kill_capacity,
wage=wage,
market=True,
payment_deadline=True,
payment_deadline_days=kill_request.payment_deadline_days,
payment_deadline_date=kill_request.payment_deadline_date,
state='accepted',
kill_house_price=kill_request.amount,
total_wage_amount=wage * int(kill_request.kill_capacity * kill_request.poultry_request.Index_weight),
)
province_killrequest.save()
kill_house_check = KillHouseCheckRequest(
province_kill_request=province_killrequest,
state='accepted'
)
kill_house_check.save()
vet_farm = VetFarm.objects.filter(trash=False,
poultry=province_killrequest.province_request.poultry_request.poultry).first()
bot_eitaa_for_each_province_kill_request(province_killrequest, vet_farm)
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':
province_killrequest.union_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.union_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'company':
province_killrequest.company_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.company_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'guilds':
province_killrequest.guilds_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.guilds_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'city':
province_killrequest.city_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.city_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'other':
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
elif percentage_wage_type.share_type.en_name == 'wallet':
province_killrequest.wallet_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.wallet_share_percent = percentage_wage_type.percent
else:
province_killrequest.other_share = int(
(percentage_wage_type.percent / 100) * province_killrequest.total_wage_amount)
province_killrequest.other_share_percent = percentage_wage_type.percent
province_killrequest.save()
def create(self, request, *args, **kwargs):
total_unpaid_wage = 0
total_paid_wage = 0
user = SystemUserProfile.objects.get(trash=False, user=request.user)
now = datetime.now()
kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
'kill_house', flat=True)
kill_houses = KillHouse.objects.filter(out_province=False, market_buying=True, trash=False).exclude(
id__in=kill_house_ids).order_by('id', 'killer')
kill_house_for_killer = None
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
if kill_house.ware_house_remaining_weight_limitation_status:
if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation:
return Response({
"result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده انبار بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
if kill_house.ware_house_remaining_percent_limitation_status:
if not check_kill_house_remain_limitation_weight(kill_house):
return Response({
"result": "باقی مانده انبار شما از حداکثر محدودیت وزن باقی مانده روزانه انبار بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
with transaction.atomic():
poultry_request = PoultryRequest.objects.select_for_update().get(key=request.data['poultry_request_key'])
if poultry_request.free_sale_in_province == True:
if kill_house.quota:
kill_house_info = calculate_governmental_quota(kill_house)
if kill_house_info == 'not_allowed':
return Response({"result": " امکان خرید آزاد تا تکمیل تعهد دولتی وجود ندارد!"},
status=status.HTTP_403_FORBIDDEN)
index_weight_category = IndexWeightCategory.objects.filter(trash=False, name='سبک').first()
light_max_value = index_weight_category.max_value if index_weight_category else 0
if kill_house.market_buying_limitation:
kill_house_info = market_kill_request_share_quantity(kill_house, total_kill_houses=kill_houses)
kill_house_share = kill_house_info['kill_house_today_share']
kill_house_buying = kill_house_info['kill_house_market_kill_requests_quantity'] + request.data[
'kill_capacity']
if kill_house.market_light_capacity:
total_remain_light_weight = kill_house_info['total_remain_poultry_requests_quantity_light_weight']
kill_house_market_kill_requests_quantity_light_weight = kill_house_info[
'kill_house_market_kill_requests_quantity_light_weight']
real_kill_house_market_kill_requests_quantity_light_weight = kill_house_info['light_real_quantity']
if poultry_request.Index_weight >= light_max_value:
if real_kill_house_market_kill_requests_quantity_light_weight > 0:
if total_remain_light_weight > real_kill_house_market_kill_requests_quantity_light_weight:
if real_kill_house_market_kill_requests_quantity_light_weight > kill_house_market_kill_requests_quantity_light_weight:
return Response({"result": "الویت با خرید و تکمیل نهایی سهمیه سبک می باشد!"},
status=status.HTTP_403_FORBIDDEN)
else:
if total_remain_light_weight > kill_house_market_kill_requests_quantity_light_weight:
return Response({"result": "الویت با خرید و تکمیل نهایی سهمیه سبک می باشد!"},
status=status.HTTP_403_FORBIDDEN)
if kill_house_share - kill_house_buying < 0:
return Response({"result": "حجم خریداری شده از سهمیه شما بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
kill_request = KillRequest.objects.filter(trash=False, poultry_request=poultry_request,
kill_house=kill_house,
market_final_accept=False).first()
# if poultry_request.remain_quantity < request.data['kill_capacity']:
# return Response({"result": "حجم وارد شده از باقی مانده قابل فروش بیشتر است !"},
# status=status.HTTP_403_FORBIDDEN)
market_requests_quantity = KillRequest.objects.filter(poultry_request=poultry_request, trash=False,
market_state__in=('pending', 'accepted'),
market=True).aggregate(
total=Sum('kill_capacity'))['total'] or 0
if market_requests_quantity + request.data['kill_capacity'] > poultry_request.quantity:
return Response({"result": "باقی مانده اعلام نیاز مرغدار کمتر از درخواست شماست!"},
status=status.HTTP_403_FORBIDDEN)
kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first()
total_unpaid_wage = get_finance_info(kill_house)['total_price']
slaughter_transactions = InternalTransaction.objects.filter(
kill_house=kill_house, status='completed',
trash=False)
total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
if kill_house_purchase.limitation == True:
if kill_house_purchase.limitation_number <= total_unpaid_wage - total_paid_wage:
if not ProvinceKillRequest.objects.filter(killhouse_user=kill_house,
kill_request__recive_date__date=now.date(),
trash=False,
state__in=('pending', 'accepted')).exists():
return Response({
"result": "به علت بدهی امکان ثبت درخواست وحود ندارد لطفا بدهی خود را در پنل کارمزد ها تسویه کنید"},
status=status.HTTP_403_FORBIDDEN)
if kill_request:
kill_request.kill_capacity += request.data['kill_capacity']
kill_request.remain_quantity += request.data['kill_capacity']
kill_request.save()
market_poultry_request_remain_quantity(kill_request.poultry_request)
return Response({"result": "با موفقیت ثبت شد."}, status=status.HTTP_200_OK)
request.data.pop('poultry_request_key')
if kill_house.killer and kill_house.type == 'public':
percentage = KillHousePercentage.objects.filter(trash=False, kill_house=kill_house,
kill_house_for_killer__isnull=False).first()
kill_house_for_killer = percentage.kill_house_for_killer
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
market_kill_request = serializer.create(validated_data=request.data)
market_kill_request.kill_house = kill_house
market_kill_request.poultry_request = poultry_request
market_kill_request.poultry_hatching = poultry_request.hatching
market_kill_request.poultry = poultry_request.poultry
market_kill_request.recive_date = now
market_kill_request.chicken_breed = poultry_request.chicken_breed
market_kill_request.remain_quantity = market_kill_request.kill_capacity
market_kill_request.amount = poultry_request.amount
market_kill_request.Index_weight = poultry_request.Index_weight
market_kill_request.market = True
market_kill_request.payment_deadline = True
if kill_house_for_killer:
market_kill_request.slaughter_house = kill_house_for_killer
market_kill_request.market_expire_date_time = now + timedelta(
minutes=30) if market_code_state else now + timedelta(minutes=5)
if market_code_state:
market_kill_request.market_code_status = True
market_kill_request.payment_deadline_date = datetime.now() + timedelta(
days=request.data['payment_deadline_days'])
market_kill_request.save()
market_poultry_request_remain_quantity(market_kill_request.poultry_request)
return Response(serializer.data, status=status.HTTP_201_CREATED)
def list(self, request, *args, **kwargs):
from django.db.models import Value
user = SystemUserProfile.objects.get(user=request.user, trash=False)
now = datetime.now().date()
role = request.GET.get('role')
poultry_request_key = request.GET.get('poultry_request_key')
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
# filter = {
# 'trash': False,
# 'market': True,
# }
filter = {
'market': True
}
if date1:
filter['recive_date__date__gte'] = date1
filter['recive_date__date__lte'] = date2
else:
filter['recive_date__date'] = now
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
filter['kill_house'] = kill_house
elif role in ('CityJahad', 'CityOperator', 'CityCommerce', 'CityVet', 'CitySupervisor', 'CityPoultry'):
filter['poultry__address__city'] = user.city
state_type = request.GET.get('type')
if state_type and state_type != 'all':
filter['market_state'] = state_type
if state_type in ('pending', 'accepted', 'rejected'):
filter['trash'] = False
elif state_type == 'deleted':
filter['trash'] = True
if poultry_request_key:
filter['poultry_request__key'] = poultry_request_key
kill_requests = KillRequest.objects.filter(**filter).select_related('poultry_hatching', 'poultry').only(
'poultry_hatching', 'poultry').order_by(
Case(
When(market_state='pending', then=Value(0)),
default=Value(1)
),
'-create_date'
)
if 'search' in request.GET:
kill_requests_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=kill_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_requests)
kill_requests_list = ps.filter()
kill_requests = [] if len(
kill_requests_list) == 0 else kill_requests_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(kill_requests)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(kill_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
kill_request = KillRequest.objects.get(key=request.data['key'])
if kill_request.trash:
return Response({"result": "درخواست شما توسط کاربر حذف گردید!"}, status=status.HTTP_403_FORBIDDEN)
if 'check' in request.data.keys():
state = request.data['market_state']
if state == 'accepted':
self.calculate_province_kill_request_wage(kill_request)
request.data.pop('check')
if 'market_final_accept' in request.data.keys():
# market_poultry_request_remain_quantity(kill_request.poultry_request)
poultry_request = kill_request.poultry_request
# market_requests_quantity = KillRequest.objects.filter(poultry_request=poultry_request, trash=False,
# market_state__in=('pending', 'accepted'), market=True,
# market_final_accept=True).aggregate(
# total=Sum('kill_capacity'))['total'] or 0
# if market_requests_quantity + kill_request.kill_capacity > poultry_request.quantity:
# return Response({"result": "باقی مانده اعلام نیاز مرغدار کمتر از درخواست شماست!"},
# status=status.HTTP_403_FORBIDDEN)
if market_code_state:
code = str(random.randint(10000, 99000))
kill_request.market_code = code
kill_request.save()
market_sms = threading.Thread(
target=send_sms_fro_kill_request_market,
args=(
kill_request,))
market_sms.start()
kill_request.remain_quantity -= kill_request.kill_capacity
kill_request.save()
if 'kill_capacity' in request.data.keys():
kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
'kill_house', flat=True)
kill_houses = KillHouse.objects.filter(out_province=False, market_buying=True, trash=False).exclude(
id__in=kill_house_ids).order_by('id', 'killer')
if kill_request.kill_house.market_buying_limitation:
kill_house_info = market_kill_request_share_quantity(kill_request.kill_house,
total_kill_houses=kill_houses)
kill_house_share = kill_house_info['kill_house_today_share']
kill_house_today_left_share = kill_house_info['kill_house_today_left_share']
kill_house_buying = kill_house_info['kill_house_market_kill_requests_quantity'] + request.data[
'kill_capacity']
if (kill_house_today_left_share + kill_request.kill_capacity) < request.data['kill_capacity']:
return Response({"result": "حجم خریداری شده از سهمیه شما بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
if kill_request.poultry_request.remain_quantity + kill_request.kill_capacity < request.data[
'kill_capacity']:
return Response({"result": "حجم وارد شده از باقی مانده قابل فروش بیشتر است !"},
status=status.HTTP_403_FORBIDDEN)
kill_request.remain_quantity = request.data['kill_capacity']
if 'payment_deadline_days' in request.data.keys():
kill_request.payment_deadline_date = datetime.now() + timedelta(
days=request.data['payment_deadline_days'])
if 'input_market_code' in request.data.keys():
if request.data['input_market_code'] != kill_request.market_code:
return Response({"result": "کد وارد شده صحیح نمی باشد!"}, status=status.HTTP_403_FORBIDDEN)
kill_request.input_market_code = request.data['input_market_code']
self.calculate_province_kill_request_wage(kill_request)
kill_request.market_state = 'accepted'
kill_request.save()
serializer = self.serializer_class(kill_request)
serializer.update(instance=kill_request, validated_data=request.data)
market_poultry_request_remain_quantity(kill_request.poultry_request)
return Response(serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(trash=False, user=request.user)
kill_request = KillRequest.objects.get(key=request.GET["key"])
kill_request.trash = True
kill_request.market_state_message = {
"fullname": user.fullname,
"mobile": user.mobile,
"date": str(datetime.now())
}
kill_request.market_state = 'deleted'
kill_request.save()
market_poultry_request_remain_quantity(kill_request.poultry_request)
return Response(' با موفقیت حذف شد', status=status.HTTP_200_OK)
class MarketKillHouseViewSet(viewsets.ModelViewSet):
queryset = KillHouse.objects.all()
serializer_class = KillHouseForCommonlyUsedSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def list(self, request, *args, **kwargs):
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by(
'id', 'killer')
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_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(kill_houses)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(kill_houses, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
kill_house = KillHouse.objects.get(key=request.data['key'])
serializer = self.serializer_class(kill_house)
serializer.update(instance=kill_house, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseMarketInfoViewSet(APIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseMarketInfoSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
role = request.GET.get('role')
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
'kill_house', flat=True)
kill_houses = KillHouse.objects.filter(out_province=False, market_buying=True, trash=False).exclude(
id__in=kill_house_ids).order_by('id', 'killer')
if role == 'KillHouse':
user = SystemUserProfile.objects.get(trash=False, user=request.user)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
serializer = self.serializer_class(kill_house,
context={'date1': date1, 'date2': date2, 'kill_houses': kill_houses})
else:
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_list
serializer = self.serializer_class(kill_houses, many=True,
context={'date1': date1, 'date2': date2, 'kill_houses': kill_houses})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseMarketInfoDashboardViewSet(APIView):
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
today = datetime.now().date()
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
if date1:
total_poultry_requests_quantity = (
PoultryRequest.objects.filter(
send_date__date__gte=date1,
send_date__date__lte=date2,
state_process='accepted',
province_state='accepted',
final_state__in=('pending', 'accepted'),
temporary_trash=False,
trash=False,
out=False,
market=True,
).aggregate(total=Sum('quantity'))['total'] or 0
)
else:
total_poultry_requests_quantity = (
PoultryRequest.objects.filter(
send_date__date=today,
state_process='accepted',
province_state='accepted',
final_state__in=('pending', 'accepted'),
temporary_trash=False,
trash=False,
out=False,
market=True,
).aggregate(total=Sum('quantity'))['total'] or 0
)
exclusive_kill_house_ids = KillHousePercentage.objects.filter(
kill_house__type='exclusive',
trash=False
).values_list('kill_house', flat=True)
kill_houses = KillHouse.objects.filter(
out_province=False,
market_buying=True,
trash=False
).exclude(id__in=exclusive_kill_house_ids).order_by('id', 'killer')
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_list
dashboard_data = {
"kill_house_today_share": 0,
"market_light_share": 0,
"kill_house_market_kill_requests_quantity": 0,
"kill_house_market_kill_requests_quantity_first": 0,
"kill_house_market_kill_requests_quantity_final": 0,
"kill_house_today_left_share": 0,
"kill_house_market_kill_requests_quantity_weight": 0,
"kill_house_market_kill_requests_quantity_first_weight": 0,
"kill_house_market_kill_requests_quantity_final_weight": 0,
"total_kill_house_market_kill_requests_quantity_agreement_light_weight": 0,
"total_kill_house_market_kill_requests_quantity_light_weight": 0,
"total_kill_house_market_kill_requests_quantity_heavy_weight": 0,
}
for kill_house in kill_houses:
if date1:
info = market_kill_request_share_quantity(kill_house, date1, date2, total_kill_houses=kill_houses)
else:
info = market_kill_request_share_quantity(kill_house, total_kill_houses=kill_houses)
for key in dashboard_data:
dashboard_data[key] += info.get(key, 0) or 0
result = {"total_poultry_requests_quantity": total_poultry_requests_quantity, **dashboard_data}
return Response(result, status=200)
def make_fine_for_requests_cron():
now = datetime.now().date()
fine = FinePermission.objects.filter(trash=False).first()
province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, temporary_trash=False,
return_to_province=False,
kill_request__recive_date__date__lt=now,
first_car_allocated_quantity=0,
state__in=('pending', 'accepted')).select_related(
'province_request__poultry_request__hatching')
if province_kill_requests:
for province_kill_request in province_kill_requests:
hatching = province_kill_request.province_request.poultry_request.hatching
province_kill_request.fine = True
province_kill_request.fine_amount = fine.in_province_allocations_fine_coefficient * province_kill_request.total_wage_amount
province_kill_request.fine_coefficient = fine.in_province_allocations_fine_coefficient
if province_kill_request.market:
province_kill_request.kill_request.market_state = 'deleted'
province_kill_request.kill_request.save()
province_kill_request.delete_message = "حذف تخصیص و اعمال جریمه به دلیل عدم ثبت خودرو در بازه مشخص"
province_kill_request.trash = True
province_kill_request.save()
update_province_kill_requests(hatching)
kill_house_requests = KillHouseRequest.objects.filter(
Q(assignment_state_archive='pending') | Q(ware_house_confirmation=False), fine=False, trash=False,
kill_request__recive_date__date__lt=now,
temporary_trash=False).select_related('province_kill_request', 'province_request__poultry_request',
'province_request__poultry_request__hatching')
empty_info_bars = kill_house_requests.filter(assignment_state_archive='pending', ware_house_confirmation=False)
not_completed_bars = kill_house_requests.filter(assignment_state_archive='pending', ware_house_confirmation=True)
not_entered_bars = kill_house_requests.filter(assignment_state_archive='True', ware_house_confirmation=False)
if empty_info_bars:
for empty_info_bar in empty_info_bars:
poultry_request = empty_info_bar.province_request.poultry_request
hatching = empty_info_bar.province_request.poultry_request.hatching
province_kill_request = empty_info_bar.province_kill_request
empty_info_bar.fine = True
empty_info_bar.fine_amount = (
fine.in_province_bars_fine_coefficient * empty_info_bar.accepted_real_weight) * province_kill_request.wage
empty_info_bar.fine_coefficient = fine.in_province_bars_fine_coefficient
empty_info_bar.message = 'لغو بار و اعمال جریمه به علت عدم تکمبل اطلاعات و ورود به انبار'
empty_info_bar.bar_remover = {
"date": str(datetime.now()),
"role": "system",
"mobile": "-",
"full_name": "system"
}
empty_info_bar.trash = True
empty_info_bar.save()
update_kill_house_requests(province_kill_request, poultry_request)
update_province_kill_requests(hatching)
if not_completed_bars:
for not_completed_bar in not_completed_bars:
province_kill_request = not_completed_bar.province_kill_request
not_completed_bar.fine = True
not_completed_bar.fine_amount = (
fine.in_province_bars_fine_coefficient * not_completed_bar.accepted_real_weight) * province_kill_request.wage
not_completed_bar.fine_coefficient = fine.in_province_bars_fine_coefficient
not_completed_bar.message = 'اعمال جریمه به علت عدم تکمبل اطلاعات'
not_completed_bar.save()
if not_entered_bars:
for not_entered_bar in not_entered_bars:
province_kill_request = not_entered_bar.province_kill_request
not_entered_bar.ware_house_accepted_real_quantity = not_entered_bar.accepted_real_quantity
not_entered_bar.ware_house_accepted_real_weight = int(not_entered_bar.accepted_real_weight - (
(not_entered_bar.accepted_real_weight * 25) / 100))
not_entered_bar.weight_loss = 25
poultry_prediction(not_entered_bar.province_request.poultry_request.poultry)
not_entered_bar.ware_house_input_type = "loss_weight"
not_entered_bar.ware_house_confirmation = True
not_entered_bar.date_of_ware_house = str(datetime.now())
not_entered_bar.fine = True
not_entered_bar.fine_amount = (
fine.in_province_bars_fine_coefficient * not_entered_bar.accepted_real_weight) * province_kill_request.wage
not_entered_bar.fine_coefficient = fine.in_province_bars_fine_coefficient
not_entered_bar.message = 'اعمال جریمه به علت عدم ورود به انبار'
not_entered_bar.save()
product = RolesProducts.objects.filter(parent_product__product_id=2,
kill_house=not_entered_bar.killhouse_user).first()
kill_house_requests_product_warehousing(product)
# class KillHouseSalesInformationViewSet(APIView):
# permission_classes = [TokenHasReadWriteScope]
#
# def get(self, request):
# date1 = request.GET.get('date1')
# date2 = request.GET.get('date2')
# key = request.GET.get('key')
# kill_house = KillHouse.objects.get(key=key, trash=False)
# kill_house_request_filter = {
# 'killhouse_user': kill_house,
# 'ware_house_confirmation': True,
# 'trash': False,
# 'calculate_status': True,
# }
# kill_house_free_buying_bar_filter = {
# 'kill_house': kill_house,
# 'trash': False,
# 'calculate_status': True,
# }
# kill_house_allocation_filter = {
# 'trash': False,
# 'calculate_status': True,
# }
#
# kill_house_free_sale_bars_filter = {
# 'trash': False,
# 'calculate_status': True,
# }
# if date1:
# kill_house_request_filter['kill_request__recive_date__date__gte'] = datetime.strptime(date1,
# '%Y-%m-%d').date() - timedelta(
# days=1)
# kill_house_request_filter['kill_request__recive_date__date__lte'] = datetime.strptime(date2,
# '%Y-%m-%d').date() - timedelta(
# days=1)
# kill_house_free_buying_bar_filter['date__date__gte'] = date1
# kill_house_free_buying_bar_filter['date__date__lte'] = date2
# kill_house_allocation_filter['date__date__gte'] = date1
# kill_house_allocation_filter['date__date__lte'] = date2
# kill_house_free_sale_bars_filter['date__date__gte'] = date1
# kill_house_free_sale_bars_filter['date__date__lte'] = date2
#
# kill_house_requests = KillHouseRequest.objects.filter(**kill_house_request_filter)
# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(
# **kill_house_free_buying_bar_filter).exclude(entered_message='ورود به انبار مجازی')
# kill_house_allocations = StewardAllocation.objects.filter(
# Q(kill_house=kill_house) | Q(to_kill_house=kill_house), **kill_house_allocation_filter)
# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(**kill_house_free_sale_bars_filter)
#
# kill_house_requests_aggregates = kill_house_requests.aggregate(
# total_count=Count('id'),
# total_governmental_weight=Sum('ware_house_accepted_real_weight',
# filter=Q(province_request__poultry_request__free_sale_in_province=False)),
# total_free_weight=Sum('ware_house_accepted_real_weight',
# filter=Q(province_request__poultry_request__free_sale_in_province=True)),
# )
#
# kill_house_free_buying_bars_aggregates = kill_house_free_buying_bars.aggregate(
# total_count=Count('id'),
# total_weight=Sum('weight_of_carcasses'),
# )
#
# kill_house_allocations_aggregates = kill_house_allocations.aggregate(
# total_count=Count('id'),
# total_receive_governmental_weight=Sum('receiver_real_weight_of_carcasses',
# filter=Q(approved_price_status=True, receiver_state='accepted',
# kill_house__isnull=True, to_cold_house__isnull=True)),
# total_receive_free_weight=Sum('receiver_real_weight_of_carcasses',
# filter=Q(approved_price_status=False, receiver_state='accepted',
# kill_house__isnull=True, to_cold_house__isnull=True)),
# total_allocated_governmental_weight=Sum('receiver_real_weight_of_carcasses',
# filter=Q(approved_price_status=False, receiver_state='accepted',
# kill_house__isnull=False, to_cold_house__isnull=True)),
# total_allocated_free_weight=Sum('receiver_real_weight_of_carcasses',
# filter=Q(approved_price_status=False, receiver_state='accepted',
# kill_house__isnull=False, to_cold_house__isnull=True)),
#
# )
# kill_house_free_sale_bars_aggregates = kill_house_free_sale_bars.aggregate(
# total_count=Count('id'),
# total_governmental_weight=Sum('real_weight_of_carcasses',
# filter=Q(sale_type='governmental')),
# total_free_weight=Sum('real_weight_of_carcasses',
# filter=Q(sale_type='free')),
# )
#
# result = {
# "kill_house_request_governmental_weight": kill_house_requests_aggregates['total_governmental_weight'] or 0,
# "kill_house_request_free_weight": kill_house_requests_aggregates['total_free_weight'] or 0,
# "kill_house_free_buying_bars_weight": kill_house_free_buying_bars_aggregates['total_weight'] or 0,
# "total_receive_governmental_weight": kill_house_allocations_aggregates[
# 'total_receive_governmental_weight'] or 0,
# "total_receive_free_weight": kill_house_allocations_aggregates['total_receive_free_weight'] or 0,
# "total_in_allocated_governmental_weight": kill_house_allocations_aggregates[
# 'total_allocated_governmental_weight'] or 0,
# "total_in_allocated_free_weight": kill_house_allocations_aggregates['total_allocated_free_weight'] or 0,
# "total_out_allocated_free_weight": kill_house_free_sale_bars_aggregates['total_governmental_weight'] or 0,
# "total_out_free_weight": kill_house_free_sale_bars_aggregates['total_free_weight'] or 0,
# }
#
# return Response(result, status=200)
class KillHouseSalesInformationViewSet(APIView):
permission_classes = [TokenHasReadWriteScope]
def get(self, request):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
kill_house_requests = KillHouseRequest.objects.filter(
input_warehouse=kill_house,
temporary_trash=False,
temporary_deleted=False,
trash=False, calculate_status=True, warehouse=True)
kill_house_free_bar_informations = KillHouseFreeBarInformation.objects.filter(input_warehouse=kill_house,
trash=False,
temporary_trash=False,
temporary_deleted=False,
calculate_status=True,
warehouse=True).exclude(
entered_message='ورود به انبار مجازی')
kill_house_free_Sale_bar_informations = KillHouseFreeSaleBarInformation.objects.filter(
kill_house=kill_house,
trash=False,
temporary_trash=False,
temporary_deleted=False,
calculate_status=True, warehouse=True)
kill_house_allocations = StewardAllocation.objects.filter(kill_house=kill_house, trash=False,
receiver_state__in=('pending', 'accepted'),
temporary_trash=False,
temporary_deleted=False,
to_cold_house__isnull=True,
calculate_status=True, warehouse=True)
segmentations = PosSegmentation.objects.filter(kill_house=kill_house, trash=False, warehouse=True)
cold_house_allocations = StewardAllocation.objects.filter(
kill_house=kill_house,
to_cold_house__isnull=False,
receiver_state__in=('accepted', 'pending'),
trash=False, warehouse=True)
transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False,
warehouse=True)
total_entered_kill_house_requests_carcasses_governmental_weight = \
kill_house_requests.filter(ware_house_confirmation=True,
province_request__poultry_request__free_sale_in_province=False).aggregate(
total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
total_entered_kill_house_requests_carcasses_free_weight = \
kill_house_requests.filter(ware_house_confirmation=True,
province_request__poultry_request__free_sale_in_province=True).aggregate(
total=Sum('ware_house_accepted_real_weight'))[
'total'] or 0
total_entered_kill_house_free_bar_carcasses_weight = \
kill_house_free_bar_informations.aggregate(total=Sum('weight_of_carcasses'))[
'total'] or 0
total_kill_house_free_sale__bar_carcasses_weight = \
kill_house_free_Sale_bar_informations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_free_sale__bar_carcasses_governmental_weight = \
kill_house_free_Sale_bar_informations.filter(quota='governmental').aggregate(
total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_free_sale__bar_carcasses_free_weight = \
kill_house_free_Sale_bar_informations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_allocations_weight = \
kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_allocations_governmental_weight = \
kill_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
total_kill_house_allocations_free_weight = \
kill_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
segmentations_weight = \
segmentations.aggregate(total=Sum('weight'))[
'total'] or 0
segmentations_governmental_weight = \
segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[
'total'] or 0
segmentations_free_weight = \
segmentations.filter(quota='free').aggregate(total=Sum('weight'))[
'total'] or 0
cold_house_allocations_weight = \
cold_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
cold_house_allocations_governmental_weight = \
cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
cold_house_allocations_free_weight = \
cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
pos_allocated_weight_info = transactions.aggregate(
pos_allocated_weight=Sum('cur_weight'),
pos_governmental_allocated_weight=Sum('cur_weight',
filter=Q(price_approved=True)),
pos_free_allocated_weight=Sum('cur_weight', filter=Q(price_approved=False)),
)
pos_allocated_weight = pos_allocated_weight_info['pos_allocated_weight'] or 0
pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0
pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0
total_governmental_input_weight = total_entered_kill_house_requests_carcasses_governmental_weight
total_free_input_weight = total_entered_kill_house_requests_carcasses_free_weight + total_entered_kill_house_free_bar_carcasses_weight
total_governmental_output_weight = total_kill_house_free_sale__bar_carcasses_governmental_weight + segmentations_governmental_weight + total_kill_house_allocations_governmental_weight + cold_house_allocations_governmental_weight + int(pos_governmental_allocated_weight / 1000)
total_free_output_weight = total_kill_house_free_sale__bar_carcasses_free_weight + total_kill_house_allocations_free_weight + segmentations_free_weight + cold_house_allocations_free_weight + int(pos_free_allocated_weight / 1000)
total_governmental_remain_weight = (
total_governmental_input_weight - total_governmental_output_weight) - kill_house.ware_house_archive_governmental_weight
total_free_remain_weight = (
total_free_input_weight - total_free_output_weight) - kill_house.ware_house_archive_free_weight
result = {
"total_governmental_input_weight": int(total_governmental_input_weight),
"total_free_input_weight": int(total_free_input_weight),
"total_governmental_output_weight": int(total_governmental_output_weight),
"total_free_output_weight": int(total_free_output_weight),
"total_governmental_remain_weight": int(total_governmental_remain_weight),
"total_free_remain_weight": int(total_free_remain_weight),
"total_kill_house_free_sale__bar_carcasses_weight": int(total_kill_house_free_sale__bar_carcasses_weight),
"total_kill_house_allocations_weight": int(total_kill_house_allocations_weight),
"segmentations_weight": int(segmentations_weight),
"cold_house_allocations_weight": int(cold_house_allocations_weight),
"total_selling_in_province_governmental_weight": kill_house.total_selling_in_province_governmental_weight,
"total_selling_in_province_free_weight": kill_house.total_selling_in_province_free_weight,
"total_commitment_selling_in_province_governmental_weight": kill_house.total_commitment_selling_in_province_governmental_weight,
"total_commitment_selling_in_province_governmental_remain_weight": kill_house.total_commitment_selling_in_province_governmental_remain_weight,
"total_commitment_selling_in_province_free_weight": kill_house.total_commitment_selling_in_province_free_weight,
"total_commitment_selling_in_province_free_remain_weight": kill_house.total_commitment_selling_in_province_free_remain_weight,
"pos_allocated_weight": int(pos_allocated_weight / 1000),
"pos_governmental_allocated_weight": int(pos_governmental_allocated_weight / 1000),
"pos_free_allocated_weight": int(pos_free_allocated_weight / 1000),
"ware_house_archive_governmental_weight": kill_house.ware_house_archive_governmental_weight,
"ware_house_archive_free_weight": kill_house.ware_house_archive_free_weight,
}
return Response(result, status=200)
class KillHouseForColdHouseAllocationViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseForColdHouseAllocationSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
role = request.GET.get('role')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_filters = {'out_province': False, 'trash': False}
if role in ['CityJahad']:
kill_house_filters['kill_house_operator__user__city'] = user.city
kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer')
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_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(kill_houses)
if page is not None:
serializer = self.get_serializer(page, many=True, context={'date1': date1, 'date2': date2})
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_houses, many=True, context={'date1': date1, 'date2': date2})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseForSegmentationViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseForSegmentationSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
role = request.GET.get('role')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house_filters = {'out_province': False, 'trash': False}
if role in ['CityJahad']:
kill_house_filters['kill_house_operator__user__city'] = user.city
kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer')
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_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(kill_houses)
if page is not None:
serializer = self.get_serializer(page, many=True, context={'date1': date1, 'date2': date2})
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_houses, many=True, context={'date1': date1, 'date2': date2})
return Response(serializer.data, status=status.HTTP_200_OK)
class KillHouseComparativeInformationViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = KillHouseComparativeInformationSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
# kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
# 'kill_house', flat=True)
# kill_houses = KillHouse.objects.filter(out_province=False,killer=False,trash=False).exclude(
# id__in=kill_house_ids).order_by('id')
kill_houses = KillHouse.objects.filter(out_province=False, killer=False, trash=False).order_by('id')
codes = kill_houses.values_list('unique_identifier', flat=True)
code = ",".join(codes)
if date1:
url = f"https://rsibackend.rasadyar.com/app/send_transport_carcass_detail_for_rasadyaar/?code={code}&date1={date1}&date2={date2}"
else:
url = f"https://rsibackend.rasadyar.com/app/send_transport_carcass_detail_for_rasadyaar/?code={code}"
response = requests.get(url)
rsi_data = response.json()
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_list
serializer = self.serializer_class(kill_houses, many=True,
context={'date1': date1, 'date2': date2, 'rsi_data': rsi_data})
return Response(serializer.data, status=status.HTTP_200_OK)
def cancel_bar_and_province_request(request):
date_str = '2025-10-11'
date = datetime.now().date() - timedelta(days=1)
kill_house_requests = KillHouseRequest.objects.filter(trash=False, ware_house_confirmation=False,
kill_request__recive_date__date__lte=date,
kill_request__recive_date__date__gte=date_str)
all_province_requests = kill_house_requests.values_list('province_kill_request', flat=True).distinct()
for kill_house_request in kill_house_requests:
kill_house_request.trash = True
kill_house_request.return_trash = True
kill_house_request.save()
update_kill_house_requests(kill_house_request.province_kill_request,
kill_house_request.province_request.poultry_request)
update_province_kill_requests(
kill_house_request.province_kill_request.province_request.poultry_request.hatching)
for all_province_request in all_province_requests:
if not KillHouseRequest.objects.filter(trash=False, province_kill_request=all_province_request).exists():
all_province_request.return_to_province = True
all_province_request.returner = {"date": str(datetime.today()),
"mobile": "09000000000", "fullname": "برگشت به دلیل حذف سیستمی بار"}
all_province_request.save()
province_requests = ProvinceKillRequest.objects.filter(trash=False, first_car_allocated_quantity=0,
return_to_province=False,
kill_request__recive_date__date=datetime.now().date(),
)
for province_request in province_requests:
province_request.trash = True
province_request.return_trash = True
province_request.save()
update_province_kill_requests(province_request.province_request.poultry_request.hatching)
return HttpResponse('ok')
def cancel_bar_and_province_request_cron():
date_str = '2025-10-11'
date = datetime.now().date() - timedelta(days=1)
kill_house_requests = KillHouseRequest.objects.filter(trash=False, ware_house_confirmation=False,
kill_request__recive_date__date__lte=date,
kill_request__recive_date__date__gte=date_str)
all_province_requests = kill_house_requests.values_list('province_kill_request', flat=True).distinct()
for kill_house_request in kill_house_requests:
kill_house_request.trash = True
kill_house_request.return_trash = True
kill_house_request.save()
update_kill_house_requests(kill_house_request.province_kill_request,
kill_house_request.province_request.poultry_request)
update_province_kill_requests(
kill_house_request.province_kill_request.province_request.poultry_request.hatching)
for all_province_request in all_province_requests:
if not KillHouseRequest.objects.filter(trash=False, province_kill_request=all_province_request).exists():
all_province_request.return_to_province = True
all_province_request.returner = {"date": str(datetime.today()),
"mobile": "09000000000", "fullname": "برگشت به دلیل حذف سیستمی بار"}
all_province_request.save()
province_requests = ProvinceKillRequest.objects.filter(trash=False, first_car_allocated_quantity=0,
return_to_province=False,
kill_request__recive_date__date=datetime.now().date(),
)
for province_request in province_requests:
province_request.trash = True
province_request.return_trash = True
province_request.save()
update_province_kill_requests(province_request.province_request.poultry_request.hatching)
class ReturnProvinceKillRequestViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = ReturnProvinceKillRequestSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = ReturnProvinceKillRequestFilterSet
filterset_fields = [
'province_request__poultry_request__order_code',
'killhouse_user__name',
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'killhouse_user__kill_house_operator__address__city__name',
'province_request__poultry_request__poultry__unit_name',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__poultry__address__city__name',
]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
role = request.GET.get('role')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
filters = {
'archive_wage': False,
'state__in': ('pending', 'accepted'),
'first_car_allocated_quantity': 0
}
if role == 'KillHouse':
filters['killhouse_user__kill_house_operator__user'] = user
if date1:
filters['kill_request__recive_date__date__gte'] = date1
filters['kill_request__recive_date__date__lte'] = date2
return_province_kill_requests = ProvinceKillRequest.objects.filter(
Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True), **filters).order_by('id')
if 'search' in request.GET:
return_province_kill_requests_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=return_province_kill_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=return_province_kill_requests)
return_province_kill_requests_list = ps.filter()
return_province_kill_requests = [] if len(
return_province_kill_requests_list) == 0 else return_province_kill_requests_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(return_province_kill_requests)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(return_province_kill_requests, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request):
return_province_kill_requests = ProvinceKillRequest.objects.get(
key=request.data['key'])
request.data.pop('key')
serializer = self.serializer_class(return_province_kill_requests)
serializer.update(instance=return_province_kill_requests, validated_data=request.data)
update_province_kill_requests(return_province_kill_requests.province_request.poultry_request.hatching)
poultry_prediction(return_province_kill_requests.province_request.poultry_request.hatching.poultry)
return Response(serializer.data, status=status.HTTP_200_OK)
class ReturnKillHouseRequestViewSet(viewsets.ModelViewSet):
queryset = KillHouseRequest.objects.all()
serializer_class = KillHouseRequestForBarManagementSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseRequestFilterSet
filterset_fields = [
'killhouse_user__kill_house_operator__user__fullname',
'killhouse_user__kill_house_operator__user__mobile',
'province_request__poultry_request__poultry__user__fullname',
'province_request__poultry_request__poultry__user__mobile',
'province_request__poultry_request__order_code',
'province_request__poultry_request__order_code',
'bar_code',
]
def list(self, request, *args, **kwargs):
if request.GET['role'] == 'KillHouse':
user = SystemUserProfile.objects.get(user=request.user)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2)
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True))
else:
if 'date1' in request.GET and 'date2' in request.GET:
date1 = datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
kill_house_requests = KillHouseRequest.objects.filter(
Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True),
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2)
else:
kill_house_requests = KillHouseRequest.objects.filter(
Q(non_receipt=True, main_non_receipt=True) | Q(trash=True, return_trash=True))
if 'search' in request.GET:
kill_house_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=kill_house_requests
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_house_requests)
kill_house_request_list = ps.filter()
kill_house_requests = [] if len(kill_house_request_list) == 0 else kill_house_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(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)
def update(self, request, *args, **kwargs):
kill_house_requests = KillHouseRequest.objects.get(key=request.data['key'])
kill_house_requests.province_kill_request.trash = False
kill_house_requests.province_kill_request.return_trash = False
kill_house_requests.province_kill_request.return_to_province = False
kill_house_requests.province_kill_request.returner = None
kill_house_requests.province_kill_request.save()
request.data.pop('key')
serializer = self.serializer_class(kill_house_requests)
serializer.update(instance=kill_house_requests, validated_data=request.data)
update_kill_house_requests(kill_house_requests.province_kill_request,
kill_house_requests.province_request.poultry_request)
update_province_kill_requests(kill_house_requests.province_request.poultry_request.hatching)
return Response(serializer.data, status=status.HTTP_200_OK)
class ReturnRequestDashboardViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
role = request.GET.get('role')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
total_wage_type = WageType.objects.filter(trash=False)
province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first()
province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0
province_kill_request_filters = {
'archive_wage': False,
'state__in': ('pending', 'accepted'),
'first_car_allocated_quantity': 0
}
kill_house_request_filters = {}
if date1:
province_kill_request_filters['kill_request__recive_date__date__gte'] = date1
province_kill_request_filters['kill_request__recive_date__date__lte'] = date2
kill_house_request_filters['kill_request__recive_date__date__gte'] = date1
kill_house_request_filters['kill_request__recive_date__date__lte'] = date2
if role == 'KillHouse':
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
province_kill_request_filters['killhouse_user'] = kill_house
return_kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q(
trash=True, return_trash=True),
**kill_house_request_filters)
else:
return_kill_house_requests = KillHouseRequest.objects.filter(
Q(non_receipt=True, main_non_receipt=True, non_receipt_state__in=('pending', 'accepted')) | Q(
trash=True, return_trash=True),
**kill_house_request_filters)
return_province_kill_requests = ProvinceKillRequest.objects.filter(
Q(trash=False, return_to_province=True) | Q(trash=True, return_trash=True),
**province_kill_request_filters).order_by('id')
return_province_kill_requests_aggregates = return_province_kill_requests.aggregate(
total_count=Count('id'),
total_operator_return_count=Count('id', filter=Q(trash=False, return_to_province=True)),
total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)),
total_quantity=Sum('total_killed_quantity'),
total_operator_return_quantity=Sum('main_quantity', filter=Q(trash=False, return_to_province=True)),
total_system_return_quantity=Sum('total_killed_quantity', filter=Q(trash=True, return_trash=True)),
total_weight=Sum('total_killed_weight'),
total_operator_return_weight=Sum(F('main_quantity') * F('province_request__poultry_request__Index_weight'),
filter=Q(trash=False, return_to_province=True)),
total_system_return_weight=Sum('total_killed_weight', filter=Q(trash=True, return_trash=True)),
)
return_kill_house_requests_aggregates = return_kill_house_requests.aggregate(
total_count=Count('id'),
total_non_receipt_count=Count('id', filter=Q(non_receipt=True, main_non_receipt=True)),
total_system_return_count=Count('id', filter=Q(trash=True, return_trash=True)),
total_quantity=Sum('accepted_real_quantity'),
total_non_receipt_quantity=Sum('accepted_real_quantity', filter=Q(non_receipt=True, main_non_receipt=True)),
total_system_return_quantity=Sum('accepted_real_quantity', filter=Q(trash=True, return_trash=True)),
total_weight=Sum('accepted_real_weight'),
total_non_receipt_weight=Sum('accepted_real_weight', filter=Q(non_receipt=True, main_non_receipt=True)),
total_system_return_weight=Sum('accepted_real_weight', filter=Q(trash=True, return_trash=True)),
)
province_kill_request_total_operator_return_quantity = return_province_kill_requests_aggregates[
'total_operator_return_quantity'] or 0
province_kill_request_total_system_return_quantity = return_province_kill_requests_aggregates[
'total_system_return_quantity'] or 0
province_kill_request_total_quantity = province_kill_request_total_operator_return_quantity + province_kill_request_total_system_return_quantity
province_kill_request_total_operator_return_weight = return_province_kill_requests_aggregates[
'total_operator_return_weight'] or 0
province_kill_request_total_system_return_weight = return_province_kill_requests_aggregates[
'total_system_return_weight'] or 0
province_kill_request_total_weight = province_kill_request_total_operator_return_weight + province_kill_request_total_system_return_weight
kill_house_request_total_system_return_weight = return_kill_house_requests_aggregates[
'total_system_return_weight'] or 0
total_return_weight_with_wage = province_kill_request_total_system_return_weight + kill_house_request_total_system_return_weight
result = {
"province_kill_request_total_count": return_province_kill_requests_aggregates['total_count'] or 0,
"province_kill_request_total_operator_return_count": return_province_kill_requests_aggregates[
'total_operator_return_count'] or 0,
"province_kill_request_total_system_return_count": return_province_kill_requests_aggregates[
'total_system_return_count'] or 0,
"province_kill_request_total_quantity": province_kill_request_total_quantity,
"province_kill_request_total_operator_return_quantity": province_kill_request_total_operator_return_quantity,
"province_kill_request_total_system_return_quantity": province_kill_request_total_system_return_quantity,
"province_kill_request_total_weight": province_kill_request_total_weight,
"province_kill_request_total_operator_return_weight": province_kill_request_total_operator_return_weight,
"province_kill_request_total_system_return_weight": province_kill_request_total_system_return_weight,
"kill_house_request_total_count": return_kill_house_requests_aggregates['total_count'] or 0,
"kill_house_request_total_non_receipt_count": return_kill_house_requests_aggregates[
'total_non_receipt_count'] or 0,
"kill_house_request_total_system_return_count": return_kill_house_requests_aggregates[
'total_system_return_count'] or 0,
"kill_house_request_total_quantity": return_kill_house_requests_aggregates['total_quantity'] or 0,
"kill_house_request_total_non_receipt_quantity": return_kill_house_requests_aggregates[
'total_non_receipt_quantity'] or 0,
"kill_house_request_total_system_return_quantity": return_kill_house_requests_aggregates[
'total_system_return_quantity'] or 0,
"kill_house_request_total_weight": return_kill_house_requests_aggregates['total_weight'] or 0,
"kill_house_request_total_non_receipt_weight": return_kill_house_requests_aggregates[
'total_non_receipt_weight'] or 0,
"kill_house_request_total_system_return_weight": kill_house_request_total_system_return_weight,
"total_return_weight_with_wage": total_return_weight_with_wage,
"total_return_wage": total_return_weight_with_wage * province_live_wage_type_amount,
}
return Response(result, status=status.HTTP_200_OK)
# class KillHouseRemainWeightViewSet(GenericAPIView):
# permission_classes = [TokenHasReadWriteScope]
#
# def get(self, request):
# # چک کردن آیا کاربر بازه تاریخی دلخواه فرستاده یا نه
# start_date_param = request.query_params.get('date1', None)
# end_date_param = request.query_params.get('date2', None)
#
# if start_date_param and end_date_param:
# # بازه تاریخی دلخواه از ورودی کاربر
# user = SystemUserProfile.objects.get(user=request.user, trash=False)
# kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
# product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
#
# # تبدیل string به date
# from datetime import datetime as dt
# start_date = dt.strptime(start_date_param, '%Y-%m-%d').date()
# end_date = dt.strptime(end_date_param, '%Y-%m-%d').date()
#
# # ساخت لیست تمام روزهای بین start_date و end_date
# days = []
# current_day = start_date
# while current_day <= end_date:
# days.append(current_day)
# current_day += timedelta(days=1)
#
# kill_house_requests = KillHouseRequest.objects.filter(
# input_warehouse=kill_house,
# kill_request__recive_date__date__gte=start_date,
# kill_request__recive_date__date__lte=end_date,
# ware_house_confirmation=True,
# trash=False,
# calculate_status=True,
# warehouse=True
# )
#
# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(
# trash=False,
# calculate_status=True,
# warehouse=True,
# date__date__gte=start_date,
# date__date__lte=end_date,
# input_warehouse=kill_house
# ).exclude(entered_message='ورود به انبار مجازی')
#
# kill_house_allocations = StewardAllocation.objects.filter(
# kill_house=kill_house,
# trash=False,
# calculate_status=True,
# warehouse=True,
# receiver_state__in=('pending', 'accepted'),
# production_date__date__gte=start_date,
# production_date__date__lte=end_date
# )
#
# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(
# kill_house=kill_house,
# production_date__date__gte=start_date,
# production_date__date__lte=end_date,
# trash=False,
# calculate_status=True,
# warehouse=True
# )
#
# segmentations = PosSegmentation.objects.filter(
# kill_house=kill_house,
# production_date__date__gte=start_date,
# production_date__date__lte=end_date,
# trash=False,
# warehouse=True
# )
#
# transactions = ProductsTransactions.objects.filter(
# product=product,
# transaction__paid=True,
# transaction__date__date__gte=start_date,
# transaction__date__date__lte=end_date,
# trash=False,
# warehouse=True
# )
#
# governmental_list = []
# free_list = []
# final_dict = {}
#
# for day in days:
# kill_house_requests_info = kill_house_requests.aggregate(
# total_kill_house_request_governmental_weight=Sum(
# 'ware_house_accepted_real_weight',
# filter=Q(province_request__poultry_request__free_sale_in_province=False,
# kill_request__recive_date__date=day)
# ),
# total_kill_house_request_free_weight=Sum(
# 'ware_house_accepted_real_weight',
# filter=Q(province_request__poultry_request__free_sale_in_province=True,
# kill_request__recive_date__date=day)
# ),
# )
#
# kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate(
# total_kill_house_free_buying_bars_weight=Sum(
# 'weight_of_carcasses', filter=Q(date__date=day)
# )
# )
#
# kill_house_allocations_info = kill_house_allocations.aggregate(
# total_kill_house_allocations_governmental_weight=Sum(
# 'real_weight_of_carcasses',
# filter=Q(quota='governmental', production_date__date=day)
# ),
# total_kill_house_allocations_free_weight=Sum(
# 'real_weight_of_carcasses',
# filter=Q(quota='free', production_date__date=day)
# ),
# )
#
# kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate(
# total_kill_house_free_sale_bars_governmental_weight=Sum(
# 'real_weight_of_carcasses',
# filter=Q(quota='governmental', production_date__date=day)
# ),
# total_kill_house_free_sale_bars_free_weight=Sum(
# 'real_weight_of_carcasses',
# filter=Q(quota='free', production_date__date=day)
# ),
# )
#
# segmentations_info = segmentations.aggregate(
# segmentations_governmental_weight=Sum(
# 'weight', filter=Q(quota='governmental', production_date__date=day)
# ),
# segmentations_free_weight=Sum(
# 'weight', filter=Q(quota='free', production_date__date=day)
# ),
# )
#
# pos_allocated_weight_info = transactions.aggregate(
# pos_governmental_allocated_weight=Sum(
# 'cur_weight', filter=Q(price_approved=True, transaction__date__date=day)
# ),
# pos_free_allocated_weight=Sum(
# 'cur_weight', filter=Q(price_approved=False, transaction__date__date=day)
# ),
# )
#
# total_kill_house_request_governmental_weight = kill_house_requests_info[
# 'total_kill_house_request_governmental_weight'] or 0
# total_kill_house_request_free_weight = kill_house_requests_info[
# 'total_kill_house_request_free_weight'] or 0
# total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[
# 'total_kill_house_free_buying_bars_weight'] or 0
# total_kill_house_allocations_governmental_weight = kill_house_allocations_info[
# 'total_kill_house_allocations_governmental_weight'] or 0
# total_kill_house_allocations_free_weight = kill_house_allocations_info[
# 'total_kill_house_allocations_free_weight'] or 0
# total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[
# 'total_kill_house_free_sale_bars_governmental_weight'] or 0
# total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[
# 'total_kill_house_free_sale_bars_free_weight'] or 0
# segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0
# segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0
# pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0
# pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0
#
# total_governmental_input = total_kill_house_request_governmental_weight
# total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight
#
# total_governmental_output = (
# total_kill_house_allocations_governmental_weight +
# total_kill_house_free_sale_bars_governmental_weight +
# segmentations_governmental_weight +
# int(pos_governmental_allocated_weight / 1000)
# )
#
# total_free_output = (
# total_kill_house_allocations_free_weight +
# total_kill_house_free_sale_bars_free_weight +
# segmentations_free_weight +
# int(pos_free_allocated_weight / 1000)
# )
#
# governmental_data = {
# 'day': day,
# 'amount': total_governmental_input - total_governmental_output,
# }
# free_data = {
# 'day': day,
# 'amount': total_free_input - total_free_output,
# }
#
# governmental_list.append(governmental_data)
# free_list.append(free_data)
#
# final_dict['governmental'] = governmental_list
# final_dict['free'] = free_list
# return Response(final_dict, status=status.HTTP_200_OK)
#
# # حالت پیش‌فرض: 3 روز اخیر (کد قبلی دست نخورده)
# user = SystemUserProfile.objects.get(user=request.user, trash=False)
# kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
# product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
# today = datetime.now().date()
# yesterday = today - timedelta(days=1)
# two_days_ago = yesterday - timedelta(days=1)
# days = (two_days_ago, yesterday, today)
#
# archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False,date__date__gte=two_days_ago,date__date__lte=today)
#
#
# kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=kill_house,
# kill_request__recive_date__date__gte=two_days_ago,
# kill_request__recive_date__date__lte=today,
# ware_house_confirmation=True, trash=False,
# calculate_status=True, warehouse=True)
# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(trash=False,
# calculate_status=True, warehouse=True,
# date__date__gte=two_days_ago,
# date__date__lte=today,
# input_warehouse=kill_house) \
# .exclude(entered_message='ورود به انبار مجازی')
# kill_house_allocations = StewardAllocation.objects.filter(
# kill_house=kill_house, trash=False, calculate_status=True, warehouse=True,
# receiver_state__in=('pending', 'accepted'), production_date__date__gte=two_days_ago,
# production_date__date__lte=today)
#
# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house,
# production_date__date__gte=two_days_ago,
# production_date__date__lte=today,
# trash=False,
# calculate_status=True,
# warehouse=True)
# segmentations = PosSegmentation.objects.filter(kill_house=kill_house, production_date__date__gte=two_days_ago,
# production_date__date__lte=today, trash=False,
# warehouse=True)
# transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True,
# transaction__date__date__gte=two_days_ago,
# transaction__date__date__lte=today, trash=False,
# warehouse=True)
#
# governmental_list = []
# free_list = []
# final_dict = {}
#
# for day in days:
# kill_house_requests_info = kill_house_requests.aggregate(
# total_kill_house_request_governmental_weight=Sum('ware_house_accepted_real_weight', filter=Q(
# province_request__poultry_request__free_sale_in_province=False,
# kill_request__recive_date__date=day)),
# total_kill_house_request_free_weight=Sum('ware_house_accepted_real_weight', filter=Q(
# province_request__poultry_request__free_sale_in_province=True,
# kill_request__recive_date__date=day)),
#
# )
#
# kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate(
# total_kill_house_free_buying_bars_weight=Sum('weight_of_carcasses', filter=Q(date__date=day)))
#
# kill_house_allocations_info = kill_house_allocations.aggregate(
# total_kill_house_allocations_governmental_weight=Sum('real_weight_of_carcasses',
# filter=Q(quota='governmental',
# production_date__date=day)),
# total_kill_house_allocations_free_weight=Sum('real_weight_of_carcasses',
# filter=Q(quota='free', production_date__date=day)),
#
# )
#
# kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate(
# total_kill_house_free_sale_bars_governmental_weight=Sum('real_weight_of_carcasses',
# filter=Q(quota='governmental',
# production_date__date=day)),
# total_kill_house_free_sale_bars_free_weight=Sum('real_weight_of_carcasses',
# filter=Q(quota='free', production_date__date=day)),
#
# )
#
# segmentations_info = segmentations.aggregate(
# segmentations_governmental_weight=Sum('weight',
# filter=Q(quota='governmental', production_date__date=day)),
# segmentations_free_weight=Sum('weight', filter=Q(quota='free', production_date__date=day)),
#
# )
# pos_allocated_weight_info = transactions.aggregate(
# pos_governmental_allocated_weight=Sum('cur_weight',
# filter=Q(price_approved=True, transaction__date__date=day)),
# pos_free_allocated_weight=Sum('cur_weight',
# filter=Q(price_approved=False, transaction__date__date=day)),
#
# )
#
# archives_info = archives.aggregate(
# archives_governmental_weight=Sum('weight',
# filter=Q(quota='governmental', date__date=day)),
# archives_free_weight=Sum('weight',
# filter=Q(quota='free', date__date=day)),
#
# )
#
# total_kill_house_request_governmental_weight = kill_house_requests_info[
# 'total_kill_house_request_governmental_weight'] or 0
# total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0
# total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info[
# 'total_kill_house_free_buying_bars_weight'] or 0
# total_kill_house_allocations_governmental_weight = kill_house_allocations_info[
# 'total_kill_house_allocations_governmental_weight'] or 0
# total_kill_house_allocations_free_weight = kill_house_allocations_info[
# 'total_kill_house_allocations_free_weight'] or 0
# total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info[
# 'total_kill_house_free_sale_bars_governmental_weight'] or 0
# total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info[
# 'total_kill_house_free_sale_bars_free_weight'] or 0
# segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0
# segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0
# pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0
# pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0
#
# archives_governmental_weight = archives_info['archives_governmental_weight'] or 0
# archives_free_weight = archives_info['archives_free_weight'] or 0
#
# total_governmental_input = total_kill_house_request_governmental_weight
# total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight
# total_governmental_output = total_kill_house_allocations_governmental_weight + total_kill_house_free_sale_bars_governmental_weight + segmentations_governmental_weight + int(
# pos_governmental_allocated_weight / 1000)
# total_free_output = total_kill_house_allocations_free_weight + total_kill_house_free_sale_bars_free_weight + segmentations_free_weight + int(
# pos_free_allocated_weight / 1000)
# governmental_data = {
# 'day': day,
# 'amount': (total_governmental_input - total_governmental_output) - archives_governmental_weight,
# }
# free_data = {
# 'day': day,
# 'amount': (total_free_input - total_free_output) - archives_free_weight,
# }
#
# governmental_list.append(governmental_data)
# free_list.append(free_data)
# final_dict['governmental'] = governmental_list
# final_dict['free'] = free_list
# return Response(final_dict, status=status.HTTP_200_OK)
#
# # def get(self, request):
# # target_date = request.GET.get('date')
# # user = SystemUserProfile.objects.get(user=request.user, trash=False)
# #
# # kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
# #
# # product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
# #
# # today = datetime.now().date() if not target_date else datetime.strptime(target_date, "%Y-%m-%d").date()
# # month_ago = today - timedelta(days=30)
# # yesterday = today - timedelta(days=1)
# # two_days_ago = yesterday - timedelta(days=1)
# #
# # days = [month_ago + timedelta(days=i) for i in range(31)]
# # target_days = [two_days_ago ,yesterday , today]
# #
# # kill_house_requests = KillHouseRequest.objects.filter(
# # input_warehouse=kill_house,
# # kill_request__recive_date__date__gte=month_ago,
# # kill_request__recive_date__date__lte=today,
# # ware_house_confirmation=True,
# # trash=False,
# # calculate_status=True,
# # warehouse=True
# # )
# #
# # kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(
# # trash=False,
# # calculate_status=True,
# # warehouse=True,
# # date__date__gte=month_ago,
# # date__date__lte=today,
# # input_warehouse=kill_house
# # ).exclude(entered_message='ورود به انبار مجازی')
# #
# # kill_house_allocations = StewardAllocation.objects.filter(
# # kill_house=kill_house,
# # trash=False,
# # calculate_status=True,
# # warehouse=True,
# # receiver_state__in=('pending', 'accepted'),
# # production_date__date__gte=month_ago,
# # production_date__date__lte=today
# # )
# #
# # kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(
# # kill_house=kill_house,
# # production_date__date__gte=month_ago,
# # production_date__date__lte=today,
# # trash=False,
# # calculate_status=True,
# # warehouse=True
# # )
# #
# # segmentations = PosSegmentation.objects.filter(
# # kill_house=kill_house,
# # production_date__date__gte=month_ago,
# # production_date__date__lte=today,
# # trash=False,
# # warehouse=True
# # )
# #
# # transactions = ProductsTransactions.objects.filter(
# # product=product,
# # transaction__paid=True,
# # transaction__date__date__gte=month_ago,
# # transaction__date__date__lte=today,
# # trash=False,
# # warehouse=True
# # )
# # archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False)
# #
# #
# # governmental_list = []
# # free_list = []
# # final_dict = {}
# #
# # for day in days:
# # kill_house_requests_info = kill_house_requests.aggregate(
# # total_kill_house_request_governmental_weight=Sum(
# # 'ware_house_accepted_real_weight',
# # filter=Q(province_request__poultry_request__free_sale_in_province=False,
# # kill_request__recive_date__date=day)
# # ),
# # total_kill_house_request_free_weight=Sum(
# # 'ware_house_accepted_real_weight',
# # filter=Q(province_request__poultry_request__free_sale_in_province=True,
# # kill_request__recive_date__date=day)
# # ),
# # )
# #
# # kill_house_free_buying_bars_info = kill_house_free_buying_bars.aggregate(
# # total_kill_house_free_buying_bars_weight=Sum(
# # 'weight_of_carcasses', filter=Q(date__date=day)
# # )
# # )
# #
# # kill_house_allocations_info = kill_house_allocations.aggregate(
# # total_kill_house_allocations_governmental_weight=Sum(
# # 'real_weight_of_carcasses',
# # filter=Q(quota='governmental', production_date__date=day)
# # ),
# # total_kill_house_allocations_free_weight=Sum(
# # 'real_weight_of_carcasses',
# # filter=Q(quota='free', production_date__date=day)
# # ),
# # )
# #
# # kill_house_free_sale_bars_info = kill_house_free_sale_bars.aggregate(
# # total_kill_house_free_sale_bars_governmental_weight=Sum(
# # 'real_weight_of_carcasses',
# # filter=Q(quota='governmental', production_date__date=day)
# # ),
# # total_kill_house_free_sale_bars_free_weight=Sum(
# # 'real_weight_of_carcasses',
# # filter=Q(quota='free', production_date__date=day)
# # ),
# # )
# #
# # segmentations_info = segmentations.aggregate(
# # segmentations_governmental_weight=Sum(
# # 'weight', filter=Q(quota='governmental', production_date__date=day)
# # ),
# # segmentations_free_weight=Sum(
# # 'weight', filter=Q(quota='free', production_date__date=day)
# # ),
# # )
# #
# # pos_allocated_weight_info = transactions.aggregate(
# # pos_governmental_allocated_weight=Sum(
# # 'cur_weight', filter=Q(price_approved=True, transaction__date__date=day)
# # ),
# # pos_free_allocated_weight=Sum(
# # 'cur_weight', filter=Q(price_approved=False, transaction__date__date=day)
# # ),
# # )
# #
# # archives_info = archives.aggregate(
# # total_archive_governmental_weight=Sum('weight', filter=Q(date__date=day, quota='governmental')),
# # total_archive_free_weight=Sum('weight', filter=Q(date__date=day, quota='free')),
# # )
# #
# # total_kill_house_request_governmental_weight = kill_house_requests_info['total_kill_house_request_governmental_weight'] or 0
# # total_kill_house_request_free_weight = kill_house_requests_info['total_kill_house_request_free_weight'] or 0
# # total_kill_house_free_buying_bars_weight = kill_house_free_buying_bars_info['total_kill_house_free_buying_bars_weight'] or 0
# # total_kill_house_allocations_governmental_weight = kill_house_allocations_info['total_kill_house_allocations_governmental_weight'] or 0
# # total_kill_house_allocations_free_weight = kill_house_allocations_info['total_kill_house_allocations_free_weight'] or 0
# # total_kill_house_free_sale_bars_governmental_weight = kill_house_free_sale_bars_info['total_kill_house_free_sale_bars_governmental_weight'] or 0
# # total_kill_house_free_sale_bars_free_weight = kill_house_free_sale_bars_info['total_kill_house_free_sale_bars_free_weight'] or 0
# # segmentations_governmental_weight = segmentations_info['segmentations_governmental_weight'] or 0
# # segmentations_free_weight = segmentations_info['segmentations_free_weight'] or 0
# # pos_governmental_allocated_weight = pos_allocated_weight_info['pos_governmental_allocated_weight'] or 0
# # pos_free_allocated_weight = pos_allocated_weight_info['pos_free_allocated_weight'] or 0
# # total_archive_governmental_weight = archives_info['total_archive_governmental_weight'] or 0
# # total_archive_free_weight = archives_info['total_archive_free_weight'] or 0
# #
# # total_governmental_input = total_kill_house_request_governmental_weight
# # total_free_input = total_kill_house_request_free_weight + total_kill_house_free_buying_bars_weight
# #
# # total_governmental_output = (
# # total_kill_house_allocations_governmental_weight +
# # total_kill_house_free_sale_bars_governmental_weight +
# # segmentations_governmental_weight +
# # int(pos_governmental_allocated_weight / 1000)
# # )
# #
# # total_free_output = (
# # total_kill_house_allocations_free_weight +
# # total_kill_house_free_sale_bars_free_weight +
# # segmentations_free_weight +
# # int(pos_free_allocated_weight / 1000)
# # )
# #
# # governmental_amount = (
# # total_governmental_input - total_governmental_output) - total_archive_governmental_weight
# # free_amount = (total_free_input - total_free_output) - total_archive_free_weight
# #
# # governmental_data = {
# # 'day': day,
# # 'amount': governmental_amount,
# # 'active': True if day in target_days else False,
# # }
# # free_data = {
# # 'day': day,
# # 'amount': free_amount,
# # 'active': True if day in target_days else False,
# # }
# #
# # governmental_list.append(governmental_data)
# # free_list.append(free_data)
# #
# # final_dict['governmental'] = governmental_list
# # final_dict['free'] = free_list
# #
# # return Response(final_dict, status=status.HTTP_200_OK)
class KillHouseRemainWeightViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
def get(self, request):
target_date = request.GET.get('date')
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user).first()
product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
today = datetime.now().date() if not target_date else datetime.strptime(target_date, "%Y-%m-%d").date()
month_ago = today - timedelta(days=30)
yesterday = today - timedelta(days=1)
two_days_ago = yesterday - timedelta(days=1)
days = [month_ago + timedelta(days=i) for i in range(31)]
target_days = {two_days_ago, yesterday, today}
req_vals = list(
KillHouseRequest.objects.filter(
input_warehouse=kill_house,
kill_request__recive_date__date__gte=month_ago,
kill_request__recive_date__date__lte=today,
ware_house_confirmation=True,
trash=False,
calculate_status=True,
warehouse=True
).values(
"kill_request__recive_date__date",
"ware_house_accepted_real_weight",
"province_request__poultry_request__free_sale_in_province"
)
)
free_buy_vals = list(
KillHouseFreeBarInformation.objects.filter(
trash=False,
calculate_status=True,
warehouse=True,
date__date__gte=month_ago,
date__date__lte=today,
input_warehouse=kill_house
).exclude(entered_message='ورود به انبار مجازی')
.values("date__date", "weight_of_carcasses")
)
alloc_vals = list(
StewardAllocation.objects.filter(
kill_house=kill_house,
trash=False,
calculate_status=True,
warehouse=True,
receiver_state__in=('pending', 'accepted'),
production_date__date__gte=month_ago,
production_date__date__lte=today
).values(
"production_date__date",
"quota",
"real_weight_of_carcasses"
)
)
free_sale_vals = list(
KillHouseFreeSaleBarInformation.objects.filter(
kill_house=kill_house,
production_date__date__gte=month_ago,
production_date__date__lte=today,
trash=False,
calculate_status=True,
warehouse=True
).values("production_date__date", "quota", "real_weight_of_carcasses")
)
seg_vals = list(
PosSegmentation.objects.filter(
kill_house=kill_house,
production_date__date__gte=month_ago,
production_date__date__lte=today,
trash=False,
warehouse=True
).values("production_date__date", "quota", "weight")
)
pos_vals = list(
ProductsTransactions.objects.filter(
product=product,
transaction__paid=True,
transaction__date__date__gte=month_ago,
transaction__date__date__lte=today,
trash=False,
warehouse=True
).values(
"transaction__date__date",
"price_approved",
"cur_weight"
)
)
arch_vals = list(
WarehouseArchive.objects.filter(
kill_house=kill_house,
warehouse=True,
trash=False
).values("date__date", "quota", "weight")
)
req_daily = {}
for r in req_vals:
d = r["kill_request__recive_date__date"]
w = r["ware_house_accepted_real_weight"] or 0
if d not in req_daily:
req_daily[d] = {"governmental": 0, "free": 0}
if r["province_request__poultry_request__free_sale_in_province"]:
req_daily[d]["free"] += w
else:
req_daily[d]["governmental"] += w
free_buy_daily = {}
for r in free_buy_vals:
d = r["date__date"]
w = r["weight_of_carcasses"] or 0
free_buy_daily[d] = free_buy_daily.get(d, 0) + w
alloc_daily = {}
for r in alloc_vals:
d = r["production_date__date"]
w = r["real_weight_of_carcasses"] or 0
q = r["quota"]
if d not in alloc_daily:
alloc_daily[d] = {"governmental": 0, "free": 0}
alloc_daily[d][q] += w
free_sale_daily = {}
for r in free_sale_vals:
d = r["production_date__date"]
w = r["real_weight_of_carcasses"] or 0
q = r["quota"]
if d not in free_sale_daily:
free_sale_daily[d] = {"governmental": 0, "free": 0}
free_sale_daily[d][q] += w
seg_daily = {}
for r in seg_vals:
d = r["production_date__date"]
w = r["weight"] or 0
q = r["quota"]
if d not in seg_daily:
seg_daily[d] = {"governmental": 0, "free": 0}
seg_daily[d][q] += w
pos_daily = {}
for r in pos_vals:
d = r["transaction__date__date"]
w = r["cur_weight"] or 0
if d not in pos_daily:
pos_daily[d] = {"governmental": 0, "free": 0}
if r["price_approved"]:
pos_daily[d]["governmental"] += w
else:
pos_daily[d]["free"] += w
arch_daily = {}
for r in arch_vals:
d = r["date__date"]
w = r["weight"] or 0
q = r["quota"]
if d not in arch_daily:
arch_daily[d] = {"governmental": 0, "free": 0}
arch_daily[d][q] += w
governmental_list = []
free_list = []
for day in days:
gov_in = req_daily.get(day, {}).get("governmental", 0)
free_in = req_daily.get(day, {}).get("free", 0) + free_buy_daily.get(day, 0)
gov_out = (
alloc_daily.get(day, {}).get("governmental", 0) +
free_sale_daily.get(day, {}).get("governmental", 0) +
seg_daily.get(day, {}).get("governmental", 0) +
(pos_daily.get(day, {}).get("governmental", 0) // 1000)
)
free_out = (
alloc_daily.get(day, {}).get("free", 0) +
free_sale_daily.get(day, {}).get("free", 0) +
seg_daily.get(day, {}).get("free", 0) +
(pos_daily.get(day, {}).get("free", 0) // 1000)
)
gov_remain = gov_in - gov_out - arch_daily.get(day, {}).get("governmental", 0)
free_remain = free_in - free_out - arch_daily.get(day, {}).get("free", 0)
governmental_list.append({
"day": day,
"amount": gov_remain if gov_remain > 0 else 0,
"active": day in target_days,
})
free_list.append({
"day": day,
"amount": free_remain if free_remain > 0 else 0,
"active": day in target_days,
})
return Response({
"governmental": governmental_list,
"free": free_list
}, status=status.HTTP_200_OK)
# class TotalKillHouseRemainWeightViewSet(GenericAPIView):
# permission_classes = [TokenHasReadWriteScope]
# serializer_class = TotalKillHouseRemainWeightViewSetSerializer
# pagination_class = CustomPagination
# filter_backends = [DjangoFilterBackend]
# filterset_class = KillHouseFilterSet
# filterset_fields = [
# 'name',
# 'kill_house_operator__user__mobile',
# 'kill_house_operator__user__fullname',
# 'kill_house_operator__user__first_name',
# 'kill_house_operator__user__last_name'
#
# ]
#
# def get(self, request):
#
# kill_house_filters = {'out_province': False, 'trash': False, 'total_remain_warehouse_weight__gt': 0}
# kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer')
#
# if 'search' in request.GET:
# kill_house_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=kill_houses
# )
# ).filter():
# ps = self.filterset_class(data=query, queryset=kill_houses)
# kill_house_list = ps.filter()
# kill_houses = [] if len(
# kill_house_list) == 0 else kill_house_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(kill_houses)
# if page is not None:
# serializer = self.get_serializer(page, many=True)
# return self.get_paginated_response(serializer.data)
#
# serializer = self.serializer_class(kill_houses, many=True)
# return Response(serializer.data, status=status.HTTP_200_OK)
class TotalKillHouseRemainWeightViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = TotalKillHouseRemainWeightViewSetSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
quota = request.GET.get("quota")
kill_house_filters = {'out_province': False, 'trash': False, 'total_remain_warehouse_weight__gt': 0}
kill_houses = KillHouse.objects.filter(**kill_house_filters).order_by('id', 'killer')
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_list
all_data = TotalKillHouseRemainWeightViewSetSerializer(kill_houses, many=True).data
if quota in ("governmental", "free"):
filtered = []
today = datetime.today().date()
two_days_ago = today - timedelta(days=2)
for item in all_data:
info = item.get("info")
if not info:
continue
for row in info.get(quota, []):
day = row["day"]
amount = row["amount"]
if amount > 0 and day < two_days_ago:
filtered.append(item)
break
all_data = filtered
page_size = request.query_params.get('page_size', None)
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(all_data)
if page is not None:
# serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(page)
# serializer = self.serializer_class(kill_houses, many=True)
return Response(all_data, status=status.HTTP_200_OK)
class TotalKillHouseWarehouseArchiveDashboardViewSet(GenericAPIView):
permission_classes = [TokenHasReadWriteScope]
serializer_class = TotalKillHouseWarehouseArchiveDashboardSerializer
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = KillHouseFilterSet
filterset_fields = [
'name',
'kill_house_operator__user__mobile',
'kill_house_operator__user__fullname',
'kill_house_operator__user__first_name',
'kill_house_operator__user__last_name'
]
def get(self, request):
date1 = request.GET.get('date1')
date2 = request.GET.get('date2')
archives_filters = {"trash": False, "kill_house__isnull": False}
if date1:
archives_filters['create_date__date__gte'] = date1
archives_filters['create_date__date__lte'] = date2
archives = WarehouseArchive.objects.filter(**archives_filters)
kill_houses = KillHouse.objects.filter(id__in=archives.values_list('kill_house__id', flat=True), trash=False)
if 'search' in request.GET:
kill_house_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=kill_houses
)
).filter():
ps = self.filterset_class(data=query, queryset=kill_houses)
kill_house_list = ps.filter()
kill_houses = [] if len(
kill_house_list) == 0 else kill_house_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(kill_houses)
if page is not None:
serializer = self.get_serializer(page, many=True, context={'date1': date1, 'date2': date2})
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(kill_houses, many=True, context={'date1': date1, 'date2': date2})
return Response(serializer.data, status=status.HTTP_200_OK)
def fix_wage(request):
kill_house_requests = KillHouseRequest.objects.filter(trash=True, return_trash=True)
kill_house_requests_values = kill_house_requests.values_list('province_kill_request__id', flat=True).distinct()
province_requests = ProvinceKillRequest.objects.filter(trash=True, id__in=kill_house_requests_values,
return_trash=True)
return HttpResponse(province_requests.count())
class KillHouseLock(APIView):
def get(self, request):
wage_lock = False
ware_house_lock = False
user = SystemUserProfile.objects.get(user=request.user, trash=False)
kill_house = KillHouse.objects.filter(kill_house_operator__user=user, trash=False).first()
kill_house_purchase = KillHousePurchaseRequest.objects.filter(kill_house=kill_house).first()
total_unpaid_wage = get_finance_info(kill_house)['total_price']
slaughter_transactions = InternalTransaction.objects.filter(Q(kill_house=kill_house) | Q(parent_kill_house=kill_house),
status='completed',
trash=False)
total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[
'total'] or 0
total_unpaid_wage -= total_paid_wage
if kill_house_purchase:
if kill_house_purchase.limitation == True:
if kill_house_purchase.limitation_number <= total_unpaid_wage:
wage_lock = True
if kill_house.ware_house_remaining_weight_limitation_status:
if kill_house.total_remain_warehouse_governmental_weight > kill_house.ware_house_remaining_weight_limitation:
ware_house_lock = True
if kill_house.ware_house_remaining_percent_limitation_status:
if not check_kill_house_remain_limitation_weight(kill_house):
ware_house_lock = True
result = {
'wage': total_unpaid_wage,
'wage_lock': wage_lock,
'ware_house_lock': ware_house_lock
}
return Response (result,status=status.HTTP_200_OK)