first push

This commit is contained in:
2026-01-18 11:45:53 +03:30
commit 6bcd71d9ec
702 changed files with 272997 additions and 0 deletions

View File

View File

@@ -0,0 +1,679 @@
import datetime
from io import BytesIO
from django.db.models import Sum, Q, F
from openpyxl import Workbook
from openpyxl.styles import Alignment
from django.http import HttpResponse
from panel.helper_excel import shamsi_date, create_header, excel_description, create_header_freez, create_value
from panel.models import Poultry, PoultryHatching, VetFarm, PoultryRequest, KillHouseRequest
def technical_responsible_performance_excel(request):
vat_farm = VetFarm.objects.filter(trash=False, poultry__isnull=False, vet__key=request.GET.get('key'))
poultry_id = vat_farm.values_list('poultry__id', flat=True).distinct()
poultries = Poultry.objects.filter(id__in=poultry_id, trash=False)
excel_options = [
'ردیف',
'دامپزشک فارم',
'تلفن دامپزشک فارم',
'نام واحد',
'نام و خانوادگی مالک',
'تلفن مالک',
'جوجه ریزی فعال',
'تعداد دوره جوجه ریزی',
'مجموع جوجه ریزی',
'تعداد درخواست کشتار',
'حجم درخواست کشتار',
'وزن درخواست کشتار',
'میانگین وزنی درخواست کشتار',
'تعداد بار',
'حجم بار',
'وزن بارها',
'تعداد بارهای دارای مجوز قرنطینه',
'حجم بارهای دارای کد قرنطینه',
'وزن بارهای دارای کد قرنطینه',
'تعداد بارهای فاقد مجوز قرنطینه',
'حجم بارهای فاقد کد قرنطینه',
'وزن بارهای فاقد کد قرنطینه',
'تعداد بارهای مغایرت دار',
'حجم بارهای مغایرت دار',
'وزن بارهای مغایرت دار',
'تعداد بار خارج استان',
'حجم بار خارج استان',
'وزن بار خارج استان',
'میانگین وزن خارج از استان',
]
date1 = datetime.datetime.now().date()
from_date_1 = shamsi_date(date1)
output = BytesIO()
workbook = Workbook()
worksheet = workbook.active
worksheet.sheet_view.rightToLeft = True
worksheet.insert_rows(1)
cell = worksheet.cell(row=1, column=1)
cell.alignment = Alignment(horizontal='center', vertical='center')
header_list = [
'تعداد واحد تحت نظر',
'مجموع جوجه ریزی تحت نظر',
'مجموع درخواست کشتار',
'مجموع حجم درخواست کشتار',
'مجموع وزن درخواست کشتار',
'مجموع تعداد بارها',
'مجموع حجم بارها',
'مجموع وزن بارها',
'مجموع تعداد بارهای قرنطینه شده',
'مجموع حجم بارهای قرنطینه شده',
'مجموع وزن بارهای قرنطینه شده',
'مجموع تعداد بارهای فاقد قرنطینه',
'مجموع حجم بارهای فاقد قرنطینه',
'مجموع وزن بارهای فاقد قرنطینه نشده',
'مجموع تعداد بارهای دارای مغایرت',
'مجموع حجم بارهای دارای مغایرت',
'مجموع وزن بارهای دارای مغایرت',
'مجموع تعداد بارهای خارج استان',
'مجموع حجم بارهای خارج استان',
'مجموع وزن بارهای خارج استان',
'مجموع وزن تقریبی بارهای خارج استان',
]
header_list2 = [
'درصد قرنطینه سازی بارها',
'درصد عدم قرنطینه سازی بارها',
]
excel_description(worksheet, 'A2', 'عملکرد مسئول فنی', color='red', row2='B2')
vat_farm = vat_farm.first()
description = f'{vat_farm.vet.user.fullname}/{vat_farm.vet.user.mobile}'
excel_description(worksheet, 'A3', description, color='red', row2='B3')
create_header(worksheet, header_list, 3, 2, height=20, color='green')
create_header_freez(worksheet, excel_options, 1, 5, 6, height=22)
l = 6
m = 1
poultry_hatchings = PoultryHatching.objects.filter(poultry__in=poultries, trash=False).only('quantity', 'left_over'
)
poultry_requests = PoultryRequest.objects.filter(trash=False, poultry__in=poultries,
state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending')).only('quantity',
'Index_weight')
kill_requests = KillHouseRequest.objects.filter(trash=False,
province_request__poultry_request__in=poultry_requests).only(
'accepted_real_quantity', 'accepted_real_weight')
out_poultry_requests = poultry_requests.filter(out=True, out_province_request_cancel=False).only(
'quantity', 'Index_weight'
)
for poultry in poultries:
poultry_hatching = poultry_hatchings.filter(poultry=poultry)
poultry_hatching_pending = poultry_hatching.filter(state='pending', allow_hatching='pending',
archive=False).last()
hatching = 'ندارد' if not poultry_hatching_pending else f'دارد'
period='-'
if poultry_hatching_pending:
period = poultry_hatching_pending.period
else:
if poultry_hatching:
period = poultry_hatching.last().period
total_quantity = \
poultry_hatching.aggregate(total=Sum('quantity'))[
'total'] or 0
poultry_request = poultry_requests.filter(poultry=poultry)
total_quantity_poultry_request = \
poultry_request.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request = \
poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
total_index_weight_poultry_request = \
poultry_request.aggregate(total=Sum('Index_weight'))[
'total'] or 0
index_weight = round(total_index_weight_poultry_request / len(poultry_request), 2) if len(
poultry_request) > 0 else 0
kill_request = kill_requests.filter(province_request__poultry_request__in=poultry_request)
kill_request_quantity = kill_request.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight = kill_request.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
has_code = kill_request.filter(clearance_code__isnull=False)
kill_request_quantity_has_code = has_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_has_code = has_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
hasnt_code = kill_request.filter(clearance_code__isnull=True)
kill_request_quantity_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
deffrent_bar = kill_request.filter(
~Q(quantity=F('quarantine_quantity')
, quarantine_quantity__isnull=False))
kill_request_quantity_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
out_poultry_request = out_poultry_requests.filter(poultry=poultry)
total_quantity_poultry_request_out = \
out_poultry_request.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request_out = \
out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
total_index_weight_poultry_request_out = \
out_poultry_request.aggregate(total=Sum('Index_weight'))[
'total'] or 0
index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_request), 2) if len(
out_poultry_request) > 0 else 0
list1 = [
m,
vat_farm.vet.user.fullname,
vat_farm.vet.user.mobile,
poultry.unit_name,
poultry.user.fullname,
poultry.user.mobile,
hatching,
period,
total_quantity,
len(poultry_request),
total_quantity_poultry_request,
total_weight_poultry_request,
index_weight,
len(kill_request),
kill_request_quantity,
kill_request_weight,
len(has_code),
kill_request_quantity_has_code,
kill_request_weight_has_code,
len(hasnt_code),
kill_request_quantity_hasnt_code,
kill_request_weight_hasnt_code,
len(deffrent_bar),
kill_request_quantity_deffrent_bar,
kill_request_weight_deffrent_bar,
len(out_poultry_request),
total_quantity_poultry_request_out,
total_weight_poultry_request_out,
index_weight_out,
]
create_value(worksheet, list1, l, 1)
m += 1
l += 1
total_quantity = \
poultry_hatchings.aggregate(total=Sum('quantity'))[
'total'] or 0
total_quantity_poultry_request = \
poultry_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request = \
poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
kill_request_quantity = kill_requests.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight = kill_requests.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
has_code = kill_requests.filter(clearance_code__isnull=False)
kill_request_quantity_has_code = has_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_has_code = has_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
deffrent_bar = kill_requests.filter(
~Q(quantity=F('quarantine_quantity')
, quarantine_quantity__isnull=False))
kill_request_quantity_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
hasnt_code = kill_requests.filter(clearance_code__isnull=True)
kill_request_quantity_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
total_quantity_poultry_request_out = \
out_poultry_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request_out = \
out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
total_index_weight_poultry_request_out = \
out_poultry_requests.aggregate(total=Sum('Index_weight'))[
'total'] or 0
index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_requests), 2) if len(
out_poultry_requests) > 0 else 0
list2 = [
'مجموع==>',
'',
'',
'',
'',
'',
'',
'',
total_quantity,
len(poultry_requests),
total_quantity_poultry_request,
total_weight_poultry_request,
'',
len(kill_requests),
kill_request_quantity,
kill_request_weight,
len(has_code),
kill_request_quantity_has_code,
kill_request_weight_has_code,
len(hasnt_code),
kill_request_quantity_hasnt_code,
kill_request_weight_hasnt_code,
len(deffrent_bar),
kill_request_quantity_deffrent_bar,
kill_request_weight_deffrent_bar,
len(out_poultry_requests),
total_quantity_poultry_request_out,
total_weight_poultry_request_out,
index_weight_out,
]
create_value(worksheet, list2, l + 2, 1, color='green')
value_header_list = [
len(poultries),
total_quantity,
len(poultry_requests),
total_quantity_poultry_request,
total_weight_poultry_request,
len(kill_requests),
kill_request_quantity,
kill_request_weight,
len(has_code),
kill_request_quantity_has_code,
kill_request_weight_has_code,
len(hasnt_code),
kill_request_quantity_hasnt_code,
kill_request_weight_hasnt_code,
len(deffrent_bar),
kill_request_quantity_deffrent_bar,
kill_request_weight_deffrent_bar,
len(out_poultry_requests),
total_quantity_poultry_request_out,
total_weight_poultry_request_out,
index_weight_out,
]
create_value(worksheet, value_header_list, 3, 3)
workbook.save(output)
output.seek(0)
response = HttpResponse(
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response[
'Content-Disposition'] = f'attachment; filename="عملکرد مسئول فنی({vat_farm.vet.user.fullname}).xlsx"'.encode(
'utf-8')
response.write(output.getvalue())
return response
def totoal_technical_responsible_performance_excel(request):
vat_farm = VetFarm.objects.filter(trash=False, poultry__isnull=False)
poultry_id = vat_farm.values_list('poultry__id', flat=True).distinct()
poultries = Poultry.objects.filter(id__in=poultry_id, trash=False)
excel_options = [
'ردیف',
'دامپزشک فارم',
'تلفن دامپزشک فارم',
'تعداد واحد تحت نظر',
'مجموع جوجه ریزی تحت نظر',
'مجموع درخواست کشتار',
'مجموع حجم درخواست کشتار',
'مجموع وزن درخواست کشتار',
'مجموع تعداد بارها',
'مجموع حجم بارها',
'مجموع وزن بارها',
'مجموع تعداد بارهای قرنطینه شده',
'مجموع حجم بارهای قرنطینه شده',
'مجموع وزن بارهای قرنطینه شده',
'مجموع تعداد بارهای فاقد قرنطینه',
'مجموع حجم بارهای فاقد قرنطینه',
'مجموع وزن بارهای فاقد قرنطینه نشده',
'مجموع تعداد بارهای دارای مغایرت',
'مجموع حجم بارهای دارای مغایرت',
'مجموع وزن بارهای دارای مغایرت',
'مجموع تعداد بارهای خارج استان',
'مجموع حجم بارهای خارج استان',
'مجموع وزن بارهای خارج استان',
'مجموع وزن تقریبی بارهای خارج استان',
]
date1 = datetime.datetime.now().date()
from_date_1 = shamsi_date(date1)
output = BytesIO()
workbook = Workbook()
worksheet = workbook.active
worksheet.sheet_view.rightToLeft = True
worksheet.insert_rows(1)
cell = worksheet.cell(row=1, column=1)
cell.alignment = Alignment(horizontal='center', vertical='center')
header_list = [
'تعداد واحد تحت نظر',
'مجموع جوجه ریزی تحت نظر',
'مجموع درخواست کشتار',
'مجموع حجم درخواست کشتار',
'مجموع وزن درخواست کشتار',
'مجموع تعداد بارها',
'مجموع حجم بارها',
'مجموع وزن بارها',
'مجموع تعداد بارهای قرنطینه شده',
'مجموع حجم بارهای قرنطینه شده',
'مجموع وزن بارهای قرنطینه شده',
'مجموع تعداد بارهای فاقد قرنطینه',
'مجموع حجم بارهای فاقد قرنطینه',
'مجموع وزن بارهای فاقد قرنطینه نشده',
'مجموع تعداد بارهای دارای مغایرت',
'مجموع حجم بارهای دارای مغایرت',
'مجموع وزن بارهای دارای مغایرت',
'مجموع تعداد بارهای خارج استان',
'مجموع حجم بارهای خارج استان',
'مجموع وزن بارهای خارج استان',
'مجموع وزن تقریبی بارهای خارج استان',
]
excel_description(worksheet, 'A2', 'عملکرد مسئول فنی', color='red', row2='B2')
create_header(worksheet, header_list, 3, 2, height=20, color='green')
create_header_freez(worksheet, excel_options, 1, 5, 6, height=22)
l = 6
m = 1
poultry_hatchings = PoultryHatching.objects.filter(poultry__in=poultries, trash=False).only('quantity', 'left_over')
if 'date1' in request.GET:
date1 = datetime.datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date()
date2 = datetime.datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date()
poultry_requests = PoultryRequest.objects.filter(send_date__date__gte=date1,send_date__date__lte=date2,trash=False, poultry__in=poultries,
state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending')).only('quantity',
'Index_weight')
kill_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,kill_request__recive_date__date__lte=date2,trash=False,
province_request__poultry_request__in=poultry_requests).only(
'accepted_real_quantity', 'accepted_real_weight')
else:
poultry_requests = PoultryRequest.objects.filter(trash=False, poultry__in=poultries,
state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending')).only('quantity',
'Index_weight')
kill_requests = KillHouseRequest.objects.filter(trash=False,
province_request__poultry_request__in=poultry_requests).only(
'accepted_real_quantity', 'accepted_real_weight')
out_poultry_requests = poultry_requests.filter(out=True, out_province_request_cancel=False).only(
'quantity', 'Index_weight'
)
for vet in vat_farm:
poultry = Poultry.objects.filter(id=vet.poultry.id, trash=False)
poultry_hatchings = PoultryHatching.objects.filter(poultry__in=poultry, trash=False).only('quantity',
'left_over')
if 'date1' in request.GET:
date1 = datetime.datetime.strptime(request.GET['date1'],
'%Y-%m-%d').date()
date2 = datetime.datetime.strptime(request.GET['date2'],
'%Y-%m-%d').date()
poultry_requests = PoultryRequest.objects.filter(send_date__date__gte=date1, send_date__date__lte=date2,
trash=False, poultry__in=poultry,
state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending')).only(
'quantity',
'Index_weight')
kill_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2, trash=False,
province_request__poultry_request__in=poultry).only(
'accepted_real_quantity', 'accepted_real_weight')
else:
poultry_requests = PoultryRequest.objects.filter(trash=False, poultry__in=poultry,
state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending')).only(
'quantity',
'Index_weight')
kill_requests = KillHouseRequest.objects.filter(trash=False,
province_request__poultry_request__in=poultry_requests).only(
'accepted_real_quantity', 'accepted_real_weight')
out_poultry_requests = poultry_requests.filter(out=True, out_province_request_cancel=False).only(
'quantity', 'Index_weight'
)
poultry_hatching = poultry_hatchings.filter(poultry=poultries)
total_quantity = \
poultry_hatching.aggregate(total=Sum('quantity'))[
'total'] or 0
poultry_request = poultry_requests.filter(poultry=poultry)
total_quantity_poultry_request = \
poultry_request.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request = \
poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
total_index_weight_poultry_request = \
poultry_request.aggregate(total=Sum('Index_weight'))[
'total'] or 0
index_weight = round(total_index_weight_poultry_request / len(poultry_request), 2) if len(
poultry_request) > 0 else 0
kill_request = kill_requests.filter(province_request__poultry_request__in=poultry_request)
kill_request_quantity = kill_request.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight = kill_request.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
has_code = kill_request.filter(clearance_code__isnull=False)
kill_request_quantity_has_code = has_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_has_code = has_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
hasnt_code = kill_request.filter(clearance_code__isnull=True)
kill_request_quantity_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
deffrent_bar = kill_request.filter(
~Q(quantity=F('quarantine_quantity')
, quarantine_quantity__isnull=False))
kill_request_quantity_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
out_poultry_request = out_poultry_requests.filter(poultry=poultry)
total_quantity_poultry_request_out = \
out_poultry_request.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request_out = \
out_poultry_request.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
total_index_weight_poultry_request_out = \
out_poultry_request.aggregate(total=Sum('Index_weight'))[
'total'] or 0
index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_request), 2) if len(
out_poultry_request) > 0 else 0
list1 = [
m,
vet.vet.user.fullname,
vet.vet.user.mobile,
len(poultries),
total_quantity,
len(poultry_requests),
total_quantity_poultry_request,
total_weight_poultry_request,
len(kill_requests),
kill_request_quantity,
kill_request_weight,
len(has_code),
kill_request_quantity_has_code,
kill_request_weight_has_code,
len(hasnt_code),
kill_request_quantity_hasnt_code,
kill_request_weight_hasnt_code,
len(deffrent_bar),
kill_request_quantity_deffrent_bar,
kill_request_weight_deffrent_bar,
len(out_poultry_requests),
total_quantity_poultry_request_out,
total_weight_poultry_request_out,
index_weight_out,
]
create_value(worksheet, list1, l, 1)
m += 1
l += 1
total_quantity = \
poultry_hatchings.aggregate(total=Sum('quantity'))[
'total'] or 0
total_quantity_poultry_request = \
poultry_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request = \
poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
kill_request_quantity = kill_requests.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight = kill_requests.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
has_code = kill_requests.filter(clearance_code__isnull=False)
kill_request_quantity_has_code = has_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_has_code = has_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
deffrent_bar = kill_requests.filter(
~Q(quantity=F('quarantine_quantity')
, quarantine_quantity__isnull=False))
kill_request_quantity_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_deffrent_bar = deffrent_bar.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
hasnt_code = kill_requests.filter(clearance_code__isnull=True)
kill_request_quantity_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_quantity'))[
'total'] or 0
kill_request_weight_hasnt_code = hasnt_code.aggregate(
total=Sum('accepted_real_weight'))[
'total'] or 0
total_quantity_poultry_request_out = \
out_poultry_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
total_weight_poultry_request_out = \
out_poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
total_index_weight_poultry_request_out = \
out_poultry_requests.aggregate(total=Sum('Index_weight'))[
'total'] or 0
index_weight_out = round(total_index_weight_poultry_request_out / len(out_poultry_requests), 2) if len(
out_poultry_requests) > 0 else 0
list2 = [
'مجموع==>',
'',
'',
'',
'',
'',
'',
'',
total_quantity,
len(poultry_requests),
total_quantity_poultry_request,
total_weight_poultry_request,
'',
len(kill_requests),
kill_request_quantity,
kill_request_weight,
len(has_code),
kill_request_quantity_has_code,
kill_request_weight_has_code,
len(hasnt_code),
kill_request_quantity_hasnt_code,
kill_request_weight_hasnt_code,
len(deffrent_bar),
kill_request_quantity_deffrent_bar,
kill_request_weight_deffrent_bar,
len(out_poultry_requests),
total_quantity_poultry_request_out,
total_weight_poultry_request_out,
index_weight_out,
]
create_value(worksheet, list2, l + 2, 1, color='green')
value_header_list = [
len(poultries),
total_quantity,
len(poultry_requests),
total_quantity_poultry_request,
total_weight_poultry_request,
len(kill_requests),
kill_request_quantity,
kill_request_weight,
len(has_code),
kill_request_quantity_has_code,
kill_request_weight_has_code,
len(hasnt_code),
kill_request_quantity_hasnt_code,
kill_request_weight_hasnt_code,
len(deffrent_bar),
kill_request_quantity_deffrent_bar,
kill_request_weight_deffrent_bar,
len(out_poultry_requests),
total_quantity_poultry_request_out,
total_weight_poultry_request_out,
index_weight_out,
]
create_value(worksheet, value_header_list, 3, 3)
workbook.save(output)
output.seek(0)
response = HttpResponse(
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response[
'Content-Disposition'] = f'attachment; filename="عملکرد مسئول فنی.xlsx"'.encode(
'utf-8')
response.write(output.getvalue())
return response

260
panel/VetFarm/helpers.py Normal file
View File

@@ -0,0 +1,260 @@
from django.db.models import Sum, F, Q
from panel.KillHouse.helpers import get_difference_carcasses_percent
from panel.models import PoultryRequest, ProvinceKillRequest, KillHouse, KillHouseRequest, PercentageOfWageType, \
WageType, SubSectorTransactions, BarDifferenceRequest
def get_vet_sub_sector_finance_info(vet,date1,date2):
total_quantity = 0
total_weight = 0
total_wage = 0
total_wage_type = WageType.objects.filter(trash=False)
province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount
free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount
out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province',
trash=False).first().amount
percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
other_province_kill_request_percent = percentages_wage_type.filter(
wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100
other_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
share_type__en_name='other').first().percent / 100
other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province',
share_type__en_name='other').first().percent / 100
other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent
other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent
other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
if date1:
poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'),
province_state__in=('pending', 'accepted'), out=True,
out_province_request_cancel=False, temporary_trash=False,
wage_pay=True, has_wage=True,
temporary_deleted=False, vet_farm=vet,
send_date__date__gte=date1,
send_date__date__lte=date2)
kill_house_requests = KillHouseRequest.objects.filter(
Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q(
Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q(
Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False,
province_request__poultry_request__vet_farm=vet,
clearance_code__isnull=False,
# clearance_code__isnull=False,
trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2
)
vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet, date__date__gte=date1,
date__date__lte=date2)
difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False,
state='accepted', acceptor_date__date__gte=date1,
acceptor_date__date__lte=date2)
else:
poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'),
province_state__in=('pending', 'accepted'), out=True,
out_province_request_cancel=False, temporary_trash=False,
wage_pay=True, has_wage=True,
temporary_deleted=False, vet_farm=vet,
)
kill_house_requests = KillHouseRequest.objects.filter(
Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q(
Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q(
Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False,
province_request__poultry_request__vet_farm=vet,
clearance_code__isnull=False,
# clearance_code__isnull=False,
trash=False, calculate_status=True
)
difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False,
state='accepted')
vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet)
# quarantine_code__isnull=False)
out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
# province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False,
# archive_wage=False, return_to_province=False,
# state__in=('pending', 'accepted'),
# province_request__poultry_request__vet_farm=vet,
# province_request__poultry_request__quarantine_code__isnull=False,
#
# first_car_allocated_quantity=0).order_by('id')
# province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
# 'total'] or 0
# province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
# 'total'] or 0
province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
province_live_weight += \
difference_requests.aggregate(total=Sum('weight'))['total'] or 0
total_quantity += province_live_quantity + out_province_poultry_request_quantity
total_weight += province_live_weight + out_province_poultry_request_weight
province_carcasses_weight = province_live_weight * 0.75
if date1:
internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent(date1,date2)
else:
internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent()
external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight
total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount
total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount
out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount
vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0
total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount
total_remain_wage = total_wage - vet_deposit_amount
result = {
"total_quantity": total_quantity,
"total_weight": total_weight,
"out_province_poultry_request_quantity": out_province_poultry_request_quantity,
"out_province_poultry_request_weight": out_province_poultry_request_weight,
"province_live_quantity": province_live_quantity,
"province_live_weight": province_live_weight,
"province_carcasses_weight": province_carcasses_weight,
"internal_pure_province_carcasses_weight": internal_pure_province_carcasses_weight,
"external_pure_province_carcasses_weight": external_pure_province_carcasses_weight,
"total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount,
"total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount,
"out_province_poultry_request_amount": out_province_poultry_request_amount,
"total_wage": total_wage,
"number_of_deposit": len(vet_deposit),
"vet_deposit_amount": vet_deposit_amount,
"total_remain_wage": total_remain_wage,
}
return result
def get_vet_sub_sector_finance_info_with_date(vet,date1,date2):
total_quantity = 0
total_weight = 0
total_wage = 0
total_wage_type = WageType.objects.filter(trash=False)
province_live_wage_amount = total_wage_type.filter(en_name='province-kill-request', trash=False).first().amount
free_sell_carcasses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount
out_poultry_request_wage_amount = total_wage_type.filter(en_name='poultry-sell-out-province',
trash=False).first().amount
percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
other_province_kill_request_percent = percentages_wage_type.filter(
wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100
other_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
share_type__en_name='other').first().percent / 100
other_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province',
share_type__en_name='other').first().percent / 100
other_province_kill_request_amount = province_live_wage_amount * other_province_kill_request_percent
other_free_sell_carcasses_amount = free_sell_carcasses_wage_amount * other_free_sell_carcasses_percent
other_out_poultry_request_amount = out_poultry_request_wage_amount * other_out_poultry_request_percent
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
if date1:
poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'),
province_state__in=('pending', 'accepted'), out=True,
out_province_request_cancel=False, temporary_trash=False,
wage_pay=True, has_wage=True,
temporary_deleted=False, vet_farm=vet, send_date__date__gte=date1,
send_date__date__lte=date2)
kill_house_requests = KillHouseRequest.objects.filter(
Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q(
Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q(
Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False,
province_request__poultry_request__vet_farm=vet,
clearance_code__isnull=False,
# clearance_code__isnull=False,
trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2
)
vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet, date__date__gte=date1,
date__date__lte=date2)
difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False,
state='accepted',acceptor_date__date__gte=date1,acceptor_date__date__lte=date2)
else:
poultry_requests = PoultryRequest.objects.filter(trash=False, state_process__in=('pending', 'accepted'),
province_state__in=('pending', 'accepted'), out=True,
out_province_request_cancel=False, temporary_trash=False,
wage_pay=True, has_wage=True,
temporary_deleted=False, vet_farm=vet,
)
kill_house_requests = KillHouseRequest.objects.filter(
Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q(
Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q(
Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False,
province_request__poultry_request__vet_farm=vet,
clearance_code__isnull=False,
# clearance_code__isnull=False,
trash=False, calculate_status=True
)
difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False,
state='accepted')
vet_deposit = SubSectorTransactions.objects.filter(trash=False, vet=vet)
# quarantine_code__isnull=False)
out_province_poultry_request_quantity = poultry_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
out_province_poultry_request_weight = poultry_requests.aggregate(total=Sum(F('quantity') * F('Index_weight')))[
'total'] or 0
# province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False,
# archive_wage=False, return_to_province=False,
# state__in=('pending', 'accepted'),
# province_request__poultry_request__vet_farm=vet,
# province_request__poultry_request__quarantine_code__isnull=False,
#
# first_car_allocated_quantity=0).order_by('id')
# province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
# 'total'] or 0
# province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
# 'total'] or 0
province_live_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
province_live_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
province_live_weight += \
difference_requests.aggregate(total=Sum('weight'))['total'] or 0
total_quantity += province_live_quantity + out_province_poultry_request_quantity
total_weight += province_live_weight + out_province_poultry_request_weight
province_carcasses_weight = province_live_weight * 0.75
internal_pure_province_carcasses_weight = province_carcasses_weight * get_difference_carcasses_percent(date1,date2)
external_pure_province_carcasses_weight = province_carcasses_weight - internal_pure_province_carcasses_weight
total_pure_internal_province_carcasses_amount = internal_pure_province_carcasses_weight * other_province_kill_request_amount
total_pure_external_province_carcasses_amount = external_pure_province_carcasses_weight * other_free_sell_carcasses_amount
out_province_poultry_request_amount = out_province_poultry_request_weight * other_out_poultry_request_amount
vet_deposit_amount = vet_deposit.aggregate(total=Sum('amount'))['total'] or 0
total_wage += total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount
total_remain_wage = total_wage - vet_deposit_amount
result = {
"total_quantity": total_quantity,
"total_weight": total_weight,
"out_province_poultry_request_quantity": out_province_poultry_request_quantity,
"out_province_poultry_request_weight": out_province_poultry_request_weight,
"province_live_quantity": province_live_quantity,
"province_live_weight": province_live_weight,
"province_carcasses_weight": province_carcasses_weight,
"internal_pure_province_carcasses_weight": internal_pure_province_carcasses_weight,
"external_pure_province_carcasses_weight": external_pure_province_carcasses_weight,
"total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount,
"total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount,
"out_province_poultry_request_amount": out_province_poultry_request_amount,
"total_wage": total_wage,
"number_of_deposit": len(vet_deposit),
"vet_deposit_amount": vet_deposit_amount,
"total_remain_wage": total_remain_wage,
}
return result

View File

@@ -0,0 +1,190 @@
import datetime
from rest_framework import serializers
from authentication.serializer.serializer import SystemUserProfileForGuildSerializer
# سریالایزر مربوط به درخواست بورسی مرغدار
from authentication.serializers import SystemAddressSerializer
from panel.KillHouse.serializers import VetSerializer, VetForBarManagementSerializer
from panel.VetFarm.helpers import get_vet_sub_sector_finance_info, get_vet_sub_sector_finance_info_with_date
from panel.models import VetFarm, VetFarmInspection, PoultryHatching, Poultry, Vet
from panel.poultry.serializers import PoultrySerializer, PoultryHatchingSerializer
class VetFarmSerializer(serializers.ModelSerializer):
vet = VetSerializer(read_only=True)
poultry = PoultrySerializer(read_only=True)
inspection_info = serializers.SerializerMethodField('get_inspections')
hatching_quantity = serializers.SerializerMethodField('get_hatching_quantity')
class Meta:
model = VetFarm
fields = '__all__'
def get_inspections(self, instance):
inspections = len(VetFarmInspection.objects.filter(vet_farm=instance))
hatching = PoultryHatching.objects.filter(poultry=instance.poultry, hall=int(instance.hall)).only(
'quantity').last()
number_of_hatching = 0
if hatching:
number_of_hatching = hatching.quantity
dict1 = {}
if inspections > 0:
dict1 = {
"number_of_inspections": inspections,
"number_of_hatching": number_of_hatching
}
return dict1
def get_hatching_quantity(self, instance):
quantity = 0
poultry = Poultry.objects.get(key=instance.poultry.key)
poultry_hatching = PoultryHatching.objects.filter(poultry=poultry).only('left_over').last()
if poultry_hatching:
quantity = poultry_hatching.left_over
return quantity
class VetForSubSectorSerializer(serializers.ModelSerializer):
user = SystemUserProfileForGuildSerializer(read_only=True)
wage_info = serializers.SerializerMethodField('get_wage_info')
class Meta:
model = Vet
fields = ['key', 'user', 'wage_info']
def get_wage_info(self, obj):
if self.context.get('request').GET.get('date1'):
date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']),
'%Y-%m-%d').date()
date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']),
'%Y-%m-%d').date()
else:
date1=None
date2=None
return get_vet_sub_sector_finance_info(obj,date1,date2)
class VetForSubSectorTransactionSerializer(serializers.ModelSerializer):
user = SystemUserProfileForGuildSerializer(read_only=True)
class Meta:
model = Vet
fields = ['key', 'user']
class VetFarmInspectionSerializer(serializers.ModelSerializer):
vet_farm = VetFarmSerializer(read_only=True)
poultry_hatching = PoultryHatchingSerializer(read_only=True)
class Meta:
model = VetFarmInspection
fields = '__all__'
class ManagementVetFarmSerializer(serializers.ModelSerializer):
# vet = VetSerializer(read_only=True)
poultry = PoultrySerializer(read_only=True)
inspection_info = serializers.SerializerMethodField('get_inspections')
hatching_quantity = serializers.SerializerMethodField('get_hatching_quantity')
class Meta:
model = VetFarm
fields = '__all__'
def get_inspections(self, instance):
inspections = len(VetFarmInspection.objects.filter(vet_farm=instance))
hatching = PoultryHatching.objects.filter(poultry=instance.poultry, hall=int(instance.hall)).only(
'quantity').last()
number_of_hatching = 0
if hatching:
number_of_hatching = hatching.quantity
dict1 = {}
if inspections > 0:
dict1 = {
"number_of_inspections": inspections,
"number_of_hatching": number_of_hatching
}
return dict1
def get_hatching_quantity(self, instance):
quantity = 0
poultry = Poultry.objects.get(key=instance.poultry.key)
poultry_hatching = PoultryHatching.objects.filter(poultry=poultry).only('left_over').last()
if poultry_hatching:
quantity = poultry_hatching.left_over
return quantity
class PoultryForCityVetSerializer(serializers.ModelSerializer):
address = SystemAddressSerializer(read_only=True)
inspection_info = serializers.SerializerMethodField('get_inspections')
hatching_quantity = serializers.SerializerMethodField('get_hatching_quantity')
class Meta:
model = Poultry
fields = ['key', 'unit_name', 'address', 'number_of_halls', 'breeding_unique_id', 'inspection_info',
'hatching_quantity']
def get_inspections(self, instance):
inspections = len(VetFarmInspection.objects.filter(vet_farm__poultry=instance))
hatching = PoultryHatching.objects.filter(poultry=instance, trash=False).only('quantity').last()
number_of_hatching = 0
if hatching:
number_of_hatching = hatching.quantity
dict1 = {}
if inspections > 0:
dict1 = {
"number_of_inspections": inspections,
"number_of_hatching": number_of_hatching
}
return dict1
def get_hatching_quantity(self, instance):
total_quantity = 0
left_over = 0
vet_farm_losses = 0
union_losses = 0
period = None
hatching_key = None
poultry_hatching = PoultryHatching.objects.filter(poultry=instance, allow_hatching='pending', state='pending',
archive=False, violation=False, trash=False).last()
if poultry_hatching:
total_quantity = poultry_hatching.quantity
left_over = poultry_hatching.left_over
vet_farm_losses = poultry_hatching.losses
union_losses = poultry_hatching.direct_losses
period = poultry_hatching.period
hatching_key = poultry_hatching.key
return {
"total_quantity": total_quantity,
"left_over": left_over,
"vet_farm_losses": vet_farm_losses,
"union_losses": union_losses,
"period": period,
"total_losses": union_losses + vet_farm_losses,
"hatching_key": hatching_key,
}
class VetForSubSectorSerializerForExcel(serializers.ModelSerializer):
user = SystemUserProfileForGuildSerializer(read_only=True)
wage_info = serializers.SerializerMethodField('get_wage_info')
class Meta:
model = Vet
fields = ['key', 'user', 'wage_info']
def get_wage_info(self, obj):
if self.context.get('request').GET['date1']:
date1 = datetime.datetime.strptime(str(self.context.get('request').GET['date1']),
'%Y-%m-%d').date()
date2 = datetime.datetime.strptime(str(self.context.get('request').GET['date2']),
'%Y-%m-%d').date()
else:
date1=None
date2=None
return get_vet_sub_sector_finance_info_with_date(obj,date1,date2)

452
panel/VetFarm/views.py Normal file
View File

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