first push
This commit is contained in:
0
panel/poultry/__init__.py
Normal file
0
panel/poultry/__init__.py
Normal file
10772
panel/poultry/excel_processing.py
Normal file
10772
panel/poultry/excel_processing.py
Normal file
File diff suppressed because it is too large
Load Diff
304
panel/poultry/helpers.py
Normal file
304
panel/poultry/helpers.py
Normal file
@@ -0,0 +1,304 @@
|
||||
import datetime
|
||||
from collections import defaultdict
|
||||
from datetime import timedelta
|
||||
|
||||
from django.db.models import Sum, Q
|
||||
from django.http import HttpResponse
|
||||
|
||||
from authentication.sahandsms.sms import kill_house_price
|
||||
from panel.models import PoultryRequest, PoultryHatching, KillHouseRequest, ProvinceKillRequest, \
|
||||
HatchingIncreaseRequest, ChickenCommissionPrices, KillRequest, PoultryRequestQuarantineCode, MarketDailyLimitation
|
||||
|
||||
|
||||
def poultry_prediction(poultry):
|
||||
total_quantity = 0
|
||||
total_weight = 0
|
||||
total_count = 0
|
||||
killing_ave_weight = 0
|
||||
|
||||
hatchings = PoultryHatching.objects.filter(poultry=poultry, trash=False, state='pending',
|
||||
archive=False, temporary_trash=False,
|
||||
temporary_deleted=False)
|
||||
|
||||
poultry_requests = PoultryRequest.objects.filter(poultry=poultry, trash=False,
|
||||
state_process__in=('pending', 'accepted'),
|
||||
province_state__in=('pending', 'accepted'),
|
||||
out_province_request_cancel=False, killing_age__gt=30,
|
||||
killing_age__lte=70, temporary_trash=False,
|
||||
temporary_deleted=False)
|
||||
sum_killing_ages = poultry_requests.aggregate(total=Sum('killing_age'))[
|
||||
'total'] or 0
|
||||
ave_killing_age = int(sum_killing_ages / len(poultry_requests)) if len(poultry_requests) > 0 else 1
|
||||
if hatchings:
|
||||
for hatching in hatchings:
|
||||
if hatching.now_age <= ave_killing_age:
|
||||
difference = ave_killing_age - hatching.now_age
|
||||
predicate_date = datetime.datetime.now().date() + timedelta(days=difference)
|
||||
hatching.predicate_date = predicate_date
|
||||
hatching.save()
|
||||
poultry.killing_ave_age = ave_killing_age
|
||||
|
||||
province_kill_requests = ProvinceKillRequest.objects.filter(trash=False,
|
||||
province_request__poultry_request__poultry=poultry,
|
||||
state__in=('pending', 'accepted'),
|
||||
return_to_province=False, first_car_allocated_quantity=0
|
||||
, temporary_trash=False,
|
||||
temporary_deleted=False)
|
||||
|
||||
sum_province_kill_requests_quantity = province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
|
||||
'total'] or 0
|
||||
sum_kill_province_kill_requests_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
|
||||
'total'] or 0
|
||||
kill_house_requests = KillHouseRequest.objects.filter(trash=False,
|
||||
province_request__poultry_request__poultry=poultry,
|
||||
temporary_trash=False,
|
||||
temporary_deleted=False)
|
||||
sum_kill_house_requests_quantity = kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
|
||||
'total'] or 0
|
||||
sum_kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
|
||||
'total'] or 0
|
||||
loss_percent = kill_house_requests.aggregate(total=Sum('weight_loss'))[
|
||||
'total'] or 0
|
||||
ave_loss_percent = round(loss_percent / len(kill_house_requests), 2) if len(kill_house_requests) > 0 else 0
|
||||
total_quantity = sum_province_kill_requests_quantity + sum_kill_house_requests_quantity
|
||||
total_weight = sum_kill_province_kill_requests_weight + sum_kill_house_requests_weight
|
||||
total_count = len(province_kill_requests) + len(kill_house_requests)
|
||||
killing_ave_count = total_quantity / total_count if total_count > 0 else 0
|
||||
killing_ave_weight = round(total_weight / total_quantity, 2) if total_quantity > 0 else 0
|
||||
|
||||
poultry.killing_ave_count = killing_ave_count
|
||||
poultry.real_killing_ave_weight = killing_ave_weight
|
||||
poultry.real_killing_loss_weight_percent = ave_loss_percent
|
||||
poultry.save()
|
||||
|
||||
|
||||
def poultry_prediction_helper(ave_killing_age, consumption_limit_type, date1=None, date2=None):
|
||||
# دریافت جوجهریزیها
|
||||
hatchings = PoultryHatching.objects.filter(
|
||||
trash=False, state='pending', archive=False, now_age__lte=ave_killing_age
|
||||
).order_by('date').select_related('poultry').only('poultry', 'left_over', 'now_age')
|
||||
|
||||
grouped_data = defaultdict(lambda: {
|
||||
"quantity": 0,
|
||||
"weight": 0,
|
||||
"poultry_count": 0,
|
||||
"poultry_ids": set(),
|
||||
"hatching_ids": set(),
|
||||
})
|
||||
|
||||
for hatching in hatchings:
|
||||
if hatching.now_age <= ave_killing_age:
|
||||
if date1:
|
||||
target_date = (
|
||||
datetime.datetime.now().date() + timedelta(days=ave_killing_age - hatching.now_age)).isoformat()
|
||||
obj_date = datetime.datetime.strptime(target_date, '%Y-%m-%d').date()
|
||||
if obj_date > date2 or obj_date < date1:
|
||||
continue
|
||||
else:
|
||||
target_date = (
|
||||
datetime.datetime.now().date() + timedelta(days=ave_killing_age - hatching.now_age)).isoformat()
|
||||
grouped_data[target_date]["quantity"] += hatching.left_over
|
||||
grouped_data[target_date]["weight"] += int(
|
||||
hatching.left_over * hatching.poultry.real_killing_ave_weight) if consumption_limit_type in (
|
||||
'quantity', 'live_weight') else int(
|
||||
(hatching.left_over * hatching.poultry.real_killing_ave_weight) * 0.75)
|
||||
grouped_data[target_date]["hatching_ids"].add(hatching.id)
|
||||
grouped_data[target_date]["poultry_ids"].add(hatching.poultry.id)
|
||||
grouped_data[target_date]["poultry_count"] = len(grouped_data[target_date]["poultry_ids"])
|
||||
|
||||
result = [
|
||||
{
|
||||
"age": ave_killing_age,
|
||||
"poultry": data['poultry_count'],
|
||||
"quantity": data["quantity"],
|
||||
"weight": data["weight"],
|
||||
"hatchings": data["hatching_ids"],
|
||||
"date": date
|
||||
}
|
||||
for date, data in grouped_data.items()
|
||||
]
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def calculate_hatching_increase(hatching):
|
||||
hatching_increase = HatchingIncreaseRequest.objects.filter(trash=False, hatching=hatching)
|
||||
quantity = hatching_increase.aggregate(total=Sum('quantity'))[
|
||||
'total'] or 0
|
||||
hatching.increase_quantity = quantity
|
||||
hatching.save()
|
||||
|
||||
|
||||
def create_update_chicken_commission_prices():
|
||||
now = datetime.datetime.now().date()
|
||||
chicken_commission = ChickenCommissionPrices.objects.get_or_create(date__date=now,
|
||||
defaults={'date': datetime.datetime.now(),
|
||||
'kill_house_price': kill_house_price})[
|
||||
0]
|
||||
# poultry_request
|
||||
poultry_request = PoultryRequest.objects.filter(trash=False, send_date__date=now,
|
||||
state_process__in=('pending', 'accepted'),
|
||||
province_state__in=('pending', 'accepted'), out=False,
|
||||
amount__gt=0).only(
|
||||
'amount')
|
||||
poultry_request_amount = poultry_request.aggregate(total=Sum('amount'))[
|
||||
'total'] or 0
|
||||
# ProvinceKillRequest
|
||||
province_kill_req = ProvinceKillRequest.objects.filter(trash=False, kill_request__recive_date__date=now,
|
||||
state__in=('pending', 'accepted'),
|
||||
kill_house_price__gt=0).only(
|
||||
'kill_house_price')
|
||||
|
||||
province_kill_req_kill_house_price = province_kill_req.aggregate(total=Sum('kill_house_price'))[
|
||||
'total'] or 0
|
||||
|
||||
# KillRequest
|
||||
kill_req = KillRequest.objects.filter(trash=False, recive_date__date=now, province_state__in=('accepted', 'pending')
|
||||
, poultry__isnull=False,
|
||||
direct_buying_state__in=('accepted', 'pending'), amount__gt=0).only(
|
||||
'amount')
|
||||
kill_req_amount = kill_req.aggregate(total=Sum('amount'))[
|
||||
'total'] or 0
|
||||
|
||||
kill_request_amount = round(
|
||||
kill_req_amount / kill_req.count()) if kill_req.count() > 0 else 0
|
||||
|
||||
province_kill_request_amount = round(province_kill_req_kill_house_price / province_kill_req.count()) \
|
||||
if province_kill_req.count() > 0 else 0
|
||||
|
||||
poultry_req_amount = round(poultry_request_amount / poultry_request.count()) if poultry_request.count() > 0 \
|
||||
else 0
|
||||
|
||||
amount = round(
|
||||
kill_req_amount + province_kill_req_kill_house_price + poultry_request_amount)
|
||||
|
||||
counts = poultry_request.count() + province_kill_req.count() + kill_req.count()
|
||||
|
||||
chicken_commission.chicken_average_price = round(amount / counts) if counts > 0 else 0
|
||||
chicken_commission.kill_request_amount = kill_request_amount
|
||||
chicken_commission.province_kill_request_amount = province_kill_request_amount
|
||||
chicken_commission.poultry_request_amount = poultry_req_amount
|
||||
|
||||
chicken_commission.save()
|
||||
|
||||
|
||||
def create_update_chicken_commission_prices_manual(request):
|
||||
now = datetime.datetime.now().date()
|
||||
for day in range(7):
|
||||
past_date = now - timedelta(days=day)
|
||||
past_datetime = datetime.datetime.combine(past_date, datetime.time.min)
|
||||
|
||||
chicken_commission = ChickenCommissionPrices.objects.get_or_create(date__date=past_date,
|
||||
defaults={'date': past_datetime,
|
||||
'kill_house_price': kill_house_price})[
|
||||
0]
|
||||
# # poultry_request
|
||||
poultry_request = PoultryRequest.objects.filter(trash=False, send_date__date=past_date,
|
||||
state_process__in=('pending', 'accepted'),
|
||||
province_state__in=('pending', 'accepted'), out=False,
|
||||
amount__gt=0).only(
|
||||
'amount')
|
||||
print(len(poultry_request))
|
||||
poultry_request_amount = poultry_request.aggregate(total=Sum('amount'))[
|
||||
'total'] or 0
|
||||
# ProvinceKillRequest
|
||||
province_kill_req = ProvinceKillRequest.objects.filter(trash=False, kill_request__recive_date__date=past_date,
|
||||
state__in=('pending', 'accepted'),
|
||||
kill_house_price__gt=0).only(
|
||||
'kill_house_price')
|
||||
|
||||
province_kill_req_kill_house_price = province_kill_req.aggregate(total=Sum('kill_house_price'))[
|
||||
'total'] or 0
|
||||
|
||||
# KillRequest
|
||||
kill_req = KillRequest.objects.filter(trash=False, recive_date__date=past_date,
|
||||
province_state__in=('accepted', 'pending')
|
||||
, poultry__isnull=False,
|
||||
direct_buying_state__in=('accepted', 'pending'), amount__gt=0).only(
|
||||
'amount')
|
||||
kill_req_amount = kill_req.aggregate(total=Sum('amount'))[
|
||||
'total'] or 0
|
||||
|
||||
kill_request_amount = round(
|
||||
kill_req_amount / kill_req.count()) if kill_req.count() > 0 else 0
|
||||
|
||||
province_kill_request_amount = round(province_kill_req_kill_house_price / province_kill_req.count()) \
|
||||
if province_kill_req.count() > 0 else 0
|
||||
|
||||
poultry_req_amount = round(poultry_request_amount / poultry_request.count()) if poultry_request.count() > 0 \
|
||||
else 0
|
||||
|
||||
amount = round(
|
||||
kill_req_amount + province_kill_req_kill_house_price + poultry_request_amount)
|
||||
|
||||
counts = poultry_request.count() + province_kill_req.count() + kill_req.count()
|
||||
|
||||
chicken_commission.chicken_average_price = round(amount / counts) if counts > 0 else 0
|
||||
chicken_commission.kill_request_amount = kill_request_amount
|
||||
chicken_commission.province_kill_request_amount = province_kill_request_amount
|
||||
chicken_commission.poultry_request_amount = poultry_req_amount
|
||||
|
||||
chicken_commission.save()
|
||||
|
||||
|
||||
def add_poultry_request_quarantine_code(request):
|
||||
poultry_requests = PoultryRequest.objects.filter(
|
||||
trash=False,
|
||||
quarantine_code__isnull=False,
|
||||
state_process__in=('pending', 'accepted'),
|
||||
province_state__in=('pending', 'accepted')
|
||||
).only('id', 'quarantine_code', 'quarantine_quantity')
|
||||
|
||||
codes = [
|
||||
PoultryRequestQuarantineCode(
|
||||
poultry_request=poultry_request,
|
||||
quarantine_code=poultry_request.quarantine_code,
|
||||
system_quarantine_quantity=poultry_request.quarantine_quantity,
|
||||
quarantine_quantity=poultry_request.quarantine_quantity,
|
||||
)
|
||||
for poultry_request in poultry_requests
|
||||
]
|
||||
|
||||
PoultryRequestQuarantineCode.objects.bulk_create(codes)
|
||||
|
||||
return HttpResponse('ok')
|
||||
|
||||
|
||||
def update_archive_date_poultry_hatching(request):
|
||||
poultry_hatchings = PoultryHatching.objects.filter(Q(allow_hatching='True', state='complete') | Q(archive=True),
|
||||
trash=False,
|
||||
)
|
||||
for p in poultry_hatchings:
|
||||
p.archive_date = p.date + timedelta(p.chicken_age)
|
||||
p.save()
|
||||
return HttpResponse('ok')
|
||||
|
||||
|
||||
def market_daily_limitation_info():
|
||||
limitation_quantity = 0
|
||||
market_request_quantity = 0
|
||||
limitation = MarketDailyLimitation.objects.filter().first()
|
||||
if limitation:
|
||||
limitation_quantity = limitation.quantity
|
||||
|
||||
poultry_Requests = PoultryRequest.objects.filter(
|
||||
state_process__in=('pending', 'accepted'),
|
||||
province_state__in=('pending', 'accepted'),
|
||||
temporary_trash=False,
|
||||
trash=False,
|
||||
out=False,
|
||||
send_date__date=datetime.datetime.now().date(),
|
||||
final_state='pending',
|
||||
market=True
|
||||
).aggregate(
|
||||
total_quantity=Sum('quantity')
|
||||
)
|
||||
market_request_quantity = poultry_Requests['total_quantity'] or 0
|
||||
|
||||
result = {
|
||||
"max_limitation_quantity": limitation_quantity,
|
||||
"market_request_quantity": market_request_quantity,
|
||||
"remain_quantity" : limitation_quantity - market_request_quantity if (limitation_quantity - market_request_quantity) else 0
|
||||
|
||||
}
|
||||
return result
|
||||
3367
panel/poultry/serializers.py
Normal file
3367
panel/poultry/serializers.py
Normal file
File diff suppressed because it is too large
Load Diff
10383
panel/poultry/views.py
Normal file
10383
panel/poultry/views.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user