4489 lines
208 KiB
Python
4489 lines
208 KiB
Python
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()
|
||
|
||
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')
|
||
|
||
|
||
@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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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):
|
||
stewards = Guilds.objects.filter(trash=False)
|
||
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!")
|
||
|
||
|
||
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')
|