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