first push

This commit is contained in:
2026-01-18 11:42:00 +03:30
commit 1704e7356b
723 changed files with 273450 additions and 0 deletions

View File

View File

@@ -0,0 +1,456 @@
from itertools import chain
from django.db.models import Sum, Q, F
from deposit_id import wage_counting_type
from panel.KillHouse.helpers import get_difference_carcasses_weight
from panel.models import KillHouse, ProvinceKillRequest, KillHouseRequest, PoultryHatching, PoultryRequest, WageType, \
PercentageOfWageType, SubSectorTransactions, SubSectorPercentageOfWageType, Poultry, KillHouseFreeBarInformation, \
KillHouseFreeSaleBarInformation, BarDifferenceRequest
def get_percent_for_city_sub_sector_finance_info():
poultries = Poultry.objects.filter(trash=False, city_operator__isnull=False).order_by('id')
hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by(
'poultry')
province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
archive_wage=False,
state__in=('pending', 'accepted'),
temporary_trash=False, temporary_deleted=False,
province_request__poultry_request__hatching__in=hatchings)
kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user', flat=True))
total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
'total'] or 0
kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses,
archive_wage=False,
calculate_status=True,
trash=False)
kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
kill_house__in=kill_houses,
archive_wage=False,
calculate_status=True,
trash=False)
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_out_carcasses_buying_for_pure_province_carcasses_weight = \
kill_house_free_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
out_selling_out_carcasses_buying_difference = total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight if (
total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight) > 0 else 0
total_pure_province_carcasses_weight = total_province_carcasses_weight - out_selling_out_carcasses_buying_difference
internal_percent = (
total_pure_province_carcasses_weight / total_province_carcasses_weight) * 100 if total_province_carcasses_weight > 0 else 0
external_percent = 100 - internal_percent
return {"internal_percent": internal_percent, "external_percent": external_percent}
# def get_city_sub_sector_finance_info(poultries,operator):
# 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_carcesses_wage_amount = total_wage_type.filter(en_name='carcasse-sell', trash=False).first().amount
# out_poultry_request_amount = total_wage_type.filter(en_name='poultry-sell-out-province', trash=False).first().amount
#
# percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
# union_province_kill_request_percent = percentages_wage_type.filter(
# wage_type__en_name='province-kill-request', share_type__en_name='union').first().percent / 100
# union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
# share_type__en_name='union').first().percent / 100
#
# union_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province',
# share_type__en_name='union').first().percent / 100
# city_percent_province_kill_request= SubSectorPercentageOfWageType.objects.filter(percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100
# city_percent_carcasse_sell= SubSectorPercentageOfWageType.objects.filter(percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100
# city_percent_out_poultry_request= SubSectorPercentageOfWageType.objects.filter(percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100
# union_province_kill_request_final_amount = union_province_kill_request_percent * province_live_wage_amount
# union_carcasse_sell_final_amount = union_free_sell_carcasses_percent * free_sell_carcesses_wage_amount
# union_out_poultry_request_amount = union_out_poultry_request_percent * out_poultry_request_amount
# city_province_kill_request_final_amount = union_province_kill_request_final_amount * city_percent_province_kill_request
# city_carcasse_sell_final_amount = union_carcasse_sell_final_amount * city_percent_carcasse_sell
# city_out_poultry_request_final_amount = union_out_poultry_request_amount * city_percent_out_poultry_request
#
#
#
# hatchings = PoultryHatching.objects.filter(poultry__in=poultries,killed_quantity__gt=0, trash=False).order_by('poultry')
#
# hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[
# 'total'] or 0
# 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,
# temporary_deleted=False, hatching__in=hatchings)
# 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(trash=False, return_to_province=False,
# archive_wage=False,
# state__in=('pending', 'accepted'),
# temporary_trash=False, temporary_deleted=False,
# # first_car_allocated_quantity=0,
# province_request__poultry_request__hatching__in=hatchings)
#
# total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
# 'total'] or 0
# total_province_live_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
# 'total'] or 0
# total_province_carcasses_weight = total_province_live_weight * 0.75
# weight_percent = get_percent_for_city_sub_sector_finance_info()
# total_pure_internal_province_carcasses_weight = (weight_percent['internal_percent']/100) * total_province_carcasses_weight
# total_pure_external_province_carcasses_weight = (weight_percent['external_percent']/100) * total_province_carcasses_weight
# total_pure_internal_province_carcasses_amount = total_pure_internal_province_carcasses_weight * city_province_kill_request_final_amount
# total_pure_external_province_carcasses_amount = total_pure_external_province_carcasses_weight * city_carcasse_sell_final_amount
# out_province_poultry_request_amount = out_province_poultry_request_weight * city_out_poultry_request_final_amount
# total_wage_amount = total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount
# total_killed_quantity = total_province_live_quantity + out_province_poultry_request_quantity
# hatching_killing_percent = ((total_killed_quantity / hatching_quantity) if hatching_quantity > 0 else 0) * 100
# city_operator_deposit = SubSectorTransactions.objects.filter(trash=False,city_operator=operator)
# city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0
# total_remain_wage_amount = total_wage_amount - city_deposit
#
# result = {
# "poultries": len(poultries),
# "hatchings": len(hatchings),
# "hatchings_quantity": hatching_quantity,
# "total_province_kill_requests_quantity": total_province_live_quantity,
# "total_province_kill_requests_weight": total_province_live_weight,
# "total_province_carcasses_weight": total_province_carcasses_weight,
# "total_pure_internal_province_carcasses_weight": total_pure_internal_province_carcasses_weight,
# "total_pure_external_province_carcasses_weight": total_pure_external_province_carcasses_weight,
# "out_province_poultry_request_quantity": out_province_poultry_request_quantity,
# "out_province_poultry_request_weight": out_province_poultry_request_weight,
# "total_killed_quantity": total_killed_quantity,
# "hatching_killing_percent": hatching_killing_percent,
# "out_province_poultry_request_amount": out_province_poultry_request_amount,
# "total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount,
# "total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount,
# "total_wage_amount": total_wage_amount,
# "number_of_city_deposit": len(city_operator_deposit),
# "city_deposit": city_deposit,
# "total_remain_wage_amount": total_remain_wage_amount,
# }
# return result
def get_city_sub_sector_finance_info(poultries, operator,date1,date2):
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
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by(
'poultry')
if date1 is not None:
total_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,
kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by(
'id')
total_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, calculate_status=True, kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2
)
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,
has_wage=True, wage_pay=True,
temporary_deleted=False, hatching__in=hatchings,
send_date__date__gte=date1,
send_date__date__lte=date2)
city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, city_operator=operator,
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,
has_wage=True, wage_pay=True, poultry__in=poultries,
temporary_deleted=False)
total_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')
total_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, calculate_status=True
)
difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False,
state='accepted')
city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, city_operator=operator)
total_province_live_weight = total_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
'total'] or 0
total_province_live_quantity = total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
'total'] or 0
total_province_live_weight += total_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
total_province_live_quantity += total_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
total_province_live_weight += \
difference_requests.aggregate(total=Sum('weight'))['total'] or 0
total_province_carcasses_weight = total_province_live_weight * 0.75
total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight(
kill_houses,date1,date2)
different_percent = (total_pure_province_carcasses_weight / total_province_carcasses_weight) if total_province_carcasses_weight > 0 else 0
province_kill_requests = total_province_kill_requests.filter(
province_request__poultry_request__hatching__in=hatchings).order_by('id')
kill_house_requests = total_kill_house_requests.filter(
province_request__poultry_request__hatching__in=hatchings).order_by('id')
province_kill_requests_kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user',flat=True)).order_by('id')
hatching_list1 = hatchings.filter(
pk__in=province_kill_requests.values_list('province_request__poultry_request__hatching', flat=True),
poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True)
hatching_list2 = hatchings.filter(
pk__in=kill_house_requests.values_list('province_request__poultry_request__hatching', flat=True),
poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True)
hatching_list3 = hatchings.filter(pk__in=poultry_requests.values_list('hatching', flat=True), poultry__in=poultries,
killed_quantity__gt=0, trash=False).values_list('id', flat=True)
total_hatching_list = chain(hatching_list1, hatching_list2, hatching_list3)
hatchings = hatchings.filter(pk__in=total_hatching_list)
hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[
'total'] or 0
poultry_requests = poultry_requests.filter(hatching__id__in=hatching_list3)
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 = 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.filter(kill_house__in=province_kill_requests_kill_houses).aggregate(total=Sum('weight'))['total'] or 0
province_carcasses_weight = province_live_weight * 0.75
internal_total_pure_province_carcasses_weight = province_carcasses_weight * different_percent
external_total_pure_province_carcasses_weight = province_carcasses_weight - internal_total_pure_province_carcasses_weight
# total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount
# total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount
percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
union_province_kill_request_percent = percentages_wage_type.filter(
wage_type__en_name='province-kill-request', share_type__en_name='union').first().percent / 100
union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
share_type__en_name='union').first().percent / 100
union_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province',
share_type__en_name='union').first().percent / 100
city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter(
percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100
city_percent_carcasse_sell = SubSectorPercentageOfWageType.objects.filter(
percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100
city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter(
percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100
union_province_kill_request_final_amount = union_province_kill_request_percent * province_live_wage_amount
union_carcasse_sell_final_amount = union_free_sell_carcasses_percent * free_sell_carcasses_wage_amount
union_out_poultry_request_amount = union_out_poultry_request_percent * out_poultry_request_wage_amount
city_province_kill_request_final_amount = union_province_kill_request_final_amount * city_percent_province_kill_request
city_carcasse_sell_final_amount = union_carcasse_sell_final_amount * city_percent_carcasse_sell
city_out_poultry_request_final_amount = union_out_poultry_request_amount * city_percent_out_poultry_request
total_pure_internal_province_carcasses_amount = internal_total_pure_province_carcasses_weight * city_province_kill_request_final_amount
total_pure_external_province_carcasses_amount = external_total_pure_province_carcasses_weight * city_carcasse_sell_final_amount
out_province_poultry_request_amount = out_province_poultry_request_weight * city_out_poultry_request_final_amount
total_wage_amount = total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount
total_killed_quantity = province_live_quantity + out_province_poultry_request_quantity
hatching_killing_percent = ((total_killed_quantity / hatching_quantity) if hatching_quantity > 0 else 0) * 100
city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0
total_remain_wage_amount = total_wage_amount - city_deposit
result = {
"poultries": len(poultries),
"hatchings": len(hatchings),
"hatchings_quantity": hatching_quantity,
"total_province_kill_requests_quantity": province_live_quantity,
"total_province_kill_requests_weight": province_live_weight,
"total_province_carcasses_weight": province_carcasses_weight,
"total_pure_internal_province_carcasses_weight": internal_total_pure_province_carcasses_weight,
"total_pure_external_province_carcasses_weight": external_total_pure_province_carcasses_weight,
"out_province_poultry_request_quantity": out_province_poultry_request_quantity,
"out_province_poultry_request_weight": out_province_poultry_request_weight,
"total_killed_quantity": total_killed_quantity,
"hatching_killing_percent": hatching_killing_percent,
"out_province_poultry_request_amount": out_province_poultry_request_amount,
"total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount,
"total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount,
"total_wage_amount": total_wage_amount,
"number_of_city_deposit": len(city_operator_deposit),
"city_deposit": city_deposit,
"total_remain_wage_amount": total_remain_wage_amount,
}
return result
def get_city_sub_sector_finance_info_with_date(poultries, operator,date1,date2):
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
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
total_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,kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2).order_by('id')
total_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, calculate_status=True,kill_request__recive_date__date__gte=date1,
kill_request__recive_date__date__lte=date2
)
total_province_live_weight = total_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
'total'] or 0
total_province_live_quantity = total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
'total'] or 0
total_province_live_weight += total_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
total_province_live_quantity += total_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0
difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, state='accepted',acceptor_date__date__gte=date1,acceptor_date__date__lte=date2)
total_province_live_weight += \
difference_requests.aggregate(total=Sum('weight'))['total'] or 0
total_province_carcasses_weight = total_province_live_weight * 0.75
total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight(
kill_houses)
different_percent = total_pure_province_carcasses_weight / total_province_carcasses_weight
hatchings = PoultryHatching.objects.filter(poultry__in=poultries, killed_quantity__gt=0, trash=False).order_by(
'poultry')
province_kill_requests = total_province_kill_requests.filter(
province_request__poultry_request__hatching__in=hatchings).order_by('id')
kill_house_requests = total_kill_house_requests.filter(
province_request__poultry_request__hatching__in=hatchings).order_by('id')
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,
has_wage=True, wage_pay=True,
temporary_deleted=False, hatching__in=hatchings,send_date__date__gte=date1,
send_date__date__lte=date2)
province_kill_requests_kill_houses = KillHouse.objects.filter(pk__in=province_kill_requests.values_list('killhouse_user',flat=True)).order_by('id')
hatching_list1 = hatchings.filter(
pk__in=province_kill_requests.values_list('province_request__poultry_request__hatching', flat=True),
poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True)
hatching_list2 = hatchings.filter(
pk__in=kill_house_requests.values_list('province_request__poultry_request__hatching', flat=True),
poultry__in=poultries, killed_quantity__gt=0, trash=False).values_list('id', flat=True)
hatching_list3 = hatchings.filter(pk__in=poultry_requests.values_list('hatching', flat=True), poultry__in=poultries,
killed_quantity__gt=0, trash=False).values_list('id', flat=True)
total_hatching_list = chain(hatching_list1, hatching_list2, hatching_list3)
hatchings = hatchings.filter(pk__in=total_hatching_list)
hatching_quantity = hatchings.aggregate(total=Sum('quantity'))[
'total'] or 0
poultry_requests = poultry_requests.filter(hatching__id__in=hatching_list3)
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 = 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.filter(kill_house__in=province_kill_requests_kill_houses).aggregate(total=Sum('weight'))['total'] or 0
province_carcasses_weight = province_live_weight * 0.75
internal_total_pure_province_carcasses_weight = province_carcasses_weight * different_percent
external_total_pure_province_carcasses_weight = province_carcasses_weight - internal_total_pure_province_carcasses_weight
# total_pure_province_carcasses_price = internal_total_pure_province_carcasses_weight * province_live_wage_amount
# total_out_selling_province_carcasses_price = external_total_pure_province_carcasses_weight * free_sell_carcesses_weight_amount
percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
union_province_kill_request_percent = percentages_wage_type.filter(
wage_type__en_name='province-kill-request', share_type__en_name='union').first().percent / 100
union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
share_type__en_name='union').first().percent / 100
union_out_poultry_request_percent = percentages_wage_type.filter(wage_type__en_name='poultry-sell-out-province',
share_type__en_name='union').first().percent / 100
city_percent_province_kill_request = SubSectorPercentageOfWageType.objects.filter(
percentage_of_wage_type__wage_type__en_name='province-kill-request').first().percent / 100
city_percent_carcasse_sell = SubSectorPercentageOfWageType.objects.filter(
percentage_of_wage_type__wage_type__en_name='carcasse-sell').first().percent / 100
city_percent_out_poultry_request = SubSectorPercentageOfWageType.objects.filter(
percentage_of_wage_type__wage_type__en_name='poultry-sell-out-province').first().percent / 100
union_province_kill_request_final_amount = union_province_kill_request_percent * province_live_wage_amount
union_carcasse_sell_final_amount = union_free_sell_carcasses_percent * free_sell_carcasses_wage_amount
union_out_poultry_request_amount = union_out_poultry_request_percent * out_poultry_request_wage_amount
city_province_kill_request_final_amount = union_province_kill_request_final_amount * city_percent_province_kill_request
city_carcasse_sell_final_amount = union_carcasse_sell_final_amount * city_percent_carcasse_sell
city_out_poultry_request_final_amount = union_out_poultry_request_amount * city_percent_out_poultry_request
total_pure_internal_province_carcasses_amount = internal_total_pure_province_carcasses_weight * city_province_kill_request_final_amount
total_pure_external_province_carcasses_amount = external_total_pure_province_carcasses_weight * city_carcasse_sell_final_amount
out_province_poultry_request_amount = out_province_poultry_request_weight * city_out_poultry_request_final_amount
total_wage_amount = total_pure_internal_province_carcasses_amount + total_pure_external_province_carcasses_amount + out_province_poultry_request_amount
total_killed_quantity = province_live_quantity + out_province_poultry_request_quantity
hatching_killing_percent = ((total_killed_quantity / hatching_quantity) if hatching_quantity > 0 else 0) * 100
city_operator_deposit = SubSectorTransactions.objects.filter(trash=False, city_operator=operator,date__date__gte=date1,date__date__lte=date2)
city_deposit = city_operator_deposit.aggregate(total=Sum('amount'))['total'] or 0
total_remain_wage_amount = total_wage_amount - city_deposit
result = {
"poultries": len(poultries),
"hatchings": len(hatchings),
"hatchings_quantity": hatching_quantity,
"total_province_kill_requests_quantity": province_live_quantity,
"total_province_kill_requests_weight": province_live_weight,
"total_province_carcasses_weight": province_carcasses_weight,
"total_pure_internal_province_carcasses_weight": internal_total_pure_province_carcasses_weight,
"total_pure_external_province_carcasses_weight": external_total_pure_province_carcasses_weight,
"out_province_poultry_request_quantity": out_province_poultry_request_quantity,
"out_province_poultry_request_weight": out_province_poultry_request_weight,
"total_killed_quantity": total_killed_quantity,
"hatching_killing_percent": hatching_killing_percent,
"out_province_poultry_request_amount": out_province_poultry_request_amount,
"total_pure_internal_province_carcasses_amount": total_pure_internal_province_carcasses_amount,
"total_pure_external_province_carcasses_amount": total_pure_external_province_carcasses_amount,
"total_wage_amount": total_wage_amount,
"number_of_city_deposit": len(city_operator_deposit),
"city_deposit": city_deposit,
"total_remain_wage_amount": total_remain_wage_amount,
}
return result

View File

@@ -0,0 +1,138 @@
import datetime
from django.db.models import Sum, F
from rest_framework import serializers
from authentication.serializer.serializer import SystemUserProfileSerializer, BankCardSerializer, \
SystemUserProfileForGuildSerializer
from authentication.serializers import SystemAddressSerializer
from panel.CityOperator.helpers import get_city_sub_sector_finance_info, get_city_sub_sector_finance_info_with_date
from panel.models import CityOperatorCheckRequest, CityOperator, ProvinceKillRequest, ProvinceCheckOperatorRequest, \
WageType, PercentageOfWageType, PoultryHatching, Poultry, PoultryRequest, KillHouseFreeBarInformation, \
KillHouseFreeSaleBarInformation, KillHouse
from panel.poultry.serializers import PoultryRequestSerializer
# سریالایزر مربوط به اپراتور شهرستان
class CityOperatorSerializer(serializers.ModelSerializer):
user = SystemUserProfileSerializer(read_only=True)
address = SystemAddressSerializer(read_only=True)
user_bank_info = BankCardSerializer(read_only=True, required=False)
class Meta:
model = CityOperator
exclude = (
'id',
'create_date',
'modify_date',
# 'trash',
'created_by',
'modified_by',
)
class CityOperatorForAllUserSerializer(serializers.ModelSerializer):
address = SystemAddressSerializer(read_only=True)
user_bank_info = BankCardSerializer(read_only=True, required=False)
class Meta:
model = CityOperator
fields = ['address', 'user_bank_info', 'identity_documents', 'phone', 'unit_name']
class CityOperatorForPoultrySerializer(serializers.ModelSerializer):
address = SystemAddressSerializer(read_only=True)
class Meta:
model = CityOperator
fields = ['key', 'address', 'unit_name']
class CityOperatorForSubSectorTransactionsSerializer(serializers.ModelSerializer):
user = SystemUserProfileForGuildSerializer(read_only=True)
class Meta:
model = CityOperator
fields = ['key', 'user', 'unit_name']
class CityOperatorForSubSectorSerializer(serializers.ModelSerializer):
user = SystemUserProfileForGuildSerializer(read_only=True)
wage_info = serializers.SerializerMethodField('get_wage_info')
class Meta:
model = CityOperator
fields = ['key', 'user', 'unit_name','wage_info']
def get_wage_info(self, obj):
date1=None
date2=None
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()
poultries = Poultry.objects.filter(city_operator=obj.unit_name,trash=False).order_by('id')
info=get_city_sub_sector_finance_info(poultries,obj,date1,date2)
return info
# سریالایزر مربوط به بررسی درخواست مرغدار توسط شهرستان (تایید یا رد)
class CityOperatorCheckRequestSerializer(serializers.ModelSerializer):
poultry_request = PoultryRequestSerializer(read_only=True)
quantity = serializers.SerializerMethodField('get_quantity')
# city_operator = CityOperatorSerializer()
class Meta:
model = CityOperatorCheckRequest
fields = '__all__'
def get_quantity(self, instance):
allocated_number = 0
returned_number = 0
assignable_number = 0
province_check_req = ProvinceCheckOperatorRequest.objects.filter(city_request_Poultry=instance)
if province_check_req.count() > 0:
province_check_req = province_check_req.last()
assignable_number = province_check_req.quantity
else:
assignable_number = instance.poultry_request.quantity
province_kill_requests = ProvinceKillRequest.objects.filter(province_request__city_request_Poultry=instance,
trash=False, state__in=('pending', 'accepted'))
if province_kill_requests.count() > 0:
for province_kill_request in province_kill_requests:
if province_kill_request.return_to_province == False:
allocated_number += province_kill_request.main_quantity
else:
returned_number += province_kill_request.main_quantity
quantity = {
"allocated_number": allocated_number,
"assignable_number": assignable_number,
"returned_number": returned_number,
}
return quantity
class CityOperatorForSubSectorSerializerForExcel(serializers.ModelSerializer):
user = SystemUserProfileForGuildSerializer(read_only=True)
wage_info = serializers.SerializerMethodField('get_wage_info')
class Meta:
model = CityOperator
fields = ['key', 'user', 'unit_name','wage_info']
def get_wage_info(self, obj):
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()
poultries = Poultry.objects.filter(city_operator=obj.unit_name,trash=False).order_by('id')
info=get_city_sub_sector_finance_info_with_date(poultries,obj,date1,date2)
return info

666
panel/CityOperator/views.py Normal file
View File

@@ -0,0 +1,666 @@
import threading
import jdatetime
from rest_framework.pagination import PageNumberPagination
# .
from authentication.helper.refresh import refresh
from authentication.sms_management import poultry_request_receive_city_accept_sms, \
poultry_request_receive_province_accept_sms
from panel.CityOperator.serializers import (
CityOperatorCheckRequestSerializer,
CityOperatorSerializer, CityOperatorForPoultrySerializer, CityOperatorForSubSectorSerializer,
CityOperatorForSubSectorTransactionsSerializer
)
from authentication.serializer.serializer import (
SystemAddressSerializer,
BankCardSerializer
)
from authentication.models import SystemAddress, CityUnit
from panel.poultry.serializers import PoultrySerializer, PoultryRequestSerializer, \
PoultryRequestForKillingInformationSerializer
from panel.convert_date import convert_to_miladi
from panel.models import (
CityOperatorCheckRequest,
PoultryRequest,
CityOperator,
PoultryRequestAuction,
ProvinceOperator,
Poultry, PoultryHatching, VetFarm, VetFarmInspection, SmsLicense, ProvinceCheckOperatorRequest, ProvinceKillRequest,
KillHouseCheckRequest, KillRequest
)
from authentication.models import (
City,
Province
)
from authentication.models import SystemUserProfile
from panel.filterset import UserProfileFilterSet, CityOperatorRequestFilterSet, PoultryRequestFilterSet
from django_filters.rest_framework import DjangoFilterBackend
from authentication.permissions import CityOperator as CityOperatorPermission
from authentication.permissions import ProvinceOperator as provinceOperatorPermission
from authentication.models import UserProfile, UserMessage
from rest_framework.response import Response
from django.contrib.auth.models import User
from rest_framework import viewsets
from oauth2_provider.contrib.rest_framework import (
TokenHasReadWriteScope,
OAuth2Authentication,
)
from rest_framework import status
from django.http import QueryDict
from datetime import datetime, timedelta
from django.db.models import Q
from panel.helper import remove_null_fields
class CustomPagination(PageNumberPagination):
page_size = 10
class ShowCityOperatorViewSet(viewsets.ModelViewSet):
queryset = CityOperator.objects.all()
serializer_class = CityOperatorSerializer
permission_classes = [TokenHasReadWriteScope]
# def list(self, request, *args, **kwargs):
# # refresh(request.user.id)
# if 'breeding_uniq_id' in request.GET:
# poultry = Poultry.objects.get(breeding_unique_id=request.GET['breeding_uniq_id'])
# else:
#
# user = SystemUserProfile.objects.get(user=request.user)
# poultry = Poultry.objects.get(user=user)
# # city = City.objects.get(key=poultry.address.city.key)
#
# city_unit = CityUnit.objects.get(name=poultry.address.city.name)
# # city_operator_system = CityOperator.objects.get(address__city=city_unit.city, trash=False)
# operator_list = []
# opertors = CityOperator.objects.filter(address__city__name__in=(city_unit.city.name, 'فاقد شهرستان'),
# trash=False)
# # poultry_request = PoultryRequest.objects.filter(trash=False, poultry=poultry).select_related(
# # 'city_operator').last()
#
# for opertor in opertors:
# last = True if poultry.city_operator == opertor.unit_name else False
# operator_dict = {
# "key": opertor.key,
# "unit_name": opertor.unit_name,
# "last": last
# }
# operator_list.append(operator_dict)
#
# return Response(operator_list)
def list(self, request, *args, **kwargs):
operator_list = []
if 'breeding_uniq_id' in request.GET:
poultry = Poultry.objects.get(breeding_unique_id=request.GET['breeding_uniq_id'])
else:
user = SystemUserProfile.objects.get(user=request.user)
poultry = Poultry.objects.get(user=user)
opertor = CityOperator.objects.filter(unit_name=poultry.city_operator,
trash=False).last()
if not opertor:
opertor = CityOperator.objects.filter(unit_name='اتحادیه استان (فاقد تعاونی)',
trash=False).last()
operator_dict = {
"key": opertor.key,
"unit_name": opertor.unit_name,
}
operator_list.append(operator_dict)
return Response(operator_list)
# ویوست مربوط به اپراتور شهرستان
class CityOperatorViewSet(viewsets.ModelViewSet):
queryset = CityOperator.objects.all()
serializer_class = CityOperatorSerializer
permission_classes = [TokenHasReadWriteScope]
def retrieve(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
# get city operator profile information
if 'profile' in request.GET:
user = SystemUserProfile.objects.get(user=request.user, trash=False)
# get operator object
operator = user.city_operator_user.all()
# send to serializer
serializer = self.serializer_class(operator[0])
return Response(serializer.data, status=status.HTTP_200_OK)
def list(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
city_operators = CityOperator.objects.filter(address__province=user.province, trash=False)
serializer = CityOperatorForPoultrySerializer(city_operators, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class CityOperatorForSubSectorViewSet(viewsets.ModelViewSet):
queryset = CityOperator.objects.all()
serializer_class = CityOperatorForSubSectorSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
city_operators = CityOperator.objects.filter(address__province=user.province, trash=False)
if 'operators' in request.GET:
serializer = CityOperatorForSubSectorTransactionsSerializer(city_operators, many=True)
else:
serializer = self.serializer_class(city_operators, many=True,context={'request':request})
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به بررسی درخواست مرغدار
class CityOperatorCheckRequestViewSet(viewsets.ModelViewSet):
queryset = CityOperatorCheckRequest.objects.all()
serializer_class = CityOperatorCheckRequestSerializer
# permission_classes = [TokenHasReadWriteScope, provinceOperatorPermission, CityOperatorPermission]
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = CityOperatorRequestFilterSet
filterset_fields = [
'poultry_request__user__mobile',
'poultry_request__user__fullname',
'poultry_request__user__first_name',
'poultry_request__user__last_name',
'poultry_request__user__address__breeding_unique_id',
'poultry_request__order_code',
]
# تابع برای تایید یا رد درخواست مرغدار توسط شهرستان
def create(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
# refresh(request.user.id)
role = request.data['role']
request.data.pop('role')
key = request.data['key']
state = request.data['state']
poultry_request = PoultryRequest.objects.get(key=key, trash=False)
hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
if role == 'ProvinceOperator':
province_operator = SystemUserProfile.objects.filter(user=request.user, trash=False)
if province_operator.count() > 0:
province_operator = province_operator.last()
# city_unit = CityUnit.objects.get(name=poultry_request.poultry.address.city.name)
# city_operator_system = CityOperator.objects.get(address__city=city_unit.city, trash=False)
city_operator_system = CityOperator.objects.get(key=poultry_request.city_operator.key, trash=False)
city_operator = SystemUserProfile.objects.get(key=city_operator_system.user.key, trash=False)
else:
city_operator = SystemUserProfile.objects.get(user=request.user, trash=False)
city_operator_system = CityOperator.objects.get(key=poultry_request.city_operator.key, trash=False)
province = city_operator.province.name
province_operator = SystemUserProfile.objects.filter(role__name='ProvinceOperator',
province__name=province, trash=False).last()
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
city_operator_check_request = serializer.create(validated_data=request.data)
if state == 'accept':
poultry_request.state = {
"city_operator": city_operator.first_name + " " + city_operator.last_name,
"city_state": "accepted",
"city_operator_mobile": city_operator.mobile,
"city_operator_date_time_accepted": str(city_operator_check_request.create_date),
"province_operator": province_operator.first_name + " " + province_operator.last_name,
"provice_operator_mobile": province_operator.mobile,
"province_state": "pending"
}
poultry_request.state_process = 'accepted'
poultry_auctions = PoultryRequestAuction.objects.filter(poultry_request=poultry_request,
trash=False).order_by(
'auction_date')
if poultry_auctions.count() > 0:
list2 = []
i = 0
for poultry_auction in poultry_auctions:
if i == 0:
poultry_auction.auction_date = datetime.now() + timedelta(
hours=int(poultry_auction.hour))
poultry_auction.state = 'active'
poultry_auction.save()
list2.append(poultry_auction)
else:
poultry_auction.auction_date = list2[0].auction_date + timedelta(
hours=int(poultry_auction.hour))
poultry_auction.save()
list2.clear()
list2.append(poultry_auction)
i += 1
message = UserMessage(
message="درخواست شما با کد سفارش {0} از طرف کارشناس شهرستان {1} تایید شده است و در حال حاضر در انتظار تایید کارشناس استان {2} میباشد ".format(
poultry_request.order_code, city_operator.fullname, province_operator.fullname),
heading="پیام سیستم ثبت شده در تاریخ {0}".format(datetime.now()),
sender=city_operator
)
message.save()
message.users.add(poultry_request.poultry.user)
if state == 'reject':
if poultry_request.kill_house_list != None and len(poultry_request.kill_house_list) > 0:
for item in poultry_request.kill_house_list:
parts = item.split("(")
name = parts[0].strip()
kill_request = KillRequest.objects.filter(kill_house__name=name,
recive_date__date=poultry_request.send_date.date(),
trash=False, poultry__isnull=True,
province_state='accepted').first()
if kill_request:
kill_request.remain_quantity_for_poultry -= poultry_request.quantity
kill_request.save()
poultry_request.state = {
"city_operator": city_operator.first_name + " " + city_operator.last_name,
"city_state": " rejected",
"city_operator_date_time_rejected": str(city_operator_check_request.create_date),
"province_operator": "",
"province_state": ""
}
# hatching.left_over += (poultry_request.quantity + poultry_request.losses)
hatching.losses -= poultry_request.losses
hatching.state = 'pending'
hatching.allow_hatching = 'pending'
hatching.save()
poultry_request.message = city_operator_check_request.message
poultry_request.state_process = 'rejected'
message = UserMessage(
message="درخواست شما با کد سفارش {0} از طرف کارشناس شهرستان {1} رد شده است ".format(
poultry_request.order_code, city_operator.fullname),
heading="پیام سیستم ثبت شده در تاریخ {0}".format(datetime.now()),
sender=city_operator
)
message.save()
message.users.add(poultry_request.poultry.user)
city_operator_check_request.city_operator_system = city_operator_system
city_operator_check_request.poultry_request = poultry_request
if poultry_request.auction == True:
city_operator_check_request.show_province = False
poultry_request.save()
if role == 'ProvinceOperator':
city_operator_check_request.province_accept = True
city_operator_check_request.save()
if state == 'accept':
if SmsLicense.objects.filter(city_approval=True).exists():
poultry_mobile = city_operator_check_request.poultry_request.poultry.user.mobile
order_code = city_operator_check_request.poultry_request.order_code
date_str = str(city_operator_check_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)
sms_poultry_request_receive_city_accept_sms = threading.Thread(
target=poultry_request_receive_city_accept_sms,
args=(
poultry_mobile,
send_date,city_operator_check_request.poultry_request.order_code,
send_date,city_operator_check_request.poultry_request.free_sale_in_province,
))
sms_poultry_request_receive_city_accept_sms.start()
if role == 'ProvinceOperator':
poultry_mobile = city_operator_check_request.poultry_request.poultry.user.mobile
order_code = city_operator_check_request.poultry_request.order_code
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=city_operator_check_request.poultry_request,
city_request_Poultry=city_operator_check_request,
quantity=poultry_request.quantity,
state='accept',
)
check.save()
city_operator_check_request.province_state = 'accept'
city_operator_check_request.save()
poultry_request.province_state = 'accepted'
poultry_request.save()
sms_poultry_request_receive_province_accept_sms_sms = threading.Thread(
target=poultry_request_receive_province_accept_sms,
args=(
poultry_mobile, order_code))
sms_poultry_request_receive_province_accept_sms_sms.start()
return Response({"result": "درخواست شما با موفقیت برای استان ارسال شد."}, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
# تابع برای نمایش درخواست های تایید شده مرغدار توسط شهرستان
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
queryset = []
if 'state' in request.GET:
user = SystemUserProfile.objects.get(user=request.user)
if request.GET['state'] == 'waiting':
if 'date' in request.GET:
date = datetime.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = datetime.now().date()
queryset = []
queryset = CityOperatorCheckRequest.objects.filter(
show_province=True, city_operator_system__address__province=user.province,
poultry_request__final_state='pending', trash=False, poultry_request__direct_buying=False,
poultry_request__send_date__year=date.year, poultry_request__send_date__month=date.month,
poultry_request__send_date__day=date.day
).order_by(
'-poultry_request__send_date')
# item_list = CityOperatorCheckRequest.objects.filter(
# show_province=True, city_operator_system__address__province=user.province,
# poultry_request__final_state='pending', trash=False,
# poultry_request__send_date__year=date.year, poultry_request__send_date__month=date.month,
# poultry_request__send_date__day=date.day
# ).order_by(
# '-poultry_request__send_date')
# for req in item_list:
# province_check_req = ProvinceCheckOperatorRequest.objects.filter(city_request_Poultry=req)
# if province_check_req.count() > 0:
# province_check_req = province_check_req.last()
# if province_check_req.quantity > 0 and province_check_req.state == 'accept' or province_check_req.state == 'pending':
# if req in queryset:
# pass
# else:
# queryset.append(req)
# province_kill_reqs = ProvinceKillRequest.objects.filter(province_request=province_check_req)
# if province_kill_reqs.count() > 0:
# counter = 0
# for province_kill_req in province_kill_reqs:
# if KillHouseCheckRequest.objects.filter(
# province_kill_request=province_kill_req, state='accepted').exists():
# counter += 1
# if province_kill_reqs.count() == counter and province_check_req.quantity == 0:
# pass
# else:
#
# if req in queryset:
# pass
# else:
# queryset.append(req)
elif request.GET['state'] == 'all':
queryset = CityOperatorCheckRequest.objects.filter(
show_province=True, city_operator_system__address__province=user.province,
poultry_request__final_state='pending', trash=False).order_by(
'-poultry_request__send_date')
elif request.GET['state'] == 'new':
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 = CityOperatorCheckRequest.objects.filter(state='accept', province_state='pending',
show_province=True,
city_operator_system__address__province=user.province,
trash=False).order_by(
'poultry_request__send_date')
queryset = [
city_check for city_check in queryset_list
if date1 <= city_check.poultry_request.send_date.date() <= date2
]
else:
pass
# if 'state' in request.GET:
# if request.GET['state'] == 'CityOperator':
# user = SystemUserProfile.objects.get(user=request.user)
# city_operator = CityOperator.objects.get(user=user)
# queryset = CityOperatorCheckRequest.objects.filter(
# poultry_request__user__address__city=city_operator.address.city).order_by('-create_date')
if 'type' in request.GET:
if request.GET['type'] == 'filter':
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (self.filterset_class(
data=query,
queryset=self.queryset.filter(state__exact="accept", trash=False)
)
).filter():
ps = self.filterset_class(data=query, queryset=self.queryset)
filtered_city_operator = ps.filter()
serializer = self.serializer_class(filtered_city_operator, many=True)
return Response(serializer.data)
return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN)
serializer = CityOperatorCheckRequestSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class CityOperatorCheckRequestNewViewSet(viewsets.ModelViewSet):
queryset = CityOperatorCheckRequest.objects.all()
serializer_class = CityOperatorCheckRequestSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = CityOperatorRequestFilterSet
filterset_fields = [
'poultry_request__poultry__user__mobile',
'poultry_request__poultry__user__fullname',
'poultry_request__poultry__user__first_name',
'poultry_request__poultry__user__last_name',
'poultry_request__poultry__user__city__name',
'poultry_request__order_code',
]
# تابع برای نمایش درخواست های تایید شده مرغدار توسط شهرستان
def list(self, request, *args, **kwargs):
queryset = []
if 'state' in request.GET:
user = SystemUserProfile.objects.get(user=request.user)
if request.GET['state'] == 'waiting':
if 'date' in request.GET:
date = datetime.strptime(request.GET['date'], '%Y-%m-%d')
else:
date = datetime.now().date()
queryset = []
queryset = CityOperatorCheckRequest.objects.filter(
show_province=True, city_operator_system__address__province=user.province,
poultry_request__final_state='pending', trash=False, poultry_request__direct_buying=False,
poultry_request__send_date__year=date.year, poultry_request__send_date__month=date.month,
poultry_request__send_date__day=date.day
).order_by(
'-poultry_request__send_date')
elif request.GET['state'] == 'all':
queryset = CityOperatorCheckRequest.objects.filter(
show_province=True, city_operator_system__address__province=user.province,
poultry_request__final_state='pending', trash=False).order_by(
'-poultry_request__send_date')
elif request.GET['state'] == 'new':
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 = CityOperatorCheckRequest.objects.filter(state='accept', province_state='pending',
show_province=True,
poultry_request__send_date__date__gte=date1,
poultry_request__send_date__date__lte=date2,
city_operator_system__address__province=user.province,
trash=False).order_by(
'poultry_request__send_date')
# queryset = [
# city_check for city_check in queryset_list
# if date1 <= city_check.poultry_request.send_date.date() <= date2
# ]
else:
pass
if 'search' in request.GET:
city_check_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=queryset
)
).filter():
ps = self.filterset_class(data=query, queryset=queryset)
city_check_requests = ps.filter()
queryset = [] if len(city_check_requests) == 0 else city_check_requests
page_size = request.query_params.get('page_size', None)
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = CityOperatorCheckRequestSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class PoultryEditByCityOperatorViewSet(viewsets.ModelViewSet):
queryset = Poultry.objects.all()
permission_classes = [TokenHasReadWriteScope]
serializer_class = PoultrySerializer
def update(self, request, *args, **kwargs):
# refresh(request.user.id)
# get poultry object
poultry_object = self.queryset.get(key=request.data['poultry_key'], trash=False)
request.data.pop('poultry_key')
# Remove Null Fields From Address Body
request = remove_null_fields(type='item', request=request, item='address')
# Remove Null Fields From User Bank Info Body
request = remove_null_fields(type='item', request=request, item='user_bank_info')
# Remove Null Fields From request Body
request = remove_null_fields(type='req', request=request)
# update address information
address_data = request.data['address']
province = None
city = None
if 'province' and 'city' in address_data.keys():
province = Province.objects.get(key=address_data['province'], trash=False)
address_data.pop('province')
city = City.objects.get(key=address_data['city'], trash=False)
address_data.pop('city')
address_serializer = SystemAddressSerializer(data=address_data)
if address_serializer.is_valid():
addr_object = address_serializer.update(
instance=poultry_object.address,
validated_data=address_data
)
if province != None and city != None:
addr_object.province = province
addr_object.city = city
addr_object.save()
request.data.pop('address')
# update user bank information
if poultry_object.user_bank_info != None:
bank_data = request.data['user_bank_info']
bank_serializer = BankCardSerializer(data=bank_data)
if bank_serializer.is_valid():
bank_object = bank_serializer.update(
instance=poultry_object.user_bank_info,
validated_data=bank_data
)
request.data.pop('user_bank_info')
else:
bank_data = request.data['user_bank_info']
bank_serializer = BankCardSerializer(data=bank_data)
if bank_serializer.is_valid():
bank_object = bank_serializer.create(
validated_data=bank_data
)
request.data.pop('user_bank_info')
# sending data to serializer & update poultry object
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
obj = serializer.update(
instance=poultry_object,
validated_data=request.data
)
obj.user_bank_info = bank_object
obj.save()
serializer = self.serializer_class(obj)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ManagementRequestViewSet(viewsets.ModelViewSet):
queryset = PoultryRequest.objects.all()
serializer_class = PoultryRequestSerializer
pagination_class = CustomPagination
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
# filterset_class = PoultryRequestFilterSet
filterset_fields = [
'order_code',
'poultry__user__mobile',
'poultry__user__fullname',
'poultry__user__first_name',
'poultry__user__last_name',
'poultry__address__city__name',
]
def 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
poultry_requests = []
user = SystemUserProfile.objects.get(user=request.user)
queryset = PoultryRequest.objects.filter(poultry__address__province=user.province,
trash=False, state_process__in=('pending', 'accepted'),
province_state='pending',
final_state='pending', out=False,
send_date__date__gte=date1, send_date__date__lte=date2
).order_by('-send_date')
if 'search' in request.GET:
if request.GET['search'] == 'filter':
if request.GET['value'] != "":
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (PoultryRequestFilterSet(
data=query,
queryset=queryset
)
).filter():
ps = PoultryRequestFilterSet(data=query, queryset=queryset)
poultry_requests = ps.filter()
queryset = [] if len(poultry_requests) == 0 else poultry_requests
page_size = request.query_params.get('page_size', None)
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = PoultryRequestForKillingInformationSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = PoultryRequestForKillingInformationSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)