Files
Rasadyar_Marzaki/authentication/register.py

4489 lines
208 KiB
Python
Raw Normal View History

2026-01-18 11:45:53 +03:30
from datetime import datetime, timedelta
import utm
from django.contrib.auth.models import User, Group
from django.db.models.functions import Abs
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
import openpyxl
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.utils import get_column_letter
from io import BytesIO
from authentication.sahandsms.sms import USERNAME_SMS_FINANCIAL, PASSWORD_SMS_FINANCIAL, OUT_SMS_PASS, OUT_SMS_USER, \
PASSWORD_SMS_HAMEDAN, USERNAME_SMS_HAMEDAN
from authentication.sms_management import send_sms_request
from authentication.views import ARTA_URL_CHANGE_MOBILE_NUMBER, ARTA_URL_CHANGE_PASSWORD
from general_urls import base_user_gate_way_id, base_url_for_sms_report
from panel.KillHouse.helpers import kill_house_free_sale_product_warehousing, kill_house_requests_product_warehousing, \
kill_house_free_buying_product_warehousing, kill_house_allocations_product_warehousing
from panel.ProvinceOperator.helpers import guild_steward_allocations_product_warehousing, \
guild_steward_free_buying_product_warehousing, guild_steward_free_sale_product_warehousing, \
guild_steward_product_segmentation
from panel.admin import PROJECT_API_KEY
from panel.convert_date import convert_to_miladi
from panel.helper import UNION_NUMBER, check_mobile_number
from panel.helper_excel import percent_of_losses, shamsi_date, to_locale_str
from panel.models import KillHouseDriver, Poultry, PoultryRequest, Wallet, LastUpdate, \
KillHouseAssignmentInformation, KillHouseRequest, KillHouse, InternalTransaction, Guilds, Steward, GuildSteward, \
RolesProducts, StewardAllocation, NewProduct, KillHouseFreeBarInformation, KillHouseFreeSaleBarInformation, \
ColdHouseAllocations, CityOperatorCheckRequest, KillRequest, StewardFreeBarInformation, \
StewardFreeSaleBarInformation, ChainAllocation, KillHouseWareHouse, VetFarm, CityOperator, CityGuild, \
BarDifferenceRequest, PosSegmentation, PosMachineTransactions, WarehouseArchive, ProductsTransactions
from authentication.models import SystemUserProfile, City, Province, ExternalTransaction
import requests
from rest_framework.decorators import permission_classes, api_view
from rest_framework.permissions import AllowAny
from django.db.models import Q, F, Count, Sum
from panel.poultry.helpers import poultry_prediction
from ticket.models import TicketSupport, MessageSupport
ARTA_REGISTER = "https://userbackend.rasadyar.com/api/register_all/"
from rest_framework.response import Response
import hashlib
# pk_assigment = [4990, 4991, 4992, 4385, 4386, 4387, 4447, 4448, 4449, 4839, 4840, 5084, 5109, 5111, 3875, 4895, 4897,
# 4899, 4900, 4901, 4902, 4530, 4531, 4532, 4533, 4534, 4583, 4585, 4630, 4632, 4635, 4034, 3130, 3132,
# 4707, 4708, 4709, 4710, 4711, 3173, 3174, 3176, 3177, 3178, 3179, 3180]
#
# pk_kill_house_request = [12291, 12289, 12288, 11568, 11569, 11567, 11669, 11667, 11671, 12053, 12055, 12368, 12401,
# 12421, 10918, 12124, 12136, 12135, 12137, 12132, 12134, 11734, 11731, 11732, 11733, 11735,
# 11779, 11782, 11875, 11873, 11871, 11142, 10104, 10106, 11886, 11887, 11889, 11891, 11893,
# 10084, 10085, 10080, 10082, 10075, 10077, 10116]
#
# pk_province_kill_request = [4289, 4275, 4275, 4041, 4041, 4038, 4076, 4076, 4055, 4195, 4195, 4316, 4334, 4335, 3811, 4215,
# 4217, 4217, 4217, 4218, 4218, 4104,
# 4104, 4104, 4104, 4104, 4114, 4114, 4136, 4136, 4148, 3877, 3546, 3545, 4151, 4151, 4151, 4151,
# 4151, 3530, 3530, 3542, 3542, 3535, 3535, 3542]
#
# pk_hatching = [1273, 1251, 1251, 1206, 1206, 1252, 1247, 1247, 1206, 1203, 1203, 1276, 1307, 1249, 1143, 1281, 1232,
# 1232, 1232, 1273, 1273, 1240,
# 1240, 1240, 1240, 1240, 1234, 1234, 1200, 1200, 1247, 1186, 1085, 1098, 1251, 1251, 1251, 1251, 1251,
# 1336, 1336, 1113, 1113, 1253, 1253, 1113]
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def create_driver_excel_template(request):
"""
ایجاد فایل اکسل قالب برای ثبت رانندهها
پارامتر: kill_house_ids - لیست id کشتارگاهها (کاما جدا شده)
"""
# دریافت id های کشتارگاه از پارامترهای درخواست
kill_house_ids_param = request.GET.get('kill_house_ids', '')
if kill_house_ids_param:
kill_house_ids = [int(x.strip()) for x in kill_house_ids_param.split(',') if x.strip()]
kill_houses = KillHouse.objects.filter(trash=False, id__in=kill_house_ids)
else:
kill_houses = KillHouse.objects.filter(trash=False)
# ساخت workbook
workbook = openpyxl.Workbook()
worksheet = workbook.active
worksheet.title = "رانندگان"
worksheet.sheet_view.rightToLeft = True
# تعریف هدرهای اکسل
headers = [
'کشتارگاه',
'مدل خودرو',
'نوع خودرو',
'پلاک خودرو',
'کد بهداشتی حمل',
'تاریخ اعتبار بهداشتی',
'ظرفیت خودرو(قفس)',
'کد ملی راننده',
'شماره تماس راننده',
'ملاحظات'
]
# استایل‌ها
header_fill = PatternFill(start_color="1E487B", fill_type="solid")
header_font = Font(size=11, bold=True, color="FFFFFF")
header_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# نوشتن هدرها
for col_num, header in enumerate(headers, 1):
cell = worksheet.cell(row=1, column=col_num, value=header)
cell.fill = header_fill
cell.font = header_font
cell.alignment = header_alignment
cell.border = thin_border
worksheet.column_dimensions[get_column_letter(col_num)].width = 18
# تنظیم عرض ستون‌ها
worksheet.column_dimensions['A'].width = 30 # کشتارگاه
worksheet.column_dimensions['D'].width = 22 # پلاک خودرو
worksheet.column_dimensions['F'].width = 20 # تاریخ اعتبار بهداشتی
worksheet.column_dimensions['J'].width = 25 # ملاحظات
# ارتفاع ردیف هدر
worksheet.row_dimensions[1].height = 25
# ایجاد شیت جدید برای لیست کشتارگاه‌ها
kill_house_sheet = workbook.create_sheet(title="لیست کشتارگاه‌ها")
kill_house_sheet.sheet_view.rightToLeft = True
# هدر شیت کشتارگاه‌ها
kill_house_headers = ['شناسه (ID)', 'نام کشتارگاه']
for col_num, header in enumerate(kill_house_headers, 1):
cell = kill_house_sheet.cell(row=1, column=col_num, value=header)
cell.fill = header_fill
cell.font = header_font
cell.alignment = header_alignment
cell.border = thin_border
kill_house_sheet.column_dimensions['A'].width = 15
kill_house_sheet.column_dimensions['B'].width = 35
# لیست برای dropdown
kill_house_list = []
# پر کردن لیست کشتارگاه‌ها
for row_num, kill_house in enumerate(kill_houses, 2):
# فرمت: "id - نام کشتارگاه"
display_value = f"{kill_house.id} - {kill_house.name or 'بدون نام'}"
kill_house_list.append(display_value)
kill_house_sheet.cell(row=row_num, column=1, value=kill_house.id).border = thin_border
kill_house_sheet.cell(row=row_num, column=2, value=kill_house.name or 'بدون نام').border = thin_border
# ایجاد dropdown برای ستون کشتارگاه
if kill_house_list:
# اگر تعداد کشتارگاه‌ها زیاد باشد، از reference به شیت دیگر استفاده می‌کنیم
if len(kill_house_list) <= 100:
# استفاده از لیست مستقیم
dv = DataValidation(
type="list",
formula1='"' + ','.join(kill_house_list) + '"',
allow_blank=True
)
else:
# استفاده از reference به شیت کشتارگاه‌ها
dv = DataValidation(
type="list",
formula1=f"'لیست کشتارگاه‌ها'!$A$2:$A${len(kill_house_list) + 1}",
allow_blank=True
)
dv.error = 'لطفاً از لیست کشتارگاه‌ها انتخاب کنید'
dv.errorTitle = 'ورودی نامعتبر'
dv.prompt = 'یک کشتارگاه از لیست انتخاب کنید'
dv.promptTitle = 'انتخاب کشتارگاه'
# اضافه کردن validation به ستون اول (کشتارگاه) برای 1000 ردیف
dv.add('A2:A1001')
worksheet.add_data_validation(dv)
# ذخیره فایل در BytesIO
output = BytesIO()
workbook.save(output)
output.seek(0)
# ارسال فایل به عنوان response
response = HttpResponse(
content=output.getvalue(),
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)
response['Content-Disposition'] = 'attachment; filename="driver_template.xlsx"'
return response
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def upload_driver_excel(request):
from panel.models import KillHouseADDCAR
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
group = Group.objects.get(name__exact="Driver")
success_count = 0
error_list = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i == 1:
continue
try:
kill_house_value = row[0]
type_car = row[2] # مدل خودرو
pelak = row[3] # پلاک خودرو
health_code = row[4] # کد بهداشتی حمل
health_code_expiry = row[5] # تاریخ اعتبار بهداشتی
capacity = row[6] # ظرفیت خودرو (قفس)
national_code = row[7] # کد ملی راننده
driver_mobile = row[8] # شماره تماس راننده
notes = row[9] if len(row) > 9 else None # ملاحظات
kill_house_id = None
if kill_house_value:
if isinstance(kill_house_value, int):
kill_house_id = kill_house_value
elif isinstance(kill_house_value, str):
if ' - ' in str(kill_house_value):
kill_house_id = int(str(kill_house_value).split(' - ')[0].strip())
else:
kill_house_id = int(kill_house_value)
kill_house = None
if kill_house_id:
kill_house = KillHouse.objects.filter(trash=False, id=kill_house_id).first()
driver_mobile = str(driver_mobile) if driver_mobile else None
if driver_mobile and len(driver_mobile) <= 10:
driver_mobile = '0' + driver_mobile
if not driver_mobile:
error_list.append(f"ردیف {i + 1}: شماره تماس راننده خالی است")
continue
driver_name = ""
if kill_house:
existing_drivers_count = KillHouseADDCAR.objects.filter(
trash=False,
kill_house=kill_house,
archive=False
).count()
kill_house_name = kill_house.name or f"کشتارگاه {kill_house.id}"
driver_number = existing_drivers_count + 1
driver_name = f"راننده {kill_house_name} {driver_number}"
system_profile = None
try:
system_profile = SystemUserProfile.objects.get(trash=False, mobile=driver_mobile)
if group not in system_profile.role.all():
system_profile.role.add(group)
if not system_profile.first_name and driver_name:
system_profile.first_name = driver_name
system_profile.fullname = driver_name
system_profile.save()
except SystemUserProfile.DoesNotExist:
password = '123456'
hashed_password = hashlib.sha256(str(password).encode()).hexdigest()
data = {
"username": driver_mobile,
"first_name": driver_name,
"last_name": "",
"password": hashed_password,
"national_code": str(national_code) if national_code else "",
"role": "Driver",
"api_key": PROJECT_API_KEY
}
req = requests.post(
url=ARTA_REGISTER,
data=data,
verify=False
)
if req.status_code == 200:
user = User(username=driver_mobile, first_name=driver_name, last_name="", password=hashed_password)
user.save()
base_id = SystemUserProfile.objects.all()
if base_id.count() > 0:
base_id = int(base_id.last().base_order) + 1
else:
base_id = 1000
province_obj = None
city_obj = None
if kill_house and kill_house.system_address:
province_obj = kill_house.system_address.province
city_obj = kill_house.system_address.city
system_profile = SystemUserProfile(
mobile=driver_mobile,
first_name=driver_name,
last_name="",
fullname=driver_name,
user=user,
base_order=base_id,
password=password,
national_code=str(national_code) if national_code else None,
city=city_obj,
province=province_obj
)
system_profile.save()
system_profile.role.add(group)
else:
error_list.append(f"ردیف {i + 1}: خطا در ثبت کاربر در سیستم مرکزی")
continue
province_name = None
province_number = 0
city_name = None
city_number = 0
if kill_house:
province_name = kill_house.province_name
province_number = kill_house.province_number or 0
city_name = kill_house.city_name
city_number = kill_house.city_number or 0
driver = KillHouseDriver(
type_car=str(type_car) if type_car else None,
type='exclusive',
capocity=str(capacity) if capacity else None,
pelak=str(pelak) if pelak else None,
health_code=str(health_code) if health_code else None,
driver_name=driver_name,
driver_mobile=driver_mobile,
user=system_profile,
)
driver.save()
if kill_house:
if not KillHouseADDCAR.objects.filter(
trash=False,
kill_house=kill_house,
driver=driver,
archive=False
).exists():
add_car = KillHouseADDCAR(
kill_house=kill_house,
driver=driver,
kill_house_id_foreign_key=kill_house.id,
driver_id_foreign_key=driver.id,
province_name=province_name,
province_number=province_number,
city_name=city_name,
city_number=city_number
)
add_car.save()
success_count += 1
except Exception as e:
error_list.append(f"ردیف {i + 1}: {str(e)}")
continue
return Response({
"result": "عملیات با موفقیت انجام شد",
"success_count": success_count,
"errors": error_list
}, status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def get_driver_excel(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
group = Group.objects.get(name__exact="Driver")
for i, row in enumerate(sheet.iter_rows(values_only=True)):
first_name = row[1]
last_name = row[2]
mobile = row[3]
birthday = row[4]
province = row[5]
city = row[6]
password = row[7]
national_code = row[8]
car = row[9]
capacity = row[10]
plaque = row[11]
health_code = row[12]
hashed_password = hashlib.sha256(str(password).encode()).hexdigest()
province = Province.objects.filter(name=province)
province = province.last()
city = City.objects.filter(name=city)
city = city.last()
if i == 0:
continue
mobile = str(mobile)
if len(mobile) <= 10:
mobile = '0' + mobile
try:
system_profile = SystemUserProfile.objects.get(trash=False, mobile=mobile)
if 'Driver' not in system_profile.role.all():
system_profile.role.add(group)
except:
data = {
"username": mobile,
"first_name": first_name,
"last_name": last_name,
"password": hashed_password,
"national_code": national_code,
"role": "Driver",
"api_key": PROJECT_API_KEY
}
req = requests.post(
url=ARTA_REGISTER,
data=data,
verify=False
)
if req.status_code == 200:
user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password)
user.save()
base_id = SystemUserProfile.objects.all()
if base_id.count() > 0:
base_id = int(base_id.last().base_order) + 1
else:
base_id = 1000
system_profile = SystemUserProfile(
mobile=mobile,
first_name=first_name,
last_name=last_name,
fullname=first_name + '' + last_name,
user=user,
base_order=base_id,
password=password,
birthday=birthday,
city=city,
province=province
)
system_profile.save()
system_profile.role.add(group)
else:
return Response({"result": "مشکلی پیش آمده!"}, status=status.HTTP_401_UNAUTHORIZED)
if KillHouseDriver.objects.filter(trash=False, user=system_profile, health_code=health_code,
pelak=plaque).exists():
continue
else:
driver = KillHouseDriver(
type_car=car,
capocity=capacity,
pelak=plaque,
health_code=health_code,
driver_name=first_name + '' + last_name,
driver_mobile=mobile,
user=system_profile,
)
driver.save()
return Response({"result": "register"}, status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def get_poultry_hatching_excel(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename='BytesIO(file)', data_only=True)
sheet = wb_obj.active
sheet.delete_rows(sheet.max_row)
not_find_list = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
breeding_uniq_id = row[4]
licence_number = row[7]
hatching_quantity = row[11]
poultry_name = row[5]
losses = row[22]
if i <= 6:
continue
poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first()
if not poultry:
not_find_list.append(breeding_uniq_id)
continue
poultry.unit_name = poultry_name
poultry.save()
hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id')
if hatch:
period = hatch.last().period + 1
else:
period = 1
hatching_date = row[9].split('/')
date = convert_to_miladi(
year=int(hatching_date[0]),
month=int(hatching_date[1]),
day=int(hatching_date[2])
)
poultry_hatching = hatch.filter(trash=False, archive=False, state='pending',
allow_hatching='pending').order_by('id')
if not poultry_hatching.exists():
if not hatch.filter(archive=True, state='complete',
allow_hatching="True", licence_number=licence_number).exists():
hatching = PoultryHatching(
poultry=poultry,
date=date,
quantity=hatching_quantity,
breed=[
{"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}],
period=period,
chicken_breed='*ترکیبی',
hall=1,
left_over=hatching_quantity,
latest_hatching_change={
"role": "UnitWindow",
"date": str(datetime.now().date()),
"full_name": ""
},
licence_number=licence_number,
breeding_unique_id=breeding_uniq_id,
losses=losses
)
hatching.save()
else:
previouse_hatching = poultry_hatching.last()
hatchings = poultry_hatching.filter(licence_number=licence_number)
if not hatchings:
if previouse_hatching.left_over > (previouse_hatching.quantity * percent_of_losses):
previouse_hatching.violation = True
previouse_hatching.save()
hatching = PoultryHatching(
poultry=poultry,
date=date,
quantity=hatching_quantity,
breed=[
{"breed": 'آرین', "main_quantity": hatching_quantity, "remain_quantity": hatching_quantity}],
period=period,
chicken_breed='*ترکیبی',
hall=1,
left_over=hatching_quantity,
latest_hatching_change={
"role": "UnitWindow",
"date": str(datetime.now().date()),
"full_name": ""
},
licence_number=licence_number,
breeding_unique_id=breeding_uniq_id,
losses=losses
)
hatching.save()
else:
last_hatchings = hatchings.first()
last_hatchings.date = date
last_hatchings.quantity = hatching_quantity
last_hatchings.losses = losses
last_hatchings.save()
update = LastUpdate.objects.first()
update.update_date = datetime.now()
update.save()
return Response(not_find_list, status=status.HTTP_201_CREATED)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def check_poultry_hatching_excel(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
inter = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
breeding_uniq_id = row[3]
if i == 7:
continue
poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id)
if poultry:
poultry = poultry.last()
else:
continue
poultry_hatching = PoultryHatching.objects.filter(trash=False, poultry=poultry, state='pending')
for poultry_hatchings in poultry_hatching:
dict_1 = {
"poultry": poultry_hatchings.poultry.unit_name,
"date": poultry_hatchings.date,
"quantity": poultry_hatchings.quantity,
"breed": poultry_hatchings.chicken_breed,
}
inter.append(dict_1)
# dict_1.clear()
return Response(inter, status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def check_poultry_in_db(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
list1 = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
try:
poultry = Poultry.objects.get(breeding_unique_id=row[6])
if poultry:
continue
except:
dict1 = {
'نام مرغدار': row[0],
'شناسه یکتا': row[6]
}
list1.append(dict1)
return Response(list1, status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def reset_hatching_excel(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
l = 0
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i <= 7:
continue
date = row[8].split('/')
miladi_date = convert_to_miladi(
year=int(date[0]),
month=int(date[1]),
day=int(date[2])
)
poultrys = Poultry.objects.filter(trash=False, breeding_unique_id=row[3])
# return HttpResponse(poultrys.count())
if poultrys:
for poultry in poultrys:
poultry_hatchings = PoultryHatching.objects.filter(poultry=poultry, date__year=miladi_date.year,
date__month=miladi_date.month,
date__day=miladi_date.day,
archive=False, trash=False, state='pending',
allow_hatching='pending')
if poultry_hatchings:
for poultry_hatching in poultry_hatchings:
l += 1
if poultry_hatching.quantity - poultry_hatching.left_over == 0:
poultry_hatching.quantity = row[9]
poultry_hatching.left_over = row[9]
poultry_hatching.save()
else:
continue
else:
continue
return Response(l)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def enter_driver_hamedan(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
group = Group.objects.get(name__exact="Driver")
l = 0
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i <= 2:
continue
mobile = str(row[2])
if len(mobile) == 10:
mobile = '0' + str.zfill(mobile, 10)
health_code = 0
if row[8] is not None:
health_code = row[8]
first_name = row[0]
last_name = [1]
password = '00100'
hashed_password = hashlib.sha256(str(password).encode()).hexdigest()
province = Province.objects.filter(name='همدان')
province = province.last()
city = City.objects.filter(name='همدان')
city = city.last()
system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).last()
if not system_profile:
data = {
"username": mobile,
"first_name": first_name,
"last_name": last_name,
"password": hashed_password,
"national_code": '0',
"role": "Driver",
"api_key": PROJECT_API_KEY
}
req = requests.post(
url=ARTA_REGISTER,
data=data,
verify=False
)
if req.status_code == 200:
user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password)
user.save()
base_id = SystemUserProfile.objects.all()
if base_id.count() > 0:
base_id = int(base_id.last().base_order) + 1
else:
base_id = 1000
system_profile = SystemUserProfile(
mobile=mobile,
first_name=first_name,
last_name=last_name,
fullname=first_name + '' + last_name,
user=user,
base_order=base_id,
password=password,
birthday=str(datetime.now().date()),
city=city,
province=province
)
system_profile.save()
system_profile.role.add(group)
l += 1
kill_drivers = KillHouseDriver.objects.filter(trash=False, health_code=health_code, user__mobile=mobile,
driver_mobile=mobile)
if not kill_drivers:
wallet = Wallet()
wallet.save()
KillHouseDriver(
user=system_profile,
driver_name=first_name + ' ' + last_name,
driver_mobile=mobile,
type_car='کامیون',
type='exclusive',
pelak=row[9],
capocity=row[7],
health_code=health_code,
wallet=wallet,
)
l += 1
return Response(l)
def add_zero_for_user_mobile(request):
users = SystemUserProfile.objects.all()
l = 0
for user in users:
if len(user.mobile) == 10:
user.mobile = '0' + user.mobile
user.save()
l += 1
return HttpResponse(l, status=status.HTTP_200_OK)
def integration_of_hatching(request):
poultry = Poultry.objects.filter(trash=False)
for user in poultry:
poultry_hatching = PoultryHatching.objects.filter(trash=False, poultry=user, archive=False,
allow_hatching='pending').order_by('id')
if poultry_hatching:
first_hatching = poultry_hatching.first()
for hatching in poultry_hatching:
if first_hatching != hatching:
first_hatching.quantity += hatching.quantity
first_hatching.left_over += hatching.left_over
first_hatching.killed_quantity += hatching.killed_quantity
p_requests = PoultryRequest.objects.filter(trash=False, hatching=hatching)
if p_requests:
for p_request in p_requests:
p_request.hatching = first_hatching
p_request.save()
hatching.trash = True
hatching.save()
first_hatching.save()
else:
pass
return HttpResponse('ok')
def period_to_fix(request):
poultries = Poultry.objects.filter(trash=False).order_by('id')
for poultry in poultries:
hatch = PoultryHatching.objects.filter(trash=False, poultry=poultry).order_by('id')
# if len(hatch) > 1:
# period = len(hatch) + 1
# else:
period = 1
for hatching in hatch:
hatching.period = period
hatching.save()
period += 1
return HttpResponse('ok')
# from panel.models import KillHouseAssignmentInformation, KillHouseRequest
#
#
# def assignment_information_fix_bar_info(request):
# kill_request=KillHouseRequest.objects.filter(trash=False,accepted_real_quantity=0,accepted_real_weight=0).select_related('province_request__poultry_request').only('accepted_real_weight','accepted_real_quantity','province_request__poultry_request')
# for kill in kill_request:
# kill.accepted_real_quantity=kill.quantity
# kill.accepted_real_weight=int(kill.quantity * kill.province_request.poultry_request.Index_weight)
# kill.save()
#
# return HttpResponse('ok')
# from panel.models import ProvinceKillRequest, KillHouseRequest
# from django.db.models import Sum
# def assignment_information_fix_bar_info(request):
# province = ProvinceKillRequest.objects.filter(total_killed_quantity=0,trash=False,state__in=('pending','accepted'))
#
# for p in province:
# p.total_killed_quantity=p.main_quantity
# p.total_killed_weight=int(p.main_quantity * p.province_request.poultry_request.Index_weight)
# p.save()
# return HttpResponse('ok')
# from panel.models import KillHouseAssignmentInformation, KillHouseRequest
#
#
# def assignment_information_fix_bar_info(request):
# kill_request=KillHouseRequest.objects.filter(trash=False,accepted_real_quantity=0,accepted_real_weight=0).select_related('province_request__poultry_request')
# for kill in kill_request:
# kill.accepted_real_quantity=kill.quantity
# kill.accepted_real_weight=int(kill.quantity * kill.province_request.poultry_request.Index_weight)
# kill.save()
#
# return HttpResponse('ok')
#
#
# def assignment_information_fix_bar_info(request):
# bar_information = KillHouseAssignmentInformation.objects.filter(trash=False).only(
# 'net_weight', 'real_quantity', 'kill_house_request__key').values('net_weight', 'real_quantity',
# 'kill_house_request__key')
#
# for bar in bar_information:
# try:
# kill_request = KillHouseRequest.objects.get(trash=False, key=bar['kill_house_request__key'])
#
# kill_request.accepted_real_quantity = bar['real_quantity']
# kill_request.accepted_real_weight = bar['net_weight']
# kill_request.save()
# except:
# pass
#
#
# return HttpResponse('ok')
#
# from panel.models import KillHouseAssignmentInformation, KillHouseRequest
# #
# #
# def assignment_information_fix_bar_info(request):
# bar_information = KillHouseAssignmentInformation.objects.filter(pk__in=pk_assigment,trash=False).select_related('kill_house_request')
# for bar in bar_information:
# try:
# kill_request = KillHouseRequest.objects.get(trash=False, key=bar.kill_house_request.key)
#
# kill_request.accepted_real_quantity = bar.real_quantity
# kill_request.accepted_real_weight = bar.net_weight
# kill_request.save()
# except:
# pass
#
# return HttpResponse(len(bar_information))
#
# from panel.models import ProvinceKillRequest, KillHouseRequest
# from django.db.models import Sum
#
#
# def assignment_information_fix_bar_info(request):
# province = ProvinceKillRequest.objects.filter(trash=False,state__in=('pending','accepted'))
#
# for p in province:
# kill_request = KillHouseRequest.objects.filter(trash=False, province_kill_request=p).only(
# 'accepted_real_quantity', 'accepted_real_weight')
# total_killed_quantity = kill_request.aggregate(total=Sum('accepted_real_quantity'))[
# 'total']
# total_killed_weight = kill_request.aggregate(total=Sum('accepted_real_weight'))[
# 'total']
#
# total_first_car = kill_request.aggregate(total=Sum('quantity'))[
# 'total']
#
# p.total_killed_quantity = total_killed_quantity if total_killed_quantity != None else 0
# p.total_killed_weight = total_killed_weight if total_killed_weight != None else 0
# p.first_car_allocated_quantity= total_first_car if total_first_car != None else 0
#
# if p.main_quantity < p.total_killed_quantity:
# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity
#
# p.save()
#
# p.quantity=p.main_quantity - p.first_car_allocated_quantity if(p.main_quantity - p.first_car_allocated_quantity) > 0 else 0
# p.save()
# return HttpResponse('ok')
# from panel.models import ProvinceKillRequest, PoultryHatching
# from django.db.models import Sum
#
#
# def assignment_information_fix_bar_info(request):
# hatchings = PoultryHatching.objects.filter(trash=False).order_by('id')
#
# for hatching in hatchings:
# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'),
# province_request__poultry_request__hatching=hatching).order_by(
# 'id')
#
# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[
# 'total']
#
# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[
# 'total']
#
# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0
# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0
#
# province_kill_free = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=True)
# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0
# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0
#
# province_kill_goverment = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=False)
#
# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0
# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0
#
# hatching.extra_killed_quantity = total_extra if total_extra != None else 0
#
# hatching.save()
# return HttpResponse('ok')
# from panel.models import ProvinceKillRequest, PoultryHatching
# from django.db.models import Sum
# from panel.models import ProvinceKillRequest, KillHouseRequest
#
#
# def assignment_information_fix_bar_info(request):
# list1 = [1336,1146,1120,1253,1141,1098,1112,1145,1163,1155,1134,1087,1172,1072,1113,1089,1115,1072,1123,1085,1109]
#
# hatchings = PoultryHatching.objects.filter(trash=False, id__in=list1)
#
# province = ProvinceKillRequest.objects.filter(trash=False,state__in=('accepted','pending') ,province_request__poultry_request__hatching__in=hatchings)
# for p in province:
# kill_requests=KillHouseRequest.objects.filter(trash=False,province_kill_request=p)
# total_killed_quantity = kill_requests.aggregate(total=Sum('accepted_real_quantity'))[
# 'total']
# total_killed_weight = kill_requests.aggregate(total=Sum('accepted_real_weight'))[
# 'total']
# total_car = kill_requests.aggregate(total=Sum('quantity'))[
# 'total']
# p.total_killed_quantity=total_killed_quantity if total_killed_quantity !=None else 0
# p.total_killed_weight=total_killed_weight if total_killed_weight !=None else 0
# p.first_car_allocated_quantity=total_car if total_car != None else 0
#
# if p.main_quantity < p.total_killed_quantity:
# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity
#
# p.save()
# for hatching in hatchings:
# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'),
# province_request__poultry_request__hatching=hatching).order_by(
# 'id')
#
# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[
# 'total']
#
# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[
# 'total']
#
# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0
# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0
#
# province_kill_free = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=True)
# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0
# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0
#
# province_kill_goverment = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=False)
#
# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0
# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0
#
# hatching.extra_killed_quantity = total_extra if total_extra != None else 0
#
# hatching.save()
#
#
# return HttpResponse('ok')
#
# from panel.models import ProvinceKillRequest, PoultryHatching
# from django.db.models import Sum
# from panel.models import ProvinceKillRequest, KillHouseRequest
# def assignment_information_fix_bar_info_3_day_ago(request):
# date=datetime.now().date() - timedelta(days=3)
# kill_house_reqs = KillHouseRequest.objects.filter(Q(vet_state= 'pending')|Q(assignment_state_archive='pending')
# ,clearance_code__isnull=True,kill_request__recive_date__date__lte=date, trash=False)
#
# list1=[]
# for kill_house_req in kill_house_reqs:
# kill_house_req.trash = True
# kill_house_req.save()
# hatching = PoultryHatching.objects.get(key=kill_house_req.province_request.poultry_request.hatching.key, trash=False)
# if hatching.id not in list1:
# list1.append(hatching.id)
#
# hatchings = PoultryHatching.objects.filter(trash=False, id__in=list1)
#
# province = ProvinceKillRequest.objects.filter(trash=False,state__in=('accepted','pending') ,province_request__poultry_request__hatching__in=hatchings)
# for p in province:
# kill_requests=KillHouseRequest.objects.filter(trash=False,province_kill_request=p)
# total_killed_quantity = kill_requests.aggregate(total=Sum('accepted_real_quantity'))[
# 'total']
# total_killed_weight = kill_requests.aggregate(total=Sum('accepted_real_weight'))[
# 'total']
# total_car = kill_requests.aggregate(total=Sum('quantity'))[
# 'total']
# p.total_killed_quantity=total_killed_quantity if total_killed_quantity !=None else 0
# p.total_killed_weight=total_killed_weight if total_killed_weight !=None else 0
# p.first_car_allocated_quantity=total_car if total_car != None else 0
#
# if p.main_quantity < p.total_killed_quantity:
# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity
#
# p.save()
# for hatching in hatchings:
# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'),
# province_request__poultry_request__hatching=hatching).order_by(
# 'id')
#
# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[
# 'total']
#
# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[
# 'total']
#
# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0
# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0
#
# province_kill_free = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=True)
# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0
# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0
#
# province_kill_goverment = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=False)
#
# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0
# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0
#
# hatching.extra_killed_quantity = total_extra if total_extra != None else 0
#
# hatching.save()
#
#
# return HttpResponse('ok')
# def assignment_information_fix_bar_info(request):
# kill_house_requests=(KillHouseRequest.objects.filter(trash=True,clearance_code__isnull=True,message__isnull=False,
# bar_remover__isnull=False)).only('message')
# for kill_house_request in kill_house_requests:
# kill_house_request.message='عدم دریافت کد قرنطینه'
# # kill_house_request.bar_remover={
# # "date": str(kill_house_request.create_date.date()),
# # "role":"KillHouse",
# # "mobile": kill_house_request.killhouse_user.kill_house_operator.user.mobile,
# # "full_name": kill_house_request.killhouse_user.kill_house_operator.user.fullname,
# # }
# kill_house_request.save()
# return HttpResponse('ok')
#
from panel.models import ProvinceKillRequest, PoultryHatching
# def assignment_information_fix_bar_info(request):
# today = datetime.now().date() - timedelta(days=2)
# province_kill_requests = (ProvinceKillRequest.objects.filter(kill_request__recive_date__date__lte=today,
# first_car_allocated_quantity=0, trash=False)
# .select_related('province_request__poultry_request'))
# if province_kill_requests:
# for province_kill_request in province_kill_requests:
# poultry_request = PoultryRequest.objects.get(key=province_kill_request.province_request.poultry_request.key,
# trash=False)
# hatching = PoultryHatching.objects.get(key=poultry_request.hatching.key, trash=False)
#
# if province_kill_request.main_quantity - province_kill_request.quantity == 0:
# province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
# province_check.quantity += province_kill_request.main_quantity
# province_check.save()
# poultry_request.remain_quantity += province_kill_request.main_quantity
# poultry_request.save()
#
# if poultry_request.free_sale_in_province == True:
# hatching.free_killed_quantity -= province_kill_request.total_killed_weight
# hatching.free_quantity -= province_kill_request.total_killed_quantity
# else:
# hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight
# hatching.governmental_quantity -= province_kill_request.total_killed_quantity
#
# hatching.save()
# province_kill_request.quantity = 0
# province_kill_request.total_killed_quantity = 0
# province_kill_request.total_killed_weight = 0
# province_kill_request.return_to_province = True
# province_kill_request.save()
# return HttpResponse({'msg': 'all done'})
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def register_guilds(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
group = Group.objects.get(name__exact="Guilds")
l = 0
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i <= 1:
continue
mobile = str(row[2])
if len(mobile) == 10:
mobile = '0' + str.zfill(mobile, 10)
# postal_code = row[4]
national_code = row[5]
first_name = row[0]
last_name = row[1]
guild_id = row[4]
license_num = 0
password = '00100'
hashed_password = hashlib.sha256(str(password).encode()).hexdigest()
province = Province.objects.get(id=2)
city = City.objects.get(id=8)
area = 'گوشت و مرغ'
type_act = 'خرده فروش'
system_profile = SystemUserProfile.objects.filter(mobile=mobile, trash=False).first()
if system_profile:
pass
# data = {
# "username": mobile,
# "first_name": first_name,
# "last_name": last_name,
# "password": hashed_password,
# "national_id": national_code,
# "role": "Guilds",
# "api_key": PROJECT_API_KEY
# }
# req = requests.post(
# url=ARTA_REGISTER,
# data=data,
# verify=False
# )
#
# if req.status_code == 200:
# user = User(username=mobile, first_name=first_name, last_name=last_name, password=hashed_password)
# user.save()
# base_id = SystemUserProfile.objects.all()
# if base_id.count() > 0:
# base_id = int(base_id.last().base_order) + 1
# else:
# base_id = 1000
# system_profile = SystemUserProfile(
# mobile=mobile,
# first_name=first_name,
# last_name=last_name,
# fullname=first_name + '' + last_name,
# user=user,
# base_order=base_id,
# password=password,
# birthday=str(datetime.now().date()),
# city=city,
# province=province
# )
# system_profile.save()
# system_profile.role.add(group)
# l += 1
# address = SystemAddress(city=city, province=province, address=row[3])
# address.save()
# wallet = Wallet()
# wallet.save()
# guildss=Guilds(
# user=system_profile,
# license_number=license_num,
# guilds_name=first_name + '' + last_name,
# guilds_id=guild_id,
# area_activity=area,
# type_activity=type_act,
# address=address,
# wallet=wallet,
# )
# guildss.save()
# l+=1
# guild = Guilds.objects.filter(trash=False, user=system_profile).first()
# if guild:
# if not Product.objects.filter(guild__exact=guild):
# l+=1
#
# additional_products = AdditionalProducts.objects.filter(trash=False).exclude(
# name='سایر محصولات').order_by('id')
# if additional_products:
# for additional_product in additional_products:
# show = True if additional_product.name == 'مرغ گرم' else False
# product = Product(
# name=additional_product.name,
# image=additional_product.image,
# unit_of_measurement=additional_product.unit_of_measurement,
# priority=additional_product.priority,
# guild=guild,
# selling_free_price=additional_product.selling_free_price,
# selling_approved_price=additional_product.selling_approved_price,
# selling_more_than_inventory=additional_product.selling_more_than_inventory,
# selling_other_products=additional_product.selling_other_products,
# price=additional_product.price,
# show=show,
# )
# product.save()
# company = PosCompany.objects.get(id=1)
# pos_machine=POSMachine.objects.filter(guild__exact=guild).first()
# if not pos_machine:
# while (True):
# res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10))
# res = base_pos_id + res
# if not POSMachine.objects.filter(pos_id=res).exists():
# break
# pos_machine=POSMachine(
# pos_id=res,
# user=guild.user,
# guild=guild,
# pos_company=company
# )
# pos_machine.save()
# guild.has_pos = True
# guild.save()
# l+=1
# return Response(l)
# from panel.models import ProvinceKillRequest, PoultryHatching
# from django.db.models import Sum
# from panel.models import ProvinceKillRequest, KillHouseRequest
# def assignment_information_fix_bar_info(request):
# hatchings = PoultryHatching.objects.filter(trash=False, pk__in=pk_hatching)
#
# province = ProvinceKillRequest.objects.filter(trash=False ,pk__in=pk_province_kill_request )
# for p in province:
# kill_requests=KillHouseRequest.objects.filter(trash=False,province_kill_request=p)
# total_killed_quantity = kill_requests.aggregate(total=Sum('accepted_real_quantity'))[
# 'total']
# total_killed_weight = kill_requests.aggregate(total=Sum('accepted_real_weight'))[
# 'total']
# total_car = kill_requests.aggregate(total=Sum('quantity'))[
# 'total']
# p.total_killed_quantity=total_killed_quantity if total_killed_quantity !=None else 0
# p.total_killed_weight=total_killed_weight if total_killed_weight !=None else 0
# p.first_car_allocated_quantity=total_car if total_car != None else 0
#
# if p.main_quantity < p.total_killed_quantity:
# p.extra_killed_quantity = p.total_killed_quantity - p.main_quantity
#
# p.save()
# for hatching in hatchings:
# province_kills = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'),
# province_request__poultry_request__hatching=hatching).order_by(
# 'id')
#
# total_extra = province_kills.aggregate(total=Sum('extra_killed_quantity'))[
# 'total']
#
# total_killed_quantity = province_kills.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_weight = province_kills.aggregate(total=Sum('total_killed_weight'))[
# 'total']
#
# hatching.killed_quantity = total_killed_quantity if total_killed_quantity != None else 0
# hatching.total_killed_weight = total_killed_weight if total_killed_weight != None else 0
#
# province_kill_free = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=True)
# total_killed_free_quantity = province_kill_free.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_free_weight = province_kill_free.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.free_quantity = total_killed_free_quantity if total_killed_free_quantity != None else 0
# hatching.free_killed_quantity = total_killed_free_weight if total_killed_free_weight != None else 0
#
# province_kill_goverment = province_kills.filter(
# province_request__poultry_request__free_sale_in_province=False)
#
# total_killed_goverment_quantity = province_kill_goverment.aggregate(total=Sum('total_killed_quantity'))[
# 'total']
# total_killed_goverment_weight = province_kill_goverment.aggregate(total=Sum('total_killed_weight'))[
# 'total']
# hatching.governmental_quantity = total_killed_goverment_quantity if total_killed_goverment_quantity != None else 0
# hatching.governmental_killed_quantity = total_killed_goverment_weight if total_killed_goverment_weight != None else 0
#
# hatching.extra_killed_quantity = total_extra if total_extra != None else 0
#
# hatching.save()
#
#
# return HttpResponse('ok')
def update_chicken_age_from_login():
poultry_hatching = PoultryHatching.objects.filter(trash=False).only('date', 'chicken_age', 'last_change').order_by(
'-id')
now = datetime.now().date()
for hatching in poultry_hatching:
now_age = (now - hatching.date.date()).days + 1
if hatching.archive == False and hatching.allow_hatching == 'pending':
hatching.chicken_age = now_age
hatching.save()
elif hatching.archive == True and hatching.allow_hatching == 'True':
if hatching.last_change:
date = datetime.strptime((hatching.last_change['date'].split(' ')[0]), '%Y-%m-%d').date()
age = (date - hatching.date.date()).days + 1
if age < 80:
hatching.chicken_age = (date - hatching.date.date()).days + 1
hatching.save()
else:
continue
if now_age <= 120:
hatching.now_age = now_age
hatching.save()
def violation_archive_true(request):
poultry_haching = PoultryHatching.objects.filter(allow_hatching='True', archive=True,
trash=False, left_over__gt=F('quantity') * percent_of_losses,
violation=False).only('quantity', 'left_over', 'violation')
l = 0
for hatching in poultry_haching:
hatching.violation = True
hatching.save()
l += 1
return HttpResponse(l)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def update_chicken_breed_from_excel(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file), data_only=True)
sheet = wb_obj.active
sheet.delete_rows(sheet.max_row)
done = 0
not_done = 0
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i <= 7:
continue
breeding_uniq_id = row[3]
breed = row[10]
licence_number = row[5]
try:
poultry_hatching = PoultryHatching.objects.filter(violation=False, trash=False, allow_hatching='pending',
state='pending',
poultry__breeding_unique_id=breeding_uniq_id,
licence_number=licence_number).order_by(
'id').last()
if poultry_hatching:
if poultry_hatching.chicken_breed == '*ترکیبی':
poultry_hatching.chicken_breed = breed
elif poultry_hatching.chicken_breed != breed and poultry_hatching.chicken_breed != '*ترکیبی':
poultry_hatching.chicken_breed = 'ترکیبی'
else:
continue
poultry_hatching.save()
done += 1
except:
not_done += 1
continue
# hatching.save()
return Response(f'موفق:{done}\n ناموفق ها:{not_done}', status=status.HTTP_201_CREATED)
def ye_chee_bani(request):
kill_assigment = KillHouseAssignmentInformation.objects.filter(
~Q(real_quantity=F('kill_house_request__accepted_real_quantity'))).select_related('kill_house_request')
list1 = kill_assigment.values_list('kill_house_request__province_request__poultry_request__hatching__pk', flat=True)
# print(list(list1))
return HttpResponse(list(list1))
def dedicated_killer(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
l = 0
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i <= 1:
continue
bar_code = row[1]
mobile = str(row[12])
if len(mobile) == 10:
mobile = '0' + str.zfill(mobile, 10)
try:
kill_req = KillHouseRequest.objects.get(bar_code=bar_code)
killer = KillHouse.objects.get(kill_house_operator__user__mobile=mobile)
kill_req.killer = killer
kill_req.save()
except:
l += 1
continue
return HttpResponse(l)
def valem_kin2(request):
kill_req = KillHouseRequest.objects.filter(archive_wage=True, create_date__date__gte='2024-03-20').only(
'archive_wage').order_by('id')
m = kill_req.values_list('pk', flat=True)
print(len(m))
for i in kill_req:
i.archive_wage = False
i.save()
# kill_req = ProvinceKillRequest.objects.filter(archive_wage=True, create_date__date__gte='2024-03-20').only(
# 'archive_wage').order_by('id')
# for i in kill_req:
# i.archive_wage = False
# i.save()
# kill_req = KillHouseFreeBarInformation.objects.filter(archive_wage=False, create_date__date__lte='2024-04-19').only(
# 'archive_wage').order_by('id')
# for i in kill_req:
# i.archive_wage = True
# i.save()
return HttpResponse('ok')
def transaction_company_for_freezing(request):
poultry_request = PoultryRequest.objects.filter(trash=False, freezing=True).order_by('id')
province_request = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
state__in=('pending', 'accepted')
, archive_wage=False,
province_request__poultry_request__in=poultry_request).only(
'total_killed_weight', 'total_wage_amount', 'company_share', 'wage', 'company_share_percent'
)
for p in province_request:
amount = int(p.total_killed_weight * 500)
p.total_wage_amount = amount
p.wage = 500
p.company_share = amount
p.guilds_share = 0
p.union_share = 0
p.company_share_percent = 100
p.union_share_percent = 0
p.guilds_share_percent = 0
p.save()
return HttpResponse('ok')
import string
import random
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def make_gate_way_id(request):
users = SystemUserProfile.objects.filter(user_gate_way_id__isnull=True).order_by('id')
for user in users:
while (True):
res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5))
res = base_user_gate_way_id + res
if not SystemUserProfile.objects.filter(user_gate_way_id=res).exists():
break
user.user_gate_way_id = res
user.save()
return HttpResponse('done!')
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def get_server_time(request):
date = datetime.now()
return Response(date)
def transaction_fix(request):
province_request = ProvinceKillRequest.objects.filter(trash=False, return_to_province=False,
state__in=('pending', 'accepted')
, archive_wage=False,
).only(
'total_killed_weight', 'total_wage_amount', 'company_share', 'wage', 'company_share_percent', 'other_share',
'other_share_percent'
).exclude(id=3868)
for p in province_request:
amount = p.total_wage_amount
p.guilds_share = amount - (p.company_share + p.union_share)
p.save()
return HttpResponse('ok')
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def internal_transaction_fix(request):
internals = InternalTransaction.objects.filter(trash=False, status='completed', date__date__gt='2024-06-01'
, transaction_type='wage-gateway-auto') \
.order_by('date')
for internal in internals:
if internal.amount != (
internal.company_share + internal.guilds_share + internal.union_share + internal.other_share):
internal.company_share = internal.company_share + ((internal.amount * 1) / 100)
internal.save()
return Response('ok')
def utm_to_loc(easting, northing):
zone_number = 39
zone_letter = 'N'
lat, lon = utm.to_latlon(easting, northing, zone_number, zone_letter)
zone_number = int((lon + 180) // 6) + 1
zone_letter = 'CDEFGHJKLMNPQRSTUVWXX'[(int(lat) + 80) // 8]
lat, lon = utm.to_latlon(easting, northing, zone_number, zone_letter)
return lat, lon
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def convert_utm_to_location(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
list1 = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i < 1:
continue
else:
utm = row[14]
breeding_uniq_id = row[5]
utm = utm.split('/')
easting = int(utm[0])
northing = int(utm[1])
lat, long = utm_to_loc(easting, northing)
poultry = Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).first()
if poultry:
poultry.lat = lat
poultry.long = long
poultry.save()
else:
list1.append(breeding_uniq_id)
return HttpResponse('ok')
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def fix_internal_transactions(request):
internal = InternalTransaction.objects.filter(trash=False, kill_house__isnull=False)
for i in internal:
i.payer_fullname = i.kill_house.kill_house_operator.user.fullname
i.payer_mobile = i.kill_house.kill_house_operator.user.mobile
i.save()
return Response('ok')
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_hatching(request):
poultryes = Poultry.objects.filter(trash=False)
list1 = []
for p in poultryes:
# پیدا کردن تاریخ‌هایی که دوبار یا بیشتر تکرار شده‌اند
repeated_dates = PoultryHatching.objects.values('date__year', 'date__month').annotate(
date_count=Count('id')
).filter(trash=False, poultry=p, date_count__gt=1)
# فیلتر کردن رکوردهایی که سال و ماه آنها در لیست تکراری‌ها قرار دارند
query = Q()
for date in repeated_dates:
query |= Q(date__year=date['date__year'], date__month=date['date__month'])
poultry_hatchings = PoultryHatching.objects.filter(query, trash=False, poultry=p, killed_quantity=0)
# for p in poultry_hatchings:
# p.trash=True
# p.save()
return Response(list1)
def change_last_digit_to_six(request):
user_profile = SystemUserProfile.objects.filter(trash=False, mobile='09216919296').order_by('id')
for u in user_profile:
first_mobile_number = u.mobile
second_mobile_number = '09011110911'
data = {
"first_mobile_number": str(first_mobile_number),
"second_mobile_number": '09011110911',
}
req = requests.post(
url=ARTA_URL_CHANGE_MOBILE_NUMBER,
data=data,
verify=False
)
# return Response(req.status_code)
if req.status_code == 200:
print('ok')
second_mobile_number = second_mobile_number
user = User.objects.filter(id=u.user.id).first()
user.username = second_mobile_number
user.save()
u.mobile = second_mobile_number
u.save()
return HttpResponse('ok')
def canceled_out_province_request():
province_requests = PoultryRequest.objects.filter(state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending'), trash=False,
archive=False,
out_province_request_cancel=False, out=True, wage_pay=False,
has_wage=True)
data = {"date": str(datetime.now()), "role": "SuperAdmin", "mobile": "-",
"fullname": "کنسل شده توسط سیستم به دلیل عدم پرداخت"}
for province_request in province_requests:
if province_request.state_process == 'accepted' and province_request.province_state == 'accepted':
hatching = PoultryHatching.objects.get(key=province_request.hatching.key, trash=False)
hatching.out_province_killed_weight -= int(province_request.quantity * province_request.Index_weight)
hatching.out_province_killed_quantity -= province_request.quantity
hatching.save()
province_request.out_province_request_cancel = True
province_request.out_province_request_canceller = data
province_request.archive = True
province_request.state_process = 'rejected'
province_request.province_state = 'rejected'
province_request.save()
message = f'بار خارج از استان به شماره {province_request.order_code} به علت عدم پرداخت کنسل شد.' \
f'\n' \
f'(سامانه رصدیار)'
req = send_sms_request(
f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={UNION_NUMBER}&message={message}")
def fix_guild_kill_house(request):
guilds = Guilds.objects.filter(trash=False, kill_house_centers_allocation__isnull=False)
for guild in guilds:
list1 = []
for i in guild.kill_house_centers_allocation:
list1.append(i['value'])
kill_house1 = KillHouse.objects.filter(key__in=list1)
guild.kill_house.set(kill_house1)
return HttpResponse('ok')
def fix_guild_steward_kill_house(request):
stewards = Steward.objects.filter(trash=False, centers_allocation__isnull=False)
for steward in stewards:
guild = Guilds.objects.get(trash=False, id=steward.guilds.id)
list1 = []
for i in steward.centers_allocation:
list1.append(i['value'])
kill_house1 = KillHouse.objects.filter(key__in=list1)
guild.steward_kill_house.set(kill_house1)
return HttpResponse('ok')
def fix_guild_steward(request):
guild = Guilds.objects.get(id=26, trash=False)
stewards = guild.stewards.all()
list1 = [i['value'] for i in guild.centers_allocation]
# واکشی مباشرین مرتبط
stewardss = Guilds.objects.filter(
pk__in=Steward.objects.filter(key__in=list1).values_list('guilds', flat=True),
trash=False
)
# حذف رابطه‌های قبلی در مدل میانی
GuildSteward.objects.filter(guild=guild).delete()
# اضافه کردن روابط جدید در مدل میانی
guild_stewards = [GuildSteward(guild=guild, steward=steward) for steward in stewardss]
GuildSteward.objects.bulk_create(guild_stewards)
return HttpResponse('done!')
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def check_product(request):
product = RolesProducts.objects.get(id=1)
return Response(kill_house_free_sale_product_warehousing(product))
def add_to_steward_temp_key(request):
stewards_allocations = StewardAllocation.objects.filter(steward__isnull=False).order_by('id')
for stewards_allocation in stewards_allocations:
stewards_allocation.steward_temp_key = stewards_allocation.steward.guilds.id
stewards_allocation.save()
return HttpResponse('ok')
def add_to_steward(request):
stewards_allocations = StewardAllocation.objects.filter(steward_temp_key__isnull=False).order_by('id')
for stewards_allocation in stewards_allocations:
guild = Guilds.objects.get(id=stewards_allocation.steward_temp_key)
stewards_allocation.steward = guild
stewards_allocation.save()
return HttpResponse('ok')
def make_role_prodoct(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False).order_by('id')
guilds = Guilds.objects.filter(trash=False)
product = NewProduct.objects.all().first()
for kill_house in kill_houses:
role_product = RolesProducts(
kill_house=kill_house,
parent_product=product,
name='مرغ گرم',
)
role_product.save()
for guild in guilds:
role_product = RolesProducts(
guild=guild,
parent_product=product,
name='مرغ گرم',
)
role_product.save()
return HttpResponse('ok')
def fix_steward_allocation(request):
steward_allocations = StewardAllocation.objects.filter(kill_house__isnull=False).order_by('id')
for steward_allocation in steward_allocations:
product = RolesProducts.objects.filter(kill_house=steward_allocation.kill_house).first()
if steward_allocation.guilds is not None:
steward_allocation.to_guilds = steward_allocation.guilds
steward_allocation.allocation_type = 'killhouse_guild'
steward_allocation.guilds = None
elif steward_allocation.steward is not None:
steward_allocation.to_steward = steward_allocation.steward
steward_allocation.allocation_type = 'killhouse_steward'
steward_allocation.steward = None
else:
continue
steward_allocation.product = product
steward_allocation.save()
return HttpResponse('ok')
def fix_KillHouseFreeSaleBarInformation(request):
free_kills = KillHouseFreeSaleBarInformation.objects.filter(trash=False, kill_house__isnull=False).order_by('id')
for free_kill in free_kills:
product = RolesProducts.objects.filter(kill_house=free_kill.kill_house).first()
free_kill.product = product
free_kill.save()
return HttpResponse('ok')
def fix_KillHouseFreeBarInformation(request):
free_kills = KillHouseFreeBarInformation.objects.filter(trash=False, kill_house__isnull=False).order_by('id')
for free_kill in free_kills:
product = RolesProducts.objects.filter(kill_house=free_kill.kill_house).first()
free_kill.product = product
free_kill.save()
return HttpResponse('ok')
# @api_view(["GET"])
# @permission_classes([AllowAny])
# @csrf_exempt
# def kill_house_requests_product_warehousing(request):
# kill_house=KillHouse.objects.get(id=int(request.GET['id']))
# product=RolesProducts.objects.get(kill_house=kill_house)
# kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=product.kill_house,
# ware_house_confirmation=True, trash=False,calculate_status=True)
#
# governmental_kill_house_requests = kill_house_requests.filter(province_request__poultry_request__free_sale_in_province=False)
# free_kill_house_requests = kill_house_requests.filter(province_request__poultry_request__free_sale_in_province=True)
# # governmental_kill_house_requests = kill_house_requests.filter(
# # province_request__poultry_request__free_sale_in_province=False,
# # province_request__poultry_request__direct_buying=False)
# # free_kill_house_requests = kill_house_requests.filter(
# # Q(province_request__poultry_request__free_sale_in_province=True) | Q(
# # province_request__poultry_request__direct_buying=True))
# product.province_governmental_carcasses_quantity = \
# governmental_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_quantity'))['total'] or 0
# product.province_governmental_carcasses_weight = \
# governmental_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))[
# 'total'] or 0
# product.province_free_carcasses_quantity = \
# free_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_quantity'))['total'] or 0
# product.province_free_carcasses_weight = \
# free_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))[
# 'total'] or 0
#
# product.save()
# return Response("done!")
# @api_view(["GET"])
# @permission_classes([AllowAny])
# @csrf_exempt
# def kill_house_free_buying_product_warehousing(request):
# kill_house=KillHouse.objects.get(id=int(request.GET['id']))
# product=RolesProducts.objects.get(kill_house=kill_house)
# kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(kill_house=product.kill_house, trash=False,calculate_status=True)
# product.free_buying_carcasses_quantity = \
# kill_house_free_buying_bars.aggregate(total=Sum('number_of_carcasses'))['total'] or 0
# product.free_buying_carcasses_weight = \
# kill_house_free_buying_bars.aggregate(total=Sum('weight_of_carcasses'))[
# 'total'] or 0
# product.save()
# return Response("done!")
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def kill_house_cold_house_allocations_product_warehousing(request):
kill_house = KillHouse.objects.get(id=int(request.GET['id']))
product = RolesProducts.objects.get(kill_house=kill_house)
cold_house_allocations = ColdHouseAllocations.objects.filter(kill_house=product.kill_house,
state__in=('pending', 'accepted'),
trash=False)
product.freezing_quantity = cold_house_allocations.aggregate(total=Sum('real_quantity'))[
'total'] or 0
product.freezing_weight = cold_house_allocations.aggregate(total=Sum('real_weight'))[
'total'] or 0
product.save()
return Response("done!")
# @api_view(["GET"])
# @permission_classes([AllowAny])
# @csrf_exempt
# def kill_house_allocations_product_warehousing(request):
# kill_house=KillHouse.objects.get(id=int(request.GET['id']))
# product=RolesProducts.objects.get(kill_house=kill_house)
# kill_house_allocations = StewardAllocation.objects.filter(
# Q(kill_house=product.kill_house) | Q(to_kill_house=product.kill_house), trash=False,calculate_status=True)
# kill_house_allocated = kill_house_allocations.filter(kill_house__isnull=False)
# kill_house_allocated_from = kill_house_allocations.filter(kill_house__isnull=True)
# governmental_kill_house_allocated_from = kill_house_allocated_from.filter(approved_price_status=True)
# free_kill_house_allocated_from = kill_house_allocated_from.filter(approved_price_status=False)
#
#
# product.province_allocated_quantity = kill_house_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
# total=Sum('real_number_of_carcasses'))[
# 'total'] or 0
# product.province_allocated_weight = kill_house_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
# total=Sum('real_weight_of_carcasses'))[
# 'total'] or 0
#
# product.receive_governmental_carcasses_quantity = \
# governmental_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
# total=Sum('receiver_real_number_of_carcasses'))[
# 'total'] or 0
# product.receive_governmental_carcasses_weight = \
# governmental_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
# total=Sum('receiver_real_weight_of_carcasses'))[
# 'total'] or 0
#
#
# product.receive_free_carcasses_quantity = \
# free_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
# total=Sum('receiver_real_number_of_carcasses'))[
# 'total'] or 0
# product.receive_free_carcasses_weight = \
# free_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
# total=Sum('receiver_real_weight_of_carcasses'))[
# 'total'] or 0
#
# product.save()
# return Response("done!")
#
# @api_view(["GET"])
# @permission_classes([AllowAny])
# @csrf_exempt
# def kill_house_free_sale_product_warehousing(request):
# kill_house=KillHouse.objects.get(id=int(request.GET['id']))
# product=RolesProducts.objects.get(kill_house=kill_house)
# kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=product.kill_house,
#
# trash=False,calculate_status=True)
#
# product.out_province_allocated_quantity = kill_house_free_sale_bars.aggregate(total=Sum('real_number_of_carcasses'))[
# 'total'] or 0
# product.out_province_allocated_weight = kill_house_free_sale_bars.aggregate(total=Sum('real_weight_of_carcasses'))[
# 'total'] or 0
# # return ({"len(1)":product.out_province_allocated_quantity,"2":product.out_province_allocated_weight})
# product.save()
# return Response("done!")
#
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def check_kill_house_request_calculate(request):
check_date = '2024-06-01'
check_date = datetime.strptime(check_date, '%Y-%m-%d').date()
kill_house_requests = KillHouseRequest.objects.filter(kill_request__recive_date__date__lt=check_date, trash=False)
for kill_house_request in kill_house_requests:
kill_house_request.calculate_status = False
kill_house_request.save()
return Response("done!")
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def check_kill_house_free_bar_information_calculate(request):
check_date = '2024-06-01'
check_date = datetime.strptime(check_date, '%Y-%m-%d').date()
kill_house_free_bars = KillHouseFreeBarInformation.objects.filter(date__date__lt=check_date, trash=False)
for kill_house_free_bar in kill_house_free_bars:
kill_house_free_bar.calculate_status = False
kill_house_free_bar.save()
return Response("done!")
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def check_kill_house_free_sale_bar_information_calculate(request):
check_date = '2024-06-01'
check_date = datetime.strptime(check_date, '%Y-%m-%d').date()
kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(date__date__lt=check_date, trash=False)
for kill_house_free_sale_bar in kill_house_free_sale_bars:
kill_house_free_sale_bar.calculate_status = False
kill_house_free_sale_bar.save()
return Response("done!")
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def check_steward_allocations_calculate(request):
check_date = '2024-06-01'
check_date = datetime.strptime(check_date, '%Y-%m-%d').date()
steward_allocations = StewardAllocation.objects.filter(date__date__lt=check_date, trash=False)
for steward_allocation in steward_allocations:
steward_allocation.calculate_status = False
steward_allocation.save()
return Response("done!")
def update_trash_status(model, filter_kwargs):
"""
بهروزرسانی فیلدهای `trash`, `temporary_trash` و `temporary_deleted` برای یک مدل مشخص.
"""
queryset = model.objects.filter(**filter_kwargs).only('temporary_deleted', 'trash', 'temporary_trash')
for item in queryset:
if item.trash == True:
item.temporary_deleted = True
item.trash = True
item.temporary_trash = True
item.save()
def temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(PoultryRequest, {"send_date__date__lt": check_date}),
(CityOperatorCheckRequest, {"poultry_request__send_date__date__lt": check_date}),
(KillRequest, {"recive_date__date__lt": check_date}),
(ProvinceKillRequest, {"kill_request__recive_date__date__lt": check_date}),
(KillHouseRequest, {"kill_request__recive_date__date__lt": check_date}),
(KillHouseAssignmentInformation, {"kill_house_request__kill_request__recive_date__date__lt": check_date}),
(KillHouseFreeBarInformation, {"date__date__lt": check_date}),
(KillHouseFreeSaleBarInformation, {"date__date__lt": check_date}),
(StewardAllocation, {"date__date__lt": check_date}),
(ColdHouseAllocations, {"date__date__lt": check_date}),
(StewardFreeBarInformation, {"date__date__lt": check_date}),
(StewardFreeSaleBarInformation, {"date__date__lt": check_date}),
(InternalTransaction, {"date__date__lt": check_date}),
(ExternalTransaction, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def PoultryRequest_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(PoultryRequest, {"send_date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def CityOperatorCheckRequest_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(CityOperatorCheckRequest, {"poultry_request__send_date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def KillRequest_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(KillRequest, {"recive_date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def ProvinceKillRequest_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(ProvinceKillRequest, {"kill_request__recive_date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def KillHouseRequest_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(KillHouseRequest, {"kill_request__recive_date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def KillHouseAssignmentInformation_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(KillHouseAssignmentInformation, {"kill_house_request__kill_request__recive_date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def KillHouseFreeBarInformation_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(KillHouseFreeBarInformation, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def StewardAllocation_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(StewardAllocation, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def ColdHouseAllocations_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(ColdHouseAllocations, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def StewardFreeBarInformation_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(StewardFreeBarInformation, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def StewardFreeSaleBarInformation_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(StewardFreeSaleBarInformation, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def InternalTransaction_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(InternalTransaction, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def ExternalTransaction_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(ExternalTransaction, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def ChainAllocation_temporary_trash_true(request):
check_date = datetime.strptime('2024-11-10', '%Y-%m-%d').date()
models_and_filters = [
(ChainAllocation, {"date__date__lt": check_date}),
]
for model, filter_kwargs in models_and_filters:
update_trash_status(model, filter_kwargs)
return HttpResponse('ok')
def archive_hatching_temporary_true(request):
filtered_poultry_hatch = PoultryHatching.objects.filter(
Q(allow_hatching='True', state='complete') | Q(archive=True))
for filtered_poultry in filtered_poultry_hatch:
if filtered_poultry.trash == True:
filtered_poultry.temporary_deleted = True
filtered_poultry.trash = True
filtered_poultry.temporary_trash = True
filtered_poultry.save()
return HttpResponse('ok')
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def duplicate_order_code(request):
from django.db.models import Count
duplicate_order_codes = PoultryRequest.objects.values('order_code').annotate(count=Count('id')).filter(count__gt=1,
trash=False).values_list(
'order_code', flat=True)
return Response(duplicate_order_codes)
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_duplicate_order_code(request):
duplicate_order_codes = (
PoultryRequest.objects
.values('order_code')
.annotate(count=Count('id'))
.filter(count__gt=1, trash=False)
.values_list('order_code', flat=True)
)
# استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری
poultry_ids = (
PoultryRequest.objects
.filter(order_code__in=duplicate_order_codes, trash=False)
.values_list('poultry__id', flat=True)
.distinct()
)
# مرتب‌سازی مرغ‌ها بر اساس شناسه
poultries = Poultry.objects.filter(trash=False, id__in=poultry_ids).order_by('id')
list1 = []
# بررسی درخواست‌های مرتبط با هر مرغ
for poultry in poultries:
requests = PoultryRequest.objects.filter(trash=False, poultry=poultry).order_by('order_code')
base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است
last_order = []
for req in requests:
if str(req.order_code)[:4] == base_order_code:
last_order.clear()
last_order.append(req.order_code)
# if str(req.order_code)[:4] != base_order_code:
# list1.append(req.id)
if last_order:
last_num = last_order[0] + 1
for req in requests:
if str(req.order_code)[:4] != base_order_code:
base_order_code = last_num
req.order_code = base_order_code
req.save()
last_num += 1
last_order.clear()
return Response(list1)
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_duplicate_order_code_new(request):
duplicate_order_codes = (
PoultryRequest.objects
.values('order_code')
.annotate(count=Count('id'))
.filter(count__gt=1, trash=False)
.values_list('order_code', flat=True)
)
# استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری
poultry_ids = (
PoultryRequest.objects
.filter(order_code__in=duplicate_order_codes, trash=False)
.values_list('poultry__user__id', flat=True)
.distinct()
)
# مرتب‌سازی مرغ‌ها بر اساس شناسه
poultries = SystemUserProfile.objects.filter(trash=False, id__in=poultry_ids).order_by('id')
list1 = []
for user in poultries:
print(user.id)
order_code = int(str(user.base_order) + '0001')
requests = PoultryRequest.objects.filter(trash=False, poultry__user=user).order_by('id')
for req in requests:
req.order_code = order_code
req.save()
order_code += 1
# # بررسی درخواست‌های مرتبط با هر مرغ
# for poultry in poultries:
# requests = PoultryRequest.objects.filter(trash=False,poultry=poultry).order_by('order_code')
# base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است
# last_order=[]
# for req in requests:
# if str(req.order_code)[:4] == base_order_code:
# last_order.clear()
# last_order.append(req.order_code)
# # if str(req.order_code)[:4] != base_order_code:
# # list1.append(req.id)
# if last_order:
# last_num=last_order[0] + 1
# for req in requests:
# if str(req.order_code)[:4] != base_order_code:
# base_order_code = last_num
# req.order_code=base_order_code
# req.save()
# last_num+=1
# last_order.clear()
return Response(list1)
def add_free_bar_to_warehouse():
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
date = datetime.now().date() - timedelta(days=3)
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(buy_type='live', trash=False, weight_of_carcasses=0,
create_date__date__lt=date, kill_house=kill_house,
ware_house=False)
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
for free_bar in free_bars:
product = free_bar.product
real_weight = round((free_bar.live_weight * 75) / 100)
free_bar.number_of_carcasses = int(real_weight / 1.5)
free_bar.weight_of_carcasses = real_weight
free_bar.weight_loss = 25
free_bar.ware_house = True
free_bar.date = str(datetime.now())
free_bar.entered_message = 'ورود به انبار توسط سیستم'
free_bar.total_wage_amount = free_bar.wage * int(
free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(
free_bar.weight_of_carcasses)
union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0
company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0
guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0
city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0
wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0
other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0
free_bar.union_share = int(union_percent * free_bar.total_wage_amount)
free_bar.company_share = int(company_percent * free_bar.total_wage_amount)
free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount)
free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount)
free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount)
free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount)
free_bar.save()
kill_house_free_buying_product_warehousing(product)
mobile = kill_house.kill_house_operator.user.mobile
if kill_house.killer == False:
killer = 'کشتارگاه'
else:
killer = 'کشتارکن'
message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \
f'\n' \
f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \
f'\n' \
f'(سامانه رصدیار)'
check_mobile = check_mobile_number(mobile)
if check_mobile:
req = send_sms_request(
f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}")
def change_password_poultry(request):
poultries = SystemUserProfile.objects.filter(role__name='Poultry')
for poultry in poultries:
password = random.randint(1000, 9999)
print(password)
data = {
'username': poultry.mobile,
'password': str(password)
}
req_change_pass = requests.post(
url=ARTA_URL_CHANGE_PASSWORD,
data=data,
verify=False
)
if req_change_pass.status_code == 200:
poultry.password = str(password)
poultry.save()
def add_vet_farm_to_poultry_request(request):
from django.db.models import F, ExpressionWrapper, DurationField
requests = PoultryRequest.objects.filter(trash=False, vet_farm__isnull=True).order_by('id')
for r in requests:
vet_farms = VetFarm.objects.filter(poultry=r.poultry).order_by('id')
if len(vet_farms) == 1:
r.vet_farm = vet_farms.first().vet
r.save()
elif len(vet_farms) > 1:
# محاسبه اختلاف زمان و مرتب‌سازی بر اساس آن
vet_farms_with_diff = vet_farms.annotate(
date_diff=ExpressionWrapper(
F('create_date') - r.send_date,
output_field=DurationField()
)
).order_by('-date_diff')
closest_vet_farm = vet_farms_with_diff.first()
if closest_vet_farm:
r.vet_farm = closest_vet_farm.vet
r.save()
return HttpResponse("ok")
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def fix_kill_req_njsndb(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i < 6 or row is None:
continue
poultry = row[3]
date = row[6]
quantity = row[13]
wieght = row[14]
accepterde = row[19]
date = date.split('-')
date = convert_to_miladi(
year=int(date[0]),
month=int(date[1]),
day=int(date[2])
)
kill_req = KillHouseFreeBarInformation.objects.get(trash=False, kill_house=5,
poultry_name=poultry, quantity=int(quantity),
live_weight=int(wieght), date__date=date,
acceptor_rejector=accepterde,
)
kill_house = KillHouse.objects.get(id=int(row[21]))
if kill_house:
print(kill_req.id)
kill_req.exclusive_killer = kill_house
kill_req.save()
# print(date.date())
# for kill in kill_req:
# if kill.poultry_name == poultry and kill.quantity== quantity and \
# kill.live_weight== wieght and kill.date.date() ==date and kill.acceptor_rejector == accepterde:
# print(kill.id)
return HttpResponse('ok')
def create_city_guild(request):
city_operator = CityOperator.objects.filter(trash=False, id=1)
prefix = "0918000" # قسمت ثابت شماره موبایل
random_part = random.randint(0, 9999) # تولید یک عدد تصادفی بین ۰ تا ۹۹۹۹
random_part_str = f"{random_part:04d}" # اطمینان از چهار رقمی بودن (مثلاً ۰۱۲۳ به جای ۱۲۳)
phone_number = prefix + random_part_str
list1 = []
group = Group.objects.get(name__exact="CityGuild")
for i in city_operator:
first_name = 'شرکت'
last_name = str(i.unit_name.strip().split()[-1])
password = '2025'
hashed_password = hashlib.sha256(str(password).encode()).hexdigest()
province = Province.objects.filter(id=i.user.province.id).last()
city = City.objects.filter(id=i.user.city.id).last()
data = {
"username": phone_number,
"first_name": first_name,
"last_name": last_name,
"password": hashed_password,
"national_code": '0',
"role": "CityGuild",
"api_key": PROJECT_API_KEY
}
while True:
system_profile = SystemUserProfile.objects.filter(mobile=phone_number, trash=False).last()
if not system_profile:
req = requests.post(
url=ARTA_REGISTER,
data=data,
verify=False
)
if req.status_code == 200:
break
else:
phone_number = str(int(phone_number) + 1)
else:
phone_number = str(int(phone_number) + 1)
user = User(username=phone_number, first_name=first_name, last_name=last_name, password=hashed_password)
user.save()
base_id = SystemUserProfile.objects.all()
if base_id.count() > 0:
base_id = int(base_id.last().base_order) + 1
else:
base_id = 1000
system_profile = SystemUserProfile(
mobile=phone_number,
first_name=first_name,
last_name=last_name,
fullname=first_name + '' + last_name,
user=user,
base_order=base_id,
password=password,
birthday=str(datetime.now().date()),
city=city,
province=province
)
system_profile.save()
system_profile.role.add(group)
wallet = Wallet()
wallet.save()
guild = CityGuild(
user=system_profile,
address=i.address,
unit_name=f'شرکت پروتئین {last_name}',
wallet=wallet,
wallet_amount=0,
)
guild.save()
return HttpResponse('ok')
def add_killing_age_to_poultry_request(request):
poultry_requests = PoultryRequest.objects.filter(trash=False, out_province_request_cancel=False).order_by('id')
for poultry_request in poultry_requests:
age = (poultry_request.send_date.date() - poultry_request.hatching.date.date()).days + 1
poultry_request.killing_age = age
poultry_request.save()
return HttpResponse('ok')
def add_poultry_prediction(request):
poultry_hatching = PoultryHatching.objects.filter(trash=False, temporary_trash=False,
temporary_deleted=False).values_list('poultry__id',
flat=True).distinct()
poultrys = Poultry.objects.filter(id__in=poultry_hatching, trash=False)
for poultry in poultrys:
poultry_prediction(poultry)
return HttpResponse('ok')
def fix_out_quantity_hatching(request):
hatchings = PoultryHatching.objects.filter(trash=False, allow_hatching='pending',
state='pending')
l = 0
for hatching in hatchings:
out_poultry_requests = PoultryRequest.objects.filter(trash=False, out=True,
state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending'),
out_province_request_cancel=False,
hatching=hatching)
total_killed_quantity = out_poultry_requests.aggregate(total=Sum('quantity'))[
'total']
total_killed_weight = out_poultry_requests.aggregate(total=Sum('Index_weight'))[
'total']
total_killed_weight = total_killed_weight / len(out_poultry_requests)
if total_killed_quantity != hatching.out_province_killed_quantity:
hatching.out_province_killed_quantity = total_killed_quantity
hatching.out_province_killed_weight = int(total_killed_weight * total_killed_quantity)
hatching.save()
return HttpResponse(l)
def accept_bar_difference_request_pending_cron_job():
date = datetime.now().date() - timedelta(days=2)
bar_requests = BarDifferenceRequest.objects.filter(trash=False,
state='pending', create_date__date__lt=date).order_by('id')
for bar_request in bar_requests:
bar_request.state = 'accepted'
bar_request.acceptor_fullname = 'سیستمی'
bar_request.acceptor_mobile = '00000000000'
bar_request.acceptor_date = datetime.now()
bar_request.hatching.bar_difference_request_quantity += bar_request.quantity
bar_request.hatching.bar_difference_request_weight += bar_request.weight
bar_request.hatching.save()
bar_request.save()
2026-01-28 16:24:05 +03:30
def accept_bar_difference_request_pending_manual(request):
date = datetime.now().date() - timedelta(days=2)
bar_requests = BarDifferenceRequest.objects.filter(trash=False,
state='pending', create_date__date__lt=date).order_by('id')
for bar_request in bar_requests:
bar_request.state = 'accepted'
bar_request.acceptor_fullname = 'سیستمی'
bar_request.acceptor_mobile = '00000000000'
bar_request.acceptor_date = datetime.now()
bar_request.hatching.bar_difference_request_quantity += bar_request.quantity
bar_request.hatching.bar_difference_request_weight += bar_request.weight
bar_request.hatching.save()
bar_request.save()
return HttpResponse('ok')
2026-01-18 11:45:53 +03:30
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def live_chicken_transportation(request):
import requests
url = "https://www.samasat.ir/Report/BroilerCarryChickenAccordingToCarriage/_AjaxBinding"
headers = {
"authority": "www.samasat.ir",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US,en;q=0.9",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
cookies = {
"ASP.NET_SessionId": "dl1fj1ad2m4ys1doyjr0gi1c",
".ASPXAUTH": "01BF39FE4507AAA7C63455A5B32B87A86145C672877A8ACAB074E87A89F13CDA40489ECD2E6732763758CD61528A0AE6BB390A8B3603BDAAA31CDD3AE7509F7885088F9CB51F56128C497F58ADEEFB54791C2F08ACF11AC1662DC1052430AA26E3EF29C1390FEC77C0C27908CC7A7AC9B62D7809419BE9639C848D10EB00022DCEE2B53039E8C13A59E7D50F3BC45D8C2328368285EF992B6FCF076CECFE8EFBE570F3A1FD0831D0B64EB8C9BBD326E088A40BCF3602C565FD00E78309AF4A4B75BA4E99A5A968F2FE666CCB4F176CAD2D9AC75D100EB69EBE4EA832C23C6EC8442B501BE3A014B50B711167292D3934C86843AC8CF151913575473BFE6003332B0DE69FDEAF78993B986CF8766682AC35E7B8A0492CBD59859E94DDABCC0FE6696C4703772CCEA19B05BE641B3F2DB636D79E8AEDB97E81792D9F357E8C8B3A843364032098683E90B61E90A3C2E647AD68BC067624EEB5328D0A22B8D38F9BC2A032C654DEE193580793A0CB0EDA4C65123EF59FC27D44E304FCCD8DB1548A944BEC5D1EE489C95EDBC406E61C603FC479D004DD705AAFE5FC1D10883E416D30AA11A1FF048DC92F41613B54E04F25D63D951F89380518D71CEC42C0E4207B66F0E0A940DF387782BD54A10E84A4F1E0266AB096538577CFA49A64092BC6CEBFED30B4E4F29D1D16EFB78BBF9B54D8047DD8919555906C98D0BFA11D81EDB0C938EAC11561EF3BB403D07A67C32D5F2202FC21881356CC3F954291FCF3C80653C46102A9C45C417D8241569D6D5ABEA8BB26DDA2E8A1E1D2A406A7EBD94F5E2349B5A18FB7C6CFE4E4FAD6C40201EC27F64DB539B964B18BEEA6A1DC188E3981053C0C1572325E54218AB20E663A194C78CEF2716D126456346B8323CCA4387D827AF775C055F7DF1D6131B2AB4B8C4CCC2B5AE7C025A4F6726B42E6BDCB99B8D695E091766B4C61BD16FE16DC8BF096010C6F1C077B12BD702B71C96D46D37670E40056337F971E3B2B8A72E50A64334B0DD480CC2B4E3F658255DF7C5880D6A5B673AE17EDECB65FDB34EF71E378DC1971389FEA8C89F01F96E75E30C4E5B3F42C07823C5AE78A720F71F15BA90FDEE9EE5D22920EB0F9052D083992D3430FCA0D327B365D734E7BBDCACEAAB6C8",
"leggedOut": "-"
}
payload = {
"sort": "RemoveDateMax-desc",
"page": "1",
"pageSize": "25",
"group": "",
"aggregate": "HatchingCount-sum~RemoveCount-sum",
"filter": "",
"searchVm.ProvinceLocationId": "65550",
"searchVm.UnitName": "",
"searchVm.PersonFullName": "",
"searchVm.PartIdCode": "",
"searchVm.PostalCode": "",
"searchVm.EpidemiologicCode": "",
"searchVm.CapacityFemale": "",
"searchVm.BfrCode": "",
"searchVm.SourceCertId": "",
"searchVm.HatchingCount": "",
"searchVm.RemoveCount": "",
"searchVm.HatchingDateFrom": "",
"searchVm.HatchingDateTo": "",
"searchVm.PercentRemoveTakhlieFromHatchingFrom": "",
"searchVm.PercentRemoveTakhlieFromHatchingTo": "",
"searchVm.RemoveDateMinFrom": "",
"searchVm.RemoveDateMinTo": "",
"searchVm.RemoveDateMaxFrom": "1403/11/24",
"searchVm.RemoveDateMaxTo": "1403/12/04",
"searchVm.RemoveAgeAvgFrom": "",
"searchVm.RemoveAgeAvgTo": "",
"searchVm.RemoveAgeAvgSamasatFrom": "",
"searchVm.RemoveAgeAvgSamasatTo": "",
"searchVm.RemovePartyCountFrom": "",
"searchVm.RemovePartyCountTo": ""
}
response = requests.post(url, headers=headers, cookies=cookies, data=payload)
return Response(response.json())
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def heards_meat_flow(request):
import requests
url = "https://www.samasat.ir/Report/BroilerOnFlowFlocksHealthPermitReport/_AjaxBinding"
headers = {
"authority": "www.samasat.ir",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US,en;q=0.9",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
cookies = {
"ASP.NET_SessionId": "dl1fj1ad2m4ys1doyjr0gi1c",
".ASPXAUTH": "01BF39FE4507AAA7C63455A5B32B87A86145C672877A8ACAB074E87A89F13CDA40489ECD2E6732763758CD61528A0AE6BB390A8B3603BDAAA31CDD3AE7509F7885088F9CB51F56128C497F58ADEEFB54791C2F08ACF11AC1662DC1052430AA26E3EF29C1390FEC77C0C27908CC7A7AC9B62D7809419BE9639C848D10EB00022DCEE2B53039E8C13A59E7D50F3BC45D8C2328368285EF992B6FCF076CECFE8EFBE570F3A1FD0831D0B64EB8C9BBD326E088A40BCF3602C565FD00E78309AF4A4B75BA4E99A5A968F2FE666CCB4F176CAD2D9AC75D100EB69EBE4EA832C23C6EC8442B501BE3A014B50B711167292D3934C86843AC8CF151913575473BFE6003332B0DE69FDEAF78993B986CF8766682AC35E7B8A0492CBD59859E94DDABCC0FE6696C4703772CCEA19B05BE641B3F2DB636D79E8AEDB97E81792D9F357E8C8B3A843364032098683E90B61E90A3C2E647AD68BC067624EEB5328D0A22B8D38F9BC2A032C654DEE193580793A0CB0EDA4C65123EF59FC27D44E304FCCD8DB1548A944BEC5D1EE489C95EDBC406E61C603FC479D004DD705AAFE5FC1D10883E416D30AA11A1FF048DC92F41613B54E04F25D63D951F89380518D71CEC42C0E4207B66F0E0A940DF387782BD54A10E84A4F1E0266AB096538577CFA49A64092BC6CEBFED30B4E4F29D1D16EFB78BBF9B54D8047DD8919555906C98D0BFA11D81EDB0C938EAC11561EF3BB403D07A67C32D5F2202FC21881356CC3F954291FCF3C80653C46102A9C45C417D8241569D6D5ABEA8BB26DDA2E8A1E1D2A406A7EBD94F5E2349B5A18FB7C6CFE4E4FAD6C40201EC27F64DB539B964B18BEEA6A1DC188E3981053C0C1572325E54218AB20E663A194C78CEF2716D126456346B8323CCA4387D827AF775C055F7DF1D6131B2AB4B8C4CCC2B5AE7c025A4F6726B42E6BDCB99B8D695E091766B4C61BD16FE16DC8BF096010C6F1C077B12BD702B71C96D46D37670E40056337F971E3B2B8A72E50A64334B0DD480CC2B4E3F658255DF7C5880D6A5B673AE17EDECB65FDB34EF71E378DC1971389FEA8C89F01F96E75E30C4E5B3F42C07823C5AE78A720F71F15BA90FDEE9EE5D22920EB0F9052D083992D3430FCA0D327B365D734E7BBDCACEAAB6C8",
"leggedOut": "-"
}
payload = {
"sort": "HatchingDate-desc",
"page": "1",
"pageSize": "25",
"group": "",
"aggregate": "HatchingCount-sum~HatchingCountInBargiri-sum~HatchingCountInTakhlie-sum~TrackingBargiriCount-sum~DiffHamlThanTakhlieCount-sum~DiffTakhlieThanHamlCount-sum~HamlMorghTotalCount-sum~HamlMorghTakhlieCount-sum~EvacuationCount-sum",
"filter": "",
"searchVm.FromDate": "01/09/1403 12:00:00 ق.ظ",
"searchVm.ToDate": "04/12/1403 12:00:00 ق.ظ",
"searchVm.TableName": "Z_002_ReportTempTable_5a2f0974ec3542d4b92ac87e75ef5549",
"searchVm.ProvinceLocationId": "65550",
"searchVm.PartIdCode": "",
"searchVm.UnitName": "",
"searchVm.PostalCode": "",
"searchVm.EpidemiologicCode": "",
"searchVm.PersonFullName": "",
"searchVm.CapacityFemaleFrom": "",
"searchVm.CapacityFemaleTo": "",
"searchVm.RequestCode": "",
"searchVm.DesCertId": "",
"searchVm.FlockAgeDayFrom": "1",
"searchVm.FlockAgeDayTo": "60",
"searchVm.HatchingDateFromPersian": "",
"searchVm.HatchingDateToPersian": "",
"searchVm.MaxHatchingDateFromPersian": "",
"searchVm.MaxHatchingDateToPersian": "",
"searchVm.TrackingStatusId": "",
"searchVm.PercentMorghToJoojeTotalFrom": "",
"searchVm.PercentMorghToJoojeTotalTo": "",
"searchVm.PercentMorghToJoojeTakhlieFrom": "",
"searchVm.PercentMorghToJoojeTakhlieTo": ""
}
# Send the POST request
response = requests.post(url, headers=headers, cookies=cookies, data=payload)
return Response(response.json())
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def detail_heards_meat_flow(request):
import requests
url = "https://www.samasat.ir/WinBroilerFlockRequest/WinBroilerFlockRequestHatchingTrackingRep/_AjaxBindingWinBroilerFlockRequestHatchingTrackingRepVw"
headers = {
"authority": "www.samasat.ir",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US,en;q=0.9",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
cookies = {
"ASP.NET_SessionId": "i2l4rxgagljnsecfg4smvbwg",
".ASPXAUTH": "681FA227EBBFA8AFFA02E6C23A8B52159139B3D2E6AB49D18E71D6E568273F013CC434A01E2E9B27F6594D01A3B5FBC3923AA876642555D6FDD209306CB9336FE1CC172797B46B72274BDEBFCCD7EAD1EC6C69A30A871BE40FF5C9EDC025E10569533963A92F00B03A3495622A962FBE0FFDAF4B4EC513AF1458BF6282C2C7D2618DCA2A1394D5E1BF34EA50FED6490AD29AA63749DC0EA8849792A6834139F6EDA2C5C938AC36A92371B542C576FEA94A81F3D7274F6EFFCD8FD08820B871D4BD588CB415DCC3D86B5408577D50C1C36B00D6032BE82D85BD80453D5C1FF719C186000C379CB43FB794AE9C91838A0D04D744BEC9E7ADDCCB0668B0326F1B1F50EAE3128537F4ECB07A5453AFBCDD22A5509A1DDE5AA7EF25CBAFBEB06182E468E80BB28C7DEE72D1990FCDE24C6B4E1621E77BCF221A25783CD87D15777C1698052EA6193725C5CB0B3DF1788D1C15DF2AB14357A6051DA5810B948EEDC7697E701EED1D1A69E268742EB63A133F5667D23D2191ABC60C8A0C828A61CBF8432DD6F49DA32B7D9FAE4DA4AF0D7A175A6CCAFDB2DAB13DA6A5AD802945F0A9DB3E9FE8D4694449600109EF2656993993C14F269C8E61747696480B0079765B99386F7A218E38C37A32E9D14C97B246E3102FCFD5E298C11A1955D88FC2D94F5795B7245B62611965C2A46B3E9B0E906D5879B6D3AFF76401E7F5F1CE6E7215CF6AF52D313A3A57853E23F0E2402B9101F482BA857A987EAC5B2895FB29C49840EA2AB0F4A316A3223F8E67967A2ADFB43CFE47109A70A98725EFAB57F68A57E42F5E0DB306339BE841861A094399A8BA9CD98ED065A20CFB30C5ECC46A3CBD9C7B03DFDD603C0C143D353EC1A8A2CE0AB9ADB69A3EFB0B6B953520B133026355CC4FAAFD9D380FE436CD8B87471ED0B507663192A4B35A2D085BAD0A47C9DBC5E813EFF7BE2BB64A2A10A5A8EFE0D80CBE2EE81E2DC0F86DAD4A5D9F2A1F7E32EAFF8669E95616DB93CCF5FD801B293D47AEFAB1EE5C2801D2E916868687226315BAF13A971ED0382D75EF0EA69271962959DD05AB22B2A6397980B026B59A8A38A1385689258D7BB05E0DFAF7E4DF9868A50088D044003FB55A6D20E8EBAF92F457C1BBCD7BFB5E15A0795445A11ECA",
"leggedOut": "-"
}
payload = {
"sort": "IssueDate-desc",
"page": "1",
"pageSize": "25",
"group": "",
"filter": "",
"certId": "140313016425"
}
response = requests.post(url, headers=headers, cookies=cookies, data=payload)
return Response(response.json())
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def breed(request):
import requests
url = "https://www.samasat.ir/Report/BroilerFlockRequestDetailReport/_AjaxBinding"
headers = {
"authority": "www.samasat.ir",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US,en;q=0.9",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
cookies = {
"ASP.NET_SessionId": "i2l4rxgagljnsecfg4smvbwg",
".ASPXAUTH": "681FA227EBBFA8AFFA02E6C23A8B52159139B3D2E6AB49D18E71D6E568273F013CC434A01E2E9B27F6594D01A3B5FBC3923AA876642555D6FDD209306CB9336FE1CC172797B46B72274BDEBFCCD7EAD1EC6C69A30A871BE40FF5C9EDC025E10569533963A92F00B03A3495622A962FBE0FFDAF4B4EC513AF1458BF6282C2C7D2618DCA2A1394D5E1BF34EA50FED6490AD29AA63749DC0EA8849792A6834139F6EDA2C5C938AC36A92371B542C576FEA94A81F3D7274F6EFFCD8FD08820B871D4BD588CB415DCC3D86B5408577D50C1C36B00D6032BE82D85BD80453D5C1FF719C186000C379CB43FB794AE9C91838A0D04D744BEC9E7ADDCCB0668B0326F1B1F50EAE3128537F4ECB07A5453AFBCDD22A5509A1DDE5AA7EF25CBAFBEB06182E468E80BB28C7DEE72D1990FCDE24C6B4E1621E77BCF221A25783CD87D15777C1698052EA6193725C5CB0B3DF1788D1C15DF2AB14357A6051DA5810B948EEDC7697E701EED1D1A69E268742EB63A133F5667D23D2191ABC60C8A0C828A61CBF8432DD6F49DA32B7D9FAE4DA4AF0D7A175A6CCAFDB2DAB13DA6A5AD802945F0A9DB3E9FE8D4694449600109EF2656993993C14F269C8E61747696480B0079765B99386F7A218E38C37A32E9D14C97B246E3102FCFD5E298C11A1955D88FC2D94F5795B7245B62611965C2A46B3E9B0E906D5879B6D3AFF76401E7F5F1CE6E7215CF6AF52D313A3A57853E23F0E2402B9101F482BA857A987EAC5B2895FB29C49840EA2AB0F4A316A3223F8E67967A2ADFB43CFE47109A70A98725EFAB57F68A57E42F5E0DB306339BE841861A094399A8BA9CD98ED065A20CFB30C5ECC46A3CBD9C7B03DFDD603C0C143D353EC1A8A2CE0AB9ADB69A3EFB0B6B953520B133026355CC4FAAFD9D380FE436CD8B87471ED0B507663192A4B35A2D085BAD0A47C9DBC5E813EFF7BE2BB64A2A10A5A8EFE0D80CBE2EE81E2DC0F86DAD4A5D9F2A1F7E32EAFF8669E95616DB93CCF5FD801B293D47AEFAB1EE5C2801D2E916868687226315BAF13A971ED0382D75EF0EA69271962959DD05AB22B2A6397980B026B59A8A38A1385689258D7BB05E0DFAF7E4DF9868A50088D044003FB55A6D20E8EBAF92F457C1BBCD7BFB5E15A0795445A11ECA",
"leggedOut": "-"
}
payload = {
"sort": "SendDate-desc",
"page": "1",
"pageSize": "25",
"group": "",
"aggregate": "RequestCountLong-sum~ChickCountLong-sum",
"filter": "",
"searchVm.FlockRequestId": "",
"searchVm.Islegal": "True",
"searchVm.HatcheryId": "",
"searchVm.ProvinceLocationId": "65550",
"searchVm.PartIdCode": "",
"searchVm.UnitName": "",
"searchVm.BfrRequestCode": "",
"searchVm.CertId": "",
"searchVm.BroilerPedigreeTypeId": "",
"searchVm.SendDateFrom": "1403/11/28",
"searchVm.SendDateTo": "1403/12/05",
"searchVm.ChickCountFrom": "",
"searchVm.ChickCountTo": "",
"searchVm.PedigreeType": "",
"searchVm.SenderUnitName": "",
"searchVm.StartDateFrom": "",
"searchVm.StartDateTo": "",
"searchVm.EndDateFrom": "",
"searchVm.EndDateTo": "",
"searchVm.RequestCountFrom": "",
"searchVm.RequestCountTo": "",
"searchVm.SystemCode": "",
"searchVm.EpidemiologicCode": "",
"searchVm.PostalCode": "",
"searchVm.CapacityFemaleFrom": "",
"searchVm.CapacityFemaleTo": "",
"searchVm.PersonNationalCodeOrId": "",
"searchVm.PersonName": "",
"searchVm.RegDateFrom": "",
"searchVm.RegDateTo": ""
}
response = requests.post(url, headers=headers, cookies=cookies, data=payload)
return Response(response.json())
@api_view(["GET"])
@permission_classes([AllowAny])
@csrf_exempt
def chat_bot_info(request):
hatchings = PoultryHatching.objects.filter(trash=False, archive=False, state='pending').order_by('date')
poultry = Poultry.objects.filter(pk__in=hatchings.values_list('poultry', flat=True))
province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, state__in=('pending', 'accepted'),
return_to_province=False,
province_request__poultry_request__hatching__in=hatchings)
kill_house_requests = KillHouseRequest.objects.filter(trash=False,
province_request__poultry_request__hatching__in=hatchings)
result = {
"number_of_hatchings": len(hatchings),
"number_of_poultry": len(poultry),
"hatching_quantity": hatchings.aggregate(total=Sum('quantity'))['total'] or 0,
"number_province_kill_requests": len(province_kill_requests),
"province_kill_requests_quantity": province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
'total'] or 0,
"number_of_kill_house_requests": len(kill_house_requests),
"kill_house_requests_quantity": kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
'total'] or 0,
}
return Response(result, status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def add_interest_license_id_to_poultry(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
list1 = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i < 6 or row is None:
continue
breeding = row[5]
licenc = row[13]
try:
poultry = Poultry.objects.get(breeding_unique_id=breeding, trash=False)
poultry.interest_license_id = licenc
poultry.save()
except:
list1.append(breeding)
# print(date.date())
# for kill in kill_req:
# if kill.poultry_name == poultry and kill.quantity== quantity and \
# kill.live_weight== wieght and kill.date.date() ==date and kill.acceptor_rejector == accepterde:
# print(kill.id)
return HttpResponse(list1)
@api_view(["POST"])
@permission_classes([AllowAny])
@csrf_exempt
def add_asddasasd(request):
file = request.FILES['file'].read()
wb_obj = openpyxl.load_workbook(filename=BytesIO(file))
sheet = wb_obj.active
list1 = []
for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i < 1 or row is None:
continue
east = row[16]
west = row[17]
licenc = row[3]
poultry = Poultry.objects.filter(Lat__isnull=True, interest_license_id=licenc).first()
if poultry:
if east and west is not None:
lon, lat = utm_to_loc(east, west)
poultry.Lat = lon
poultry.Long = lat
poultry.save()
# تبدیل مختصات
# breeding=row[5]
# licenc=row[13]
# try:
# poultry=Poultry.objects.get(breeding_unique_id=breeding,trash=False)
# poultry.interest_license_id=licenc
# poultry.save()
# except:
# list1.append(breeding)
# # print(date.date())
# for kill in kill_req:
# if kill.poultry_name == poultry and kill.quantity== quantity and \
# kill.live_weight== wieght and kill.date.date() ==date and kill.acceptor_rejector == accepterde:
# print(kill.id)
return HttpResponse(list1)
# def add_to_warehouse_manual(request):
# kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
# 'system_address__province')
# for kill_house in kill_houses:
# kill_house_requests = KillHouseRequest.objects.filter(
# Q(killhouse_user=kill_house) | Q(killer=kill_house),
# ware_house_confirmation=False, trash=False, calculate_status=True)
# if kill_house_requests:
# # wieght = \
# # kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
# # 'total'] or 0
# for kill_house_request in kill_house_requests:
# kill_house = kill_house_request.killhouse_user
# product = RolesProducts.objects.filter(parent_product__product_id=2, kill_house=kill_house).first()
#
#
#
# kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity
# kill_house_request.ware_house_accepted_real_weight = int(kill_house_request.accepted_real_weight - (
# (kill_house_request.accepted_real_weight * 25) / 100))
# kill_house_request.weight_loss = 25
# kill_house_request.ware_house_input_type = 'loss_weight'
# kill_house_request.ware_house_confirmation = True
# kill_house_request.date_of_ware_house = str(datetime.now())
# kill_house_request.entered_message='ورود به انبار توسط سیستم'
# kill_house_request.save()
# kill_house_requests_product_warehousing(product)
#
# # mobile=kill_house.kill_house_operator.user.mobile
# # if kill_house.killer == False:
# # killer = 'کشتارگاه'
# # else:
# # killer = 'کشتارکن'
# # message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \
# # f'\n' \
# # f'تعداد {len(kill_house_requests)} بار با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \
# # f'\n' \
# # f'(سامانه رصدیار)'
# # check_mobile = check_mobile_number(mobile)
# # if check_mobile:
# # req = requests.get(
# # f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}")
# return HttpResponse('ok')
def add_free_bar_to_warehouse_automatic_type_manual(request):
if base_url_for_sms_report == 'ha' or base_url_for_sms_report == 'ku':
send_day = 2
send_time = 48
else:
send_day = 1
send_time = 24
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(
create_date__date__lt=datetime.now().date() - timedelta(days=send_day), buy_type='live', trash=False,
weight_of_carcasses=0, kill_house=kill_house, ware_house=False, register_type='automatic')
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
len_kill_house_requests = len(free_bars)
ware_house_accepted_real_weight = int((wieght * 75) / 100)
bars_info = []
for free_bar in free_bars:
product = free_bar.product
real_weight = round((free_bar.live_weight * 75) / 100)
free_bar.number_of_carcasses = int(real_weight / 1.5)
free_bar.weight_of_carcasses = real_weight
free_bar.weight_loss = 25
free_bar.ware_house = True
free_bar.date = str(datetime.now())
# free_bar.entered_message = 'ورود به انبار توسط سیستم'
# free_bar.entered_message = 'ورود به انبار مجازی'
free_bar.total_wage_amount = free_bar.wage * int(
free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(
free_bar.weight_of_carcasses)
union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0
company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0
guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0
city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0
wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0
other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0
free_bar.union_share = int(union_percent * free_bar.total_wage_amount)
free_bar.company_share = int(company_percent * free_bar.total_wage_amount)
free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount)
free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount)
free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount)
free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount)
free_bar.save()
kill_house_free_buying_product_warehousing(product)
bars_info.append(
'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format(
free_bar.bar_clearance_code,
to_locale_str(int(free_bar.live_weight)),
to_locale_str(int(real_weight)),
shamsi_date(free_bar.create_date)
))
# mobile=kill_house.kill_house_operator.user.mobile
# if kill_house.killer == False:
# killer = 'کشتارگاه'
# else:
# killer = 'کشتارکن'
# message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \
# f'\n' \
# f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \
# f'\n' \
# f'(سامانه رصدیار)'
# check_mobile = check_mobile_number(mobile)
# if check_mobile:
# req = requests.get(
# f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}")
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:اعلام ورود بار به انبار مجازی به دلیل انقضای مهلت زمانی",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \
'\n' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت {send_time} ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار مجازی منتقل گردید.*** ' \
'\n' \
f' جزئیات بارهای منتقل شده:' \
f'***' \
f'{bars_details}' \
f'***' \
f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
return HttpResponse('ok')
def add_free_bar_to_warehouse_automatic_type_cron():
# if base_url_for_sms_report == 'ha':
send_day = 2
send_time = 48
# else:
# send_day = 1
# send_time = 24
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(
register_date__date__lt=datetime.now().date() - timedelta(days=send_day), buy_type='live', trash=False,
weight_of_carcasses=0, kill_house=kill_house, ware_house=False, register_type='automatic')
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
len_kill_house_requests = len(free_bars)
ware_house_accepted_real_weight = int((wieght * 75) / 100)
bars_info = []
for free_bar in free_bars:
product = free_bar.product
real_weight = round((free_bar.live_weight * 75) / 100)
free_bar.number_of_carcasses = int(real_weight / 1.5)
free_bar.weight_of_carcasses = real_weight
free_bar.weight_loss = 25
free_bar.ware_house = True
free_bar.date = str(datetime.now())
# free_bar.entered_message = 'ورود به انبار توسط سیستم'
# free_bar.entered_message = 'ورود به انبار مجازی'
free_bar.total_wage_amount = free_bar.wage * int(
free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(
free_bar.weight_of_carcasses)
union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0
company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0
guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0
city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0
wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0
other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0
free_bar.union_share = int(union_percent * free_bar.total_wage_amount)
free_bar.company_share = int(company_percent * free_bar.total_wage_amount)
free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount)
free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount)
free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount)
free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount)
free_bar.save()
kill_house_free_buying_product_warehousing(product)
bars_info.append(
'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format(
free_bar.bar_clearance_code,
to_locale_str(int(free_bar.live_weight)),
to_locale_str(int(real_weight)),
shamsi_date(free_bar.create_date)
))
# mobile=kill_house.kill_house_operator.user.mobile
# if kill_house.killer == False:
# killer = 'کشتارگاه'
# else:
# killer = 'کشتارکن'
# message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \
# f'\n' \
# f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \
# f'\n' \
# f'(سامانه رصدیار)'
# check_mobile = check_mobile_number(mobile)
# if check_mobile:
# req = requests.get(
# f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}")
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:اعلام ورود بار به انبار مجازی به دلیل انقضای مهلت زمانی",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \
'\n' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت {send_time} ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار مجازی منتقل گردید.*** ' \
'\n' \
f' جزئیات بارهای منتقل شده:' \
f'***' \
f'{bars_details}' \
f'***' \
f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
def add_free_bar_to_warehouse_manual(request):
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(
create_date__date__lt=datetime.now().date() - timedelta(days=2), buy_type='live', trash=False,
weight_of_carcasses=0, kill_house=kill_house, ware_house=False, register_type='manual')
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
len_kill_house_requests = len(free_bars)
ware_house_accepted_real_weight = int((wieght * 75) / 100)
bars_info = []
for free_bar in free_bars:
product = free_bar.product
real_weight = round((free_bar.live_weight * 75) / 100)
free_bar.number_of_carcasses = int(real_weight / 1.5)
free_bar.weight_of_carcasses = real_weight
free_bar.weight_loss = 25
free_bar.ware_house = True
free_bar.date = str(datetime.now())
free_bar.entered_message = 'ورود به انبار توسط سیستم'
free_bar.total_wage_amount = free_bar.wage * int(
free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(
free_bar.weight_of_carcasses)
union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0
company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0
guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0
city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0
wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0
other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0
free_bar.union_share = int(union_percent * free_bar.total_wage_amount)
free_bar.company_share = int(company_percent * free_bar.total_wage_amount)
free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount)
free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount)
free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount)
free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount)
free_bar.save()
kill_house_free_buying_product_warehousing(product)
bars_info.append(
'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format(
free_bar.bar_clearance_code,
to_locale_str(int(free_bar.live_weight)),
to_locale_str(int(real_weight)),
shamsi_date(free_bar.date)
))
# mobile=kill_house.kill_house_operator.user.mobile
# if kill_house.killer == False:
# killer = 'کشتارگاه'
# else:
# killer = 'کشتارکن'
# message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \
# f'\n' \
# f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \
# f'\n' \
# f'(سامانه رصدیار)'
# check_mobile = check_mobile_number(mobile)
# if check_mobile:
# req = requests.get(
# f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}")
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:اعلام ورود بار به انبار به دلیل انقضای مهلت زمانی",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \
'\n' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.*** ' \
'***' \
f' جزئیات بارهای منتقل شده:' \
f'***' \
f'{bars_details}' \
f'***' \
f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
return HttpResponse('ok')
def add_free_bar_to_warehouse_cron():
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(create_date__date__lt=datetime.now().date() -
timedelta(days=2), buy_type='live',
trash=False,
weight_of_carcasses=0, kill_house=kill_house,
ware_house=False
, register_type='manual')
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
len_kill_house_requests = len(free_bars)
ware_house_accepted_real_weight = int((wieght * 75) / 100)
bars_info = []
for free_bar in free_bars:
product = free_bar.product
real_weight = round((free_bar.live_weight * 75) / 100)
free_bar.number_of_carcasses = int(real_weight / 1.5)
free_bar.weight_of_carcasses = real_weight
free_bar.weight_loss = 25
free_bar.ware_house = True
free_bar.date = str(datetime.now())
free_bar.entered_message = 'ورود به انبار توسط سیستم'
free_bar.total_wage_amount = free_bar.wage * int(
free_bar.live_weight) if free_bar.buy_type == 'live' else free_bar.wage * int(
free_bar.weight_of_carcasses)
union_percent = free_bar.union_share_percent / 100 if free_bar.union_share_percent > 0 else 0
company_percent = free_bar.company_share_percent / 100 if free_bar.company_share_percent > 0 else 0
guilds_percent = free_bar.guilds_share_percent / 100 if free_bar.guilds_share_percent > 0 else 0
city_share_percent = free_bar.city_share_percent / 100 if free_bar.city_share_percent > 0 else 0
wallet_share_percent = free_bar.wallet_share_percent / 100 if free_bar.wallet_share_percent > 0 else 0
other_share_percent = free_bar.other_share_percent / 100 if free_bar.other_share_percent > 0 else 0
free_bar.union_share = int(union_percent * free_bar.total_wage_amount)
free_bar.company_share = int(company_percent * free_bar.total_wage_amount)
free_bar.guilds_share = int(guilds_percent * free_bar.total_wage_amount)
free_bar.city_share = int(city_share_percent * free_bar.total_wage_amount)
free_bar.wallet_share = int(wallet_share_percent * free_bar.total_wage_amount)
free_bar.other_share = int(other_share_percent * free_bar.total_wage_amount)
free_bar.save()
kill_house_free_buying_product_warehousing(product)
bars_info.append(
'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format(
free_bar.bar_clearance_code,
to_locale_str(int(free_bar.live_weight)),
to_locale_str(int(real_weight)),
shamsi_date(free_bar.date)
))
# mobile=kill_house.kill_house_operator.user.mobile
# if kill_house.killer == False:
# killer = 'کشتارگاه'
# else:
# killer = 'کشتارکن'
# message = f'کاربر گرامی {killer + "(" + kill_house.name + ")"}' \
# f'\n' \
# f'تعداد {len(free_bars)} بار (خارج استان) با حجم {wieght} به علت گذشتن زمان لازم برای ورود به انبار توسط سیستم وارد انبار شدند.' \
# f'\n' \
# f'(سامانه رصدیار)'
# check_mobile = check_mobile_number(mobile)
# if check_mobile:
# req = requests.get(
# f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={OUT_SMS_USER}&password={OUT_SMS_PASS}&from=30002501&to={mobile}&message={message}")
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:اعلام ورود بار به انبار به دلیل انقضای مهلت زمانی",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \
'\n' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به شما، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.*** ' \
'***' \
f' جزئیات بارهای منتقل شده:' \
f'***' \
f'{bars_details}' \
f'***' \
f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
def fix_poultry_request_script(request):
hatchings = PoultryHatching.objects.filter(trash=False, archive=False,
allow_hatching='pending')
for hatching in hatchings:
province_requests = PoultryRequest.objects.filter(
Q(wage_pay=False, has_wage=False) | Q(wage_pay=True, has_wage=True), hatching=hatching
, state_process='accepted', province_state='accepted', trash=False, archive=False,
out_province_request_cancel=False, out=True)
if province_requests:
hatching.out_province_killed_quantity = province_requests.aggregate(total=Sum('quantity'))[
'total'] or 0
hatching.out_province_killed_weight = province_requests.aggregate(
total=Sum(F('quantity') * F('Index_weight')))[
'total']
hatching.save()
return HttpResponse('ok')
def add_to_warehouse():
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
date = datetime.now().date() - timedelta(days=2)
for kill_house in kill_houses:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__lt=date,
ware_house_confirmation=False, trash=False, calculate_status=True)
if kill_house_requests:
wieght = \
kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
len_kill_house_requests = len(kill_house_requests)
ware_house_accepted_real_weight = int((wieght * 75) / 100)
bars_info = []
for kill_house_request in kill_house_requests:
kill_house = kill_house_request.killhouse_user
kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity
kill_house_request.ware_house_accepted_real_weight = int(
(kill_house_request.accepted_real_weight * 75) / 100)
kill_house_request.weight_loss = 25
kill_house_request.ware_house_input_type = 'loss_weight'
kill_house_request.ware_house_confirmation = True
kill_house_request.date_of_ware_house = str(datetime.now())
kill_house_request.entered_message = 'ورود به انبار توسط سیستم'
kill_house_request.save()
bars_info.append(
'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format(
kill_house_request.clearance_code,
to_locale_str(int(kill_house_request.accepted_real_weight)),
to_locale_str(int(kill_house_request.ware_house_accepted_real_weight)),
shamsi_date(kill_house_request.kill_request.recive_date)
))
product = RolesProducts.objects.filter(kill_house=kill_house).first()
kill_house_requests_product_warehousing(product)
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:اعلام ورود بار به انبار به دلیل انقضای مهلت زمانی",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
'***' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به جنابعالی، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.' \
f'***' \
f' جزئیات بارهای منتقل شده:' \
f'***' \
f'{bars_details}' \
f'***' \
f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
def add_to_warehouse_manual(request):
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
date = datetime.now().date() - timedelta(days=2)
for kill_house in kill_houses:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
kill_request__recive_date__date__lt=date,
ware_house_confirmation=False, trash=False, calculate_status=True)
if kill_house_requests:
wieght = \
kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
len_kill_house_requests = len(kill_house_requests)
ware_house_accepted_real_weight = int((wieght * 75) / 100)
bars_info = []
for kill_house_request in kill_house_requests:
kill_house = kill_house_request.killhouse_user
kill_house_request.ware_house_accepted_real_quantity = kill_house_request.accepted_real_quantity
kill_house_request.ware_house_accepted_real_weight = int(
(kill_house_request.accepted_real_weight * 75) / 100)
kill_house_request.weight_loss = 25
kill_house_request.ware_house_input_type = 'loss_weight'
kill_house_request.ware_house_confirmation = True
kill_house_request.date_of_ware_house = str(datetime.now())
kill_house_request.entered_message = 'ورود به انبار توسط سیستم'
kill_house_request.save()
bars_info.append(
'کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - وزن لاشه: {2} کیلوگرم - تاریخ بار: ({3})'.format(
kill_house_request.clearance_code,
to_locale_str(int(kill_house_request.accepted_real_weight)),
to_locale_str(int(kill_house_request.ware_house_accepted_real_weight)),
shamsi_date(kill_house_request.kill_request.recive_date)
)
)
product = RolesProducts.objects.filter(kill_house=kill_house).first()
kill_house_requests_product_warehousing(product)
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:اعلام ورود بار به انبار به دلیل انقضای مهلت زمانی",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
'***' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم و وزن لاشه {to_locale_str(int(ware_house_accepted_real_weight))} کیلوگرم متعلق به جنابعالی، به دلیل گذشت مهلت ۴۸ ساعته و عدم اقدام به موقع، به‌صورت خودکار به انبار منتقل گردید.' \
f'***' \
f' جزئیات بارهای منتقل شده:' \
f'***' \
f'{bars_details}' \
f'***' \
f' جهت مشاهده بارها به بخش انبار و توزیع مراجعه نمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
return HttpResponse('ok')
def return_from_archive_poultry_hatching_with_cron_job():
now_date = datetime.now().date()
hatching = PoultryHatching.objects.filter(trash=False,
allow_hatching='True', input_archiver__isnull=True,
last_change__role="automatic-archive",
state='complete', archive=True, last_change__isnull=False).only(
'allow_hatching',
'left_over', 'quantity', 'state',
'archive')
for hatch in hatching:
archive_date = hatch.last_change['date']
date1 = datetime.strptime(archive_date, '%Y-%m-%d %H:%M:%S.%f').date()
if now_date == date1:
if hatch.left_over > (hatch.quantity * percent_of_losses):
hatch.violation = False
hatch.allow_hatching = 'pending'
hatch.state = 'pending'
hatch.archive = False
if hatch.first_date_input_archive is not None:
hatch.first_date_input_archive = None
hatch.last_change = None
hatch.save()
def warning_free_bar_to_warehouse_manual(request):
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(buy_type='live', trash=False,
weight_of_carcasses=0, kill_house=kill_house,
ware_house=False)
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
len_kill_house_requests = len(free_bars)
bars_info = ['کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: ({2})'.format
(free_bar.bar_clearance_code,
to_locale_str(int(free_bar.live_weight)),
shamsi_date(free_bar.date))
for free_bar in free_bars]
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:یادآوری بارهای وارد نشده به انبار",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \
'\n' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \
'\n' \
f' جزئیات بارهای وارد نشده به انبار:' \
f'***' \
f'{bars_details}' \
f'***' \
f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
return HttpResponse('ok')
def warning_free_bar_to_warehouse_cron():
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False).select_related(
'system_address__province')
for kill_house in kill_houses:
free_bars = KillHouseFreeBarInformation.objects.filter(buy_type='live', trash=False,
weight_of_carcasses=0, kill_house=kill_house,
ware_house=False)
if free_bars:
wieght = \
free_bars.aggregate(total=Sum('live_weight'))[
'total'] or 0
len_kill_house_requests = len(free_bars)
bars_info = ['کد قرنطینه: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: ({2})'.format
(free_bar.bar_clearance_code,
to_locale_str(int(free_bar.live_weight)),
shamsi_date(free_bar.date))
for free_bar in free_bars]
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:یادآوری بارهای وارد نشده به انبار",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد. ***' \
'\n' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار خارج استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \
'\n' \
f' جزئیات بارهای وارد نشده به انبار:' \
f'***' \
f'{bars_details}' \
f'***' \
f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
def warning_to_warehouse_cron():
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
for kill_house in kill_houses:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
ware_house_confirmation=False, trash=False, calculate_status=True)
if kill_house_requests:
wieght = \
kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
len_kill_house_requests = len(kill_house_requests)
bars_info = ['کد بار: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: {2}'.format(
bar.bar_code,
to_locale_str(int(bar.accepted_real_weight)),
shamsi_date(bar.kill_request.recive_date))
for bar in kill_house_requests]
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:یادآوری بارهای وارد نشده به انبار",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
'***' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \
f'***' \
f' جزئیات بارهای وارد نشده به انبار:' \
f'***' \
f'{bars_details}' \
f'***' \
f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
def warning_to_warehouse_manual(request):
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
for kill_house in kill_houses:
kill_house_requests = KillHouseRequest.objects.filter(
Q(killhouse_user=kill_house) | Q(killer=kill_house),
ware_house_confirmation=False, trash=False, calculate_status=True)
if kill_house_requests:
wieght = \
kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
'total'] or 0
len_kill_house_requests = len(kill_house_requests)
bars_info = ['کد بار: {0} - وزن زنده: {1} کیلوگرم - تاریخ بار: ({2})'.format(
bar.bar_code,
to_locale_str(int(bar.accepted_real_weight)),
shamsi_date(bar.kill_request.recive_date))
for bar in kill_house_requests]
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:یادآوری بارهای وارد نشده به انبار",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
'***' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، محموله بار داخل استانی به تعداد {to_locale_str(len_kill_house_requests)} بار و وزن زنده {to_locale_str(int(wieght))} کیلوگرم وارد انبار نگردیده است.' \
f'***' \
f' جزئیات بارهای وارد نشده به انبار:' \
f'***' \
f'{bars_details}' \
f'***' \
f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
return HttpResponse('ok')
def warning_province_kill_request_without_bar_manual(request):
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
for kill_house in kill_houses:
province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house,
state__in=('pending', 'accepted'),
archive_wage=False,
return_to_province=False,
trash=False, first_car_allocated_quantity=0)
if province_kill_request:
wieght = province_kill_request.aggregate(total=Sum('quantity'))['total'] or 0
len_province_kill_request = len(province_kill_request)
bars_info = []
for bar in province_kill_request:
try:
order_code = bar.province_request.poultry_request.order_code
quantity = to_locale_str(int(bar.quantity))
kill_request = getattr(bar.province_request, 'kill_request', None)
recive_date = getattr(kill_request, 'recive_date', None)
date_str = shamsi_date(recive_date) if recive_date else ''
info = 'کد سفارش:{0} - وزن:{1} کیلوگرم - تاریخ تخصیص:{2}'.format(
order_code,
quantity,
date_str
)
bars_info.append(info)
except Exception:
continue
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:یادآوری تخصیصات بدون بار",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
'***' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، تخصیصات بدون بار به تعداد {to_locale_str(len_province_kill_request)} تخصیص و وزن {to_locale_str(int(wieght))} کیلوگرم فاقد تخصیص ماشین میباشد.' \
f'***' \
f' جزئیات تخصیصات بدون بار:' \
f'***' \
f'{bars_details}' \
f'***' \
f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
return HttpResponse('ok')
def warning_province_kill_request_without_bar_cron():
user = SystemUserProfile.objects.filter(trash=False, role__name='AdminX').first()
kill_houses = KillHouse.objects.filter(out_province=False, trash=False)
for kill_house in kill_houses:
province_kill_request = ProvinceKillRequest.objects.filter(killhouse_user=kill_house,
state__in=('pending', 'accepted'),
archive_wage=False,
return_to_province=False,
trash=False, first_car_allocated_quantity=0)
if province_kill_request:
wieght = province_kill_request.aggregate(total=Sum('quantity'))['total'] or 0
len_province_kill_request = len(province_kill_request)
bars_info = []
for bar in province_kill_request:
try:
order_code = bar.province_request.poultry_request.order_code
quantity = to_locale_str(int(bar.quantity))
kill_request = getattr(bar.province_request, 'kill_request', None)
recive_date = getattr(kill_request, 'recive_date', None)
date_str = shamsi_date(recive_date) if recive_date else ''
info = 'کد سفارش:{0} - وزن:{1} کیلوگرم - تاریخ تخصیص:{2}'.format(
order_code,
quantity,
date_str
)
bars_info.append(info)
except Exception:
continue
new_ticket = TicketSupport(
user=kill_house.kill_house_operator.user,
title="پیام سیستمی:یادآوری تخصیصات بدون بار",
status='open',
read_only=True,
type_ticket='single',
parent=None,
last_message='Admin',
)
new_ticket.save()
new_ticket.to_user.add(kill_house.kill_house_operator.user)
bars_details = "***".join([f"{i + 1}. {info}" for i, info in enumerate(bars_info)])
message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
'***' \
f'به استحضار می‌رساند مطابق سیستم‌مانیتورینگ سامانه، تخصیصات بدون بار به تعداد {to_locale_str(len_province_kill_request)} تخصیص و وزن {to_locale_str(int(wieght))} کیلوگرم فاقد تخصیص ماشین میباشد.' \
f'***' \
f' جزئیات تخصیصات بدون بار:' \
f'***' \
f'{bars_details}' \
f'***' \
f'لطفاً در اسرع وقت نسبت به تعیین تکلیف بارهای مربوطه در سامانه اقدام فرمایید.' \
f'***' \
f'با تشکر -ربات هوشمند سامانه رصدیار'
msg = MessageSupport(
ticket=new_ticket,
message=message,
created_by=user,
sender='Admin'
)
msg.save()
def update_chicken_age_from_login_manual(request):
poultry_hatching = PoultryHatching.objects.filter(trash=False).only('date', 'chicken_age', 'last_change').order_by(
'-id')
now = datetime.now().date()
for hatching in poultry_hatching:
now_age = (now - hatching.date.date()).days + 1
if hatching.archive == False and hatching.allow_hatching == 'pending':
hatching.chicken_age = now_age
hatching.save()
elif hatching.archive == True and hatching.allow_hatching == 'True':
if hatching.last_change:
date = datetime.strptime((hatching.last_change['date'].split(' ')[0]), '%Y-%m-%d').date()
age = (date - hatching.date.date()).days + 1
if age < 80:
hatching.chicken_age = (date - hatching.date.date()).days + 1
hatching.save()
else:
continue
if now_age <= 120:
hatching.now_age = now_age
hatching.save()
return HttpResponse('ok')
def fix_duplicate_order_code_cron():
duplicate_order_codes = (
PoultryRequest.objects
.values('order_code')
.annotate(count=Count('id'))
.filter(count__gt=1, trash=False)
.values_list('order_code', flat=True)
)
# استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری
poultry_ids = (
PoultryRequest.objects
.filter(order_code__in=duplicate_order_codes, trash=False)
.values_list('poultry__id', flat=True)
.distinct()
)
# مرتب‌سازی مرغ‌ها بر اساس شناسه
poultries = Poultry.objects.filter(trash=False, id__in=poultry_ids).order_by('id')
list1 = []
# بررسی درخواست‌های مرتبط با هر مرغ
for poultry in poultries:
requests = PoultryRequest.objects.filter(trash=False, poultry=poultry).order_by('order_code')
base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است
last_order = []
for req in requests:
if str(req.order_code)[:4] == base_order_code:
last_order.clear()
last_order.append(req.order_code)
# if str(req.order_code)[:4] != base_order_code:
# list1.append(req.id)
if last_order:
last_num = last_order[0] + 1
for req in requests:
if str(req.order_code)[:4] != base_order_code:
base_order_code = last_num
req.order_code = base_order_code
req.save()
last_num += 1
last_order.clear()
def fix_duplicate_order_code_new_cron():
duplicate_order_codes = (
PoultryRequest.objects
.values('order_code')
.annotate(count=Count('id'))
.filter(count__gt=1, trash=False)
.values_list('order_code', flat=True)
)
# استخراج شناسه‌های مرغ‌های مرتبط با کدهای تکراری
poultry_ids = (
PoultryRequest.objects
.filter(order_code__in=duplicate_order_codes, trash=False)
.values_list('poultry__user__id', flat=True)
.distinct()
)
# مرتب‌سازی مرغ‌ها بر اساس شناسه
poultries = SystemUserProfile.objects.filter(trash=False, id__in=poultry_ids).order_by('id')
list1 = []
for user in poultries:
print(user.id)
order_code = int(str(user.base_order) + '0001')
requests = PoultryRequest.objects.filter(trash=False, poultry__user=user).order_by('id')
for req in requests:
req.order_code = order_code
req.save()
order_code += 1
# # بررسی درخواست‌های مرتبط با هر مرغ
# for poultry in poultries:
# requests = PoultryRequest.objects.filter(trash=False,poultry=poultry).order_by('order_code')
# base_order_code = str(poultry.user.base_order) # فرض بر این است که "user" به درستی تعریف شده است
# last_order=[]
# for req in requests:
# if str(req.order_code)[:4] == base_order_code:
# last_order.clear()
# last_order.append(req.order_code)
# # if str(req.order_code)[:4] != base_order_code:
# # list1.append(req.id)
# if last_order:
# last_num=last_order[0] + 1
# for req in requests:
# if str(req.order_code)[:4] != base_order_code:
# base_order_code = last_num
# req.order_code=base_order_code
# req.save()
# last_num+=1
# last_order.clear()
# def fine_cron():
# now = datetime.now().date()
# province_kill_requests = ProvinceKillRequest.objects.filter(tarsh=False, return_to_province=False,
# kill_request__recive_date__date=now,
# state__in=('pending', 'accepted'),
# first_car_allocated_quantity=0).select_related(
# 'kill_request', 'province_request', 'province_request__poultry_request',
# 'province_request__poultry_request__hatching')
# for province_kill_request in province_kill_requests:
# poultry_request = province_kill_request.province_request.poultry_request
# hatching = province_kill_request.province_request.poultry_request.hatching
# province_check = province_kill_request.province_request
# province_check.quantity += province_kill_request.main_quantity
# province_check.save()
# poultry_request.remain_quantity += province_kill_request.main_quantity
# poultry_request.save()
# kill_request = KillRequest.objects.get(key=province_kill_request.kill_request.key)
# kill_request.remain_quantity += province_kill_request.main_quantity
# kill_request.save()
# if poultry_request.export == True:
# hatching.export_killed_weight -= int(int(request.data['quantity']) * poultry_request.Index_weight)
# hatching.export_killed_quantity -= int(request.data['quantity'])
# elif poultry_request.free_sale_in_province == True:
# hatching.free_killed_quantity -= province_kill_request.total_killed_weight
# # hatching.free_killed_quantity -= int(amount * poultry_request.Index_weight)
# hatching.free_quantity -= province_kill_request.total_killed_quantity
# # hatching.free_quantity -= amount
# else:
# hatching.governmental_killed_quantity -= province_kill_request.total_killed_weight
# hatching.governmental_quantity -= province_kill_request.total_killed_quantity
# hatching.save()
# province_kill_request.quantity = 0
# province_kill_request.total_killed_quantity = 0
# province_kill_request.total_killed_weight = 0
# province_kill_request.return_to_province = True
# province_kill_request.returner = {"fullname": user.fullname, "mobile": user.mobile,
# "date": str(datetime.now())}
# province_kill_request.save()
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
import requests
from concurrent.futures import ThreadPoolExecutor
class KillHouseStressTestView(APIView):
"""
اندپوینتی برای تست فشار (concurrent requests) روی KillHouseMarketInfoViewSet
"""
def get(self, request):
# آدرس ویوست اصلی (اینجا تغییر بده به آدرس واقعی خودت)
target_url = "http://127.0.0.1:8000/kill-house-market-info/?role=KillHouse"
headers = {
"Authorization": f"Bearer {request.auth}", # یا توکن ثابت بذار
}
def fetch(i):
try:
resp = requests.get(target_url, headers=headers, timeout=10)
return {"req": i, "status": resp.status_code, "len": len(resp.text)}
except Exception as e:
return {"req": i, "error": str(e)}
results = []
with ThreadPoolExecutor(max_workers=10) as executor: # چند تا ریکوست همزمان
futures = [executor.submit(fetch, i) for i in range(20)] # 20 بار
for f in futures:
results.append(f.result())
return Response(results, status=status.HTTP_200_OK)
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False)
province_kill_requests.update(warehouse=False)
kill_house_requests = KillHouseRequest.objects.filter(killhouse_user__in=kill_houses, trash=False)
kill_house_requests.update(warehouse=False)
steward_allocations = StewardAllocation.objects.filter(kill_house__in=kill_houses, trash=False)
steward_allocations.update(warehouse=False)
kill_house_free_bars = KillHouseFreeBarInformation.objects.filter(kill_house__in=kill_houses, trash=False)
kill_house_free_bars.update(warehouse=False)
kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house__in=kill_houses, trash=False)
kill_house_free_sale_bars.update(warehouse=False)
segmentations = PosSegmentation.objects.filter(kill_house__in=kill_houses, trash=False)
segmentations.update(warehouse=False)
archives = WarehouseArchive.objects.filter(trash=False, kill_house__in=kill_houses)
archives.update(warehouse=False)
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_input_province_bars_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first()
kill_house_requests_product_warehousing(product)
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_out_buying_bars_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first()
kill_house_free_buying_product_warehousing(product)
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_in_province_allocations_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first()
kill_house_allocations_product_warehousing(product)
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_free_sale_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first()
kill_house_free_sale_product_warehousing(product)
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_cold_house_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first()
cold_house_allocations = StewardAllocation.objects.filter(kill_house=kill_house, to_cold_house__isnull=False,
receiver_state='accepted', warehouse=True)
kill_house.total_cold_house_governmental_weight = \
cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
kill_house.total_cold_house_free_weight = \
cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
'total'] or 0
kill_house.save()
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_warehouse_segmentation_for_limitation(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(parent_product__name='مرغ گرم', kill_house=kill_house).first()
segmentations = PosSegmentation.objects.filter(kill_house=kill_house, trash=False, warehouse=True)
product.segmentation_weight = \
segmentations.aggregate(total=Sum('weight'))[
'total'] or 0
product.save()
kill_house.total_segmentation_governmental_weight = \
segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[
'total'] or 0
kill_house.total_segmentation_free_weight = segmentations.filter(quota='free').aggregate(total=Sum('weight'))[
'total'] or 0
kill_house.save()
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_kill_house_archive_warehousing(request):
kill_houses = KillHouse.objects.filter(trash=False, out_province=False)
for kill_house in kill_houses:
product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
archives = WarehouseArchive.objects.filter(kill_house=kill_house, trash=False, warehouse=True)
archives_info = archives.aggregate(
archives_weight=Sum('weight'),
archives_governmental_weight=Sum('weight',
filter=Q(quota='governmental')),
archives_free_weight=Sum('weight',
filter=Q(quota='free')),
)
archives_weight = archives_info['archives_weight'] or 0
archives_governmental_weight = archives_info['archives_governmental_weight'] or 0
archives_free_weight = archives_info['archives_free_weight'] or 0
product.ware_house_archive_weight = archives_weight
product.save()
kill_house.ware_house_archive_governmental_weight = archives_governmental_weight
kill_house.ware_house_archive_free_weight = archives_free_weight
kill_house.save()
return Response("ok")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_steward_free_buying_product_warehousing_for_limitation(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward)
guild_steward_free_buying_product_warehousing(product)
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_steward_guild_steward_allocations_warehousing_for_limitation(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward)
guild_steward_allocations_product_warehousing(product)
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_guild_steward_free_sale_warehousing_for_limitation(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward)
guild_steward_free_sale_product_warehousing(product)
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_guild_steward_product_segmentation_warehousing_for_limitation(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward)
guild_steward_product_segmentation(product)
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_steward_guild_pos_allocations_warehousing_for_limitation(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.get(parent_product__name='مرغ گرم', guild=steward)
product.pos_allocated_weight = 0
product.save()
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_guild_steward_archive_warehousing(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first()
archives = WarehouseArchive.objects.filter(Q(steward=steward) | Q(guild=steward), trash=False, warehouse=True)
archives_info = archives.aggregate(
archives_weight=Sum('weight'),
archives_governmental_weight=Sum('weight',
filter=Q(quota='governmental')),
archives_free_weight=Sum('weight',
filter=Q(quota='free')),
)
archives_weight = archives_info['archives_weight'] or 0
archives_governmental_weight = archives_info['archives_governmental_weight'] or 0
archives_free_weight = archives_info['archives_free_weight'] or 0
product.ware_house_archive_weight = archives_weight
product.save()
steward.ware_house_archive_governmental_weight = archives_governmental_weight
steward.ware_house_archive_free_weight = archives_free_weight
steward.save()
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_guild_steward_pos_allocation_weight_for_product(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
for steward in stewards:
product = RolesProducts.objects.filter(guild=steward, trash=False, name='مرغ گرم').first()
transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False,
warehouse=True)
product.pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0
product.save()
pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0
pos_governmental_allocated_weight = transactions.filter(price_approved=True).aggregate(total=Sum('cur_weight'))[
'total'] or 0
pos_free_allocated_weight = transactions.filter(price_approved=False).aggregate(total=Sum('cur_weight'))[
'total'] or 0
product.guild.pos_allocated_weight = int(pos_allocated_weight / 1000)
product.guild.pos_governmental_allocated_weight = int(pos_governmental_allocated_weight / 1000)
product.guild.pos_free_allocated_weight = int(pos_free_allocated_weight / 1000)
product.guild.save()
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_steward_warehouse_for_limitation(request):
2026-01-28 16:24:05 +03:30
stewards = Guilds.objects.filter(trash=False)
2026-01-18 11:45:53 +03:30
guild_steward_allocations = StewardAllocation.objects.filter(
Q(guilds__in=stewards) | Q(to_guilds__in=stewards) | Q(steward__in=stewards) | Q(to_steward__in=stewards),
trash=False, calculate_status=True, warehouse=True, steward_warehouse=True)
guild_steward_allocations.update(steward_warehouse=False)
guild_steward_free_buying_bars = StewardFreeBarInformation.objects.filter(
Q(guild__in=stewards) | Q(steward__in=stewards), trash=False, warehouse=True)
guild_steward_free_buying_bars.update(warehouse=False)
guild_steward_free_sale_bars = StewardFreeSaleBarInformation.objects.filter(
Q(guild__in=stewards) | Q(steward__in=stewards), trash=False, warehouse=True)
guild_steward_free_sale_bars.update(warehouse=False)
segmentations = PosSegmentation.objects.filter(guild__in=stewards, trash=False)
segmentations.update(warehouse=False)
archives = WarehouseArchive.objects.filter(trash=False, steward__in=stewards)
archives.update(warehouse=False)
transactions = PosMachineTransactions.objects.filter(pos__guild__in=stewards, paid=True, trash=False)
transactions.update(warehouse=False)
product_transactions = ProductsTransactions.objects.filter(transaction__pos__guild__in=stewards,
transaction__paid=True, trash=False)
product_transactions.update(warehouse=False)
return Response("done!")
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_time_error(request):
return Response(datetime.now())
@api_view(["GET"])
@csrf_exempt
@permission_classes([AllowAny])
def fix_pos_owner(request):
transactions = PosMachineTransactions.objects.filter(live_stock=False, trash=False)
for transaction in transactions:
if transaction.pos.kill_house:
transaction.kill_house = transaction.pos.kill_house
elif transaction.pos.guild:
transaction.guild = transaction.pos.guild
transaction.save()
return Response("done!")
2026-01-28 16:24:05 +03:30
def canceled_out_province_request_manual(request):
province_requests = PoultryRequest.objects.filter(state_process__in=('accepted', 'pending'),
province_state__in=('accepted', 'pending'), trash=False,
archive=False,
out_province_request_cancel=False, out=True, wage_pay=False,
has_wage=True)
data = {"date": str(datetime.now()), "role": "SuperAdmin", "mobile": "-",
"fullname": "کنسل شده توسط سیستم به دلیل عدم پرداخت"}
for province_request in province_requests:
if province_request.state_process == 'accepted' and province_request.province_state == 'accepted':
hatching = PoultryHatching.objects.get(key=province_request.hatching.key, trash=False)
hatching.out_province_killed_weight -= int(province_request.quantity * province_request.Index_weight)
hatching.out_province_killed_quantity -= province_request.quantity
hatching.save()
province_request.out_province_request_cancel = True
province_request.out_province_request_canceller = data
province_request.archive = True
province_request.state_process = 'rejected'
province_request.province_state = 'rejected'
province_request.save()
message = f'بار خارج از استان به شماره {province_request.order_code} به علت عدم پرداخت کنسل شد.' \
f'\n' \
f'(سامانه رصدیار)'
req = send_sms_request(
f"http://webservice.sahandsms.com/newsmswebservice.asmx/SendPostUrl?username={USERNAME_SMS_FINANCIAL}&password={PASSWORD_SMS_FINANCIAL}&from=30002501&to={UNION_NUMBER}&message={message}")
return HttpResponse('ok')