Files
Rasadyar_RSI/app/models.py
2026-02-03 11:31:31 +03:30

723 lines
38 KiB
Python

import datetime
import re
from datetime import timedelta
from itertools import product
from app.cityandprovince import search_province_list, correct_province, search_city_list, correct_city, normalize_text
from app.helper_excel import correction_dict
from authentication.models import BaseModel
from django.db import models
from helpers import convert_to_miladi
class Poultry(BaseModel):
UserName = models.CharField(max_length=200, null=True)
Password = models.CharField(max_length=200, null=True)
FirstName = models.CharField(max_length=200, null=True)
LastName = models.CharField(max_length=200, null=True)
UserGroupName = models.CharField(max_length=200, null=True)
UserRoleName = models.CharField(max_length=200, null=True)
UserGroupId = models.CharField(max_length=200, null=True)
UserRoleId = models.CharField(max_length=200, null=True)
Mobile = models.CharField(max_length=200, null=True)
Email = models.CharField(max_length=200, null=True)
UserIsActive = models.BooleanField(null=True)
UserIsActiveDescription = models.CharField(max_length=200, null=True)
RegDate = models.CharField(max_length=200, null=True)
RegDateShamsi = models.CharField(max_length=200, null=True)
RegDateShamsiWithTime = models.CharField(max_length=200, null=True)
RegDateShamsiOnlyTime = models.CharField(max_length=200, null=True)
StringId = models.CharField(max_length=200, null=True)
IsPersisted = models.BooleanField(null=True)
AllowInsert = models.BooleanField(null=True)
AllowUpdate = models.BooleanField(null=True)
ModalCss = models.CharField(max_length=200, null=True)
GridContainerParametersModel = models.CharField(max_length=200, null=True)
MenuUserAccess = models.CharField(max_length=200, null=True)
MenuUserAccessId = models.CharField(max_length=200, null=True)
LogTableName = models.CharField(max_length=200, null=True)
LogTableAlias = models.CharField(max_length=200, null=True)
PageTitle = models.CharField(max_length=200, null=True)
UnitName = models.CharField(max_length=200, null=True)
SystemCode = models.CharField(max_length=200, null=True)
TrackingCode = models.CharField(max_length=200, null=True)
EpidemiologicCode = models.CharField(max_length=200, null=True)
PartIdCode = models.CharField(max_length=200, null=True)
PostalCode = models.CharField(max_length=200, null=True)
UnitId = models.CharField(max_length=200, null=True)
UnitTypeId = models.CharField(max_length=200, null=True)
UnitTypeName = models.CharField(max_length=200, null=True)
LocationIdProvince = models.CharField(max_length=200, null=True)
LocationIdCity = models.CharField(max_length=200, null=True)
LocationNameProvince = models.CharField(max_length=200, null=True)
LocationNameCity = models.CharField(max_length=200, null=True)
UnitIsActive = models.BooleanField(null=True)
UnitIsActiveDescription = models.CharField(max_length=200, null=True)
PId = models.CharField(max_length=200, null=True)
Province = models.CharField(max_length=500, null=True, blank=True)
City = models.CharField(max_length=500, null=True, blank=True)
def save(self, *args, **kwargs):
super(Poultry, self).save(*args, **kwargs)
class PoultryHatching(BaseModel):
poultry = models.ForeignKey(
Poultry,
on_delete=models.CASCADE,
related_name="hatching_poultry",
null=True
)
DesCertId = models.CharField(max_length=200, null=True)
UnitId = models.CharField(max_length=200, null=True)
BroilerFlockRequestId = models.IntegerField(null=True)
RequestCode = models.CharField(max_length=200, null=True)
StartDate = models.CharField(max_length=200, null=True)
StartDatePersian = models.CharField(max_length=200, null=True)
EndDate = models.CharField(max_length=200, null=True)
EndDatePersian = models.CharField(max_length=200, null=True)
HatchingDate = models.CharField(max_length=200, null=True)
HatchingDatePersian = models.CharField(max_length=200, null=True)
Date = models.DateTimeField(null=True)
HatchingAge = models.IntegerField(default=1)
MaxHatchingDate = models.CharField(max_length=200, null=True)
MaxHatchingDatePersian = models.CharField(max_length=200, null=True)
HatchingCount = models.IntegerField(null=True)
HatchingCountInBargiri = models.IntegerField(null=True)
HatchingCountInTakhlie = models.IntegerField(null=True)
TrackingCount = models.IntegerField(null=True)
TrackingBargiriCount = models.IntegerField(null=True)
PercentHamlToMojavez = models.IntegerField(null=True)
PercentTakhlieToBargiri = models.IntegerField(null=True)
FlockAgeDay = models.IntegerField(null=True)
PartIdCode = models.CharField(max_length=200, null=True)
UnitName = models.CharField(max_length=200, null=True)
PostalCode = models.CharField(max_length=200, null=True)
EpidemiologicCode = models.CharField(max_length=200, null=True)
CapacityFemale = models.IntegerField(null=True)
PersonFullName = models.CharField(max_length=200, null=True)
LocationIdProvince = models.CharField(max_length=200, null=True)
LocationNameProvince = models.CharField(max_length=200, null=True)
LocationIdCity = models.CharField(max_length=200, null=True)
LocationNameCity = models.CharField(max_length=200, null=True)
Mobile = models.CharField(max_length=200, null=True)
HamlMorghMinDate = models.CharField(max_length=200, null=True)
HamlMorghTotalCount = models.IntegerField(null=True)
HamlMorghTakhlieCount = models.IntegerField(null=True)
EvacuationCount = models.IntegerField(null=True)
EvacuationCount_1 = models.IntegerField(null=True)
EvacuationCount_2 = models.IntegerField(null=True)
EvacuationCount_3 = models.IntegerField(null=True)
BaseHatchingCount = models.IntegerField(null=True)
PercentMorghToJoojeTotal = models.IntegerField(null=True)
PercentMorghToJoojeTakhlie = models.IntegerField(null=True)
PercentMorghToJoojeTakhlieWithEvacutaion = models.IntegerField(null=True)
PercentNotDeliverd = models.IntegerField(null=True)
PercentDeliveredForSP = models.IntegerField(null=True)
PercentDeliveredForSPNoExclude = models.IntegerField(null=True)
PercentDeliveredWithoutEvac = models.IntegerField(null=True)
DiffHamlThanTakhlieCount = models.IntegerField(null=True)
DiffTakhlieThanHamlCount = models.IntegerField(null=True)
PedigreeName = models.CharField(max_length=200, null=True)
LeftOver = models.IntegerField(null=True)
def save(self, *args, **kwargs):
if hasattr(self, 'PedigreeName') and self.PedigreeName in correction_dict:
self.PedigreeName = correction_dict[self.PedigreeName]
self.LeftOver = self.HatchingCount - self.EvacuationCount
hatching_date = self.HatchingDatePersian.split('/')
date = convert_to_miladi(
year=int(hatching_date[0]),
month=int(hatching_date[1]),
day=int(hatching_date[2])
)
self.Date = date
super(PoultryHatching, self).save(*args, **kwargs)
class Hatching(BaseModel):
poultry = models.ForeignKey(
Poultry,
on_delete=models.CASCADE,
related_name="poultry_hatching_poultry",
null=True
)
Date = models.DateTimeField(null=True)
ArchiveDate = models.DateTimeField(null=True)
BroilerFlockRequestId = models.IntegerField(null=True, blank=True)
InsertDate = models.CharField(max_length=200, null=True, blank=True)
LastChangeStatusDate = models.CharField(max_length=200, null=True, blank=True)
LastChangeStatusDateShamsi = models.CharField(max_length=200, null=True, blank=True)
FlockRequestUnitName = models.CharField(max_length=200, null=True, blank=True)
PedigreeName = models.CharField(max_length=200, null=True, blank=True)
StatusId = models.IntegerField(null=True, blank=True)
Status = models.IntegerField(null=True, blank=True)
StatusName = models.CharField(max_length=200, null=True, blank=True)
PedigreeType = models.IntegerField(null=True, blank=True)
BroilerPedigreeTypeName = models.CharField(max_length=200, null=True, blank=True)
StatusColor = models.CharField(max_length=200, null=True, blank=True)
SystemRevocationDate = models.CharField(max_length=200, null=True, blank=True)
RemindDays = models.IntegerField(null=True, blank=True)
PartyCount = models.IntegerField(null=True, blank=True)
GoodCount = models.IntegerField(null=True, blank=True)
ShowButtons = models.BooleanField(null=True, blank=True)
HasSync = models.BooleanField(null=True, blank=True)
BroilerFlockRequestExpireStatus = models.IntegerField(null=True, blank=True)
IdWithFormat = models.CharField(max_length=200, null=True, blank=True)
ProvinceName = models.CharField(max_length=200, null=True, blank=True)
CityName = models.CharField(max_length=200, null=True, blank=True)
Address = models.CharField(max_length=200, null=True, blank=True)
UnitTel = models.CharField(max_length=200, null=True, blank=True)
UnitPostalCode = models.CharField(max_length=200, null=True, blank=True)
UnitName = models.CharField(max_length=200, null=True, blank=True)
SystemCode = models.CharField(max_length=200, null=True, blank=True)
CapacityFemale = models.IntegerField(null=True, blank=True)
EpidemiologicCode = models.CharField(max_length=200, null=True, blank=True)
RequestCode = models.CharField(max_length=200, null=True, blank=True)
RequestDate = models.CharField(max_length=200, null=True, blank=True)
RequestDateFa = models.CharField(max_length=200, null=True, blank=True)
RequestCount = models.IntegerField(null=True, blank=True)
DeliverDate = models.CharField(max_length=200, null=True, blank=True)
DeliverDateFa = models.CharField(max_length=200, null=True, blank=True)
UnionName = models.CharField(max_length=200, null=True, blank=True)
PersonTypeId = models.IntegerField(null=True, blank=True)
PersonType = models.IntegerField(null=True, blank=True)
PersonTypeName = models.CharField(max_length=200, null=True, blank=True)
PersonFullName = models.CharField(max_length=200, null=True, blank=True)
NationalCode = models.CharField(max_length=200, null=True, blank=True)
InteractType = models.IntegerField(null=True, blank=True)
InteractTypeName = models.CharField(max_length=200, null=True, blank=True)
UnionTypeId = models.IntegerField(null=True, blank=True)
UnionTypeName = models.CharField(max_length=200, null=True, blank=True)
SendDate = models.CharField(max_length=200, null=True, blank=True)
SendDateFa = models.CharField(max_length=200, null=True, blank=True)
ChickCountSum = models.IntegerField(null=True, blank=True)
CalculatedDate = models.CharField(max_length=200, null=True, blank=True)
CalculatedDateFa = models.CharField(max_length=200, null=True, blank=True)
PartIdCode = models.CharField(max_length=200, null=True, blank=True)
CertId = models.CharField(max_length=200, null=True, blank=True)
StartDate = models.CharField(max_length=200, null=True, blank=True)
StartDateFa = models.CharField(max_length=200, null=True, blank=True)
EndDate = models.CharField(max_length=200, null=True, blank=True)
EndDateFa = models.CharField(max_length=200, null=True, blank=True)
RemainCredit = models.IntegerField(null=True, blank=True)
StrRemainCredit = models.CharField(max_length=200, null=True, blank=True)
ShowStatus = models.CharField(max_length=200, null=True, blank=True)
ValidStatus = models.CharField(max_length=200, null=True, blank=True)
ValidStatusName = models.CharField(max_length=200, null=True, blank=True)
RegDate = models.CharField(max_length=200, null=True, blank=True)
RegDateShamsi = models.CharField(max_length=200, null=True, blank=True)
RegDateShamsiWithTime = models.CharField(max_length=200, null=True, blank=True)
RegDateShamsiOnlyTime = models.CharField(max_length=200, null=True, blank=True)
HatchingId = models.CharField(max_length=200, null=True, blank=True)
StringId = models.CharField(max_length=200, null=True, blank=True)
IsPersisted = models.BooleanField(null=True, blank=True)
AllowInsert = models.BooleanField(null=True, blank=True)
AllowUpdate = models.BooleanField(null=True, blank=True)
ModalCss = models.CharField(max_length=200, null=True, blank=True)
GridContainerParametersModel = models.CharField(max_length=200, null=True, blank=True)
MenuUserAccess = models.CharField(max_length=200, null=True, blank=True)
MenuUserAccessId = models.IntegerField(null=True, blank=True)
LogTableName = models.CharField(max_length=200, null=True, blank=True)
LogTableAlias = models.CharField(max_length=200, null=True, blank=True)
PageTitle = models.CharField(max_length=200, null=True, blank=True)
Evacuation = models.IntegerField(default=0)
Age = models.IntegerField(null=True)
KillingAve = models.IntegerField(default=0)
Period = models.IntegerField(default=1)
LeftOver = models.IntegerField(null=True)
samasat_discharge_percentage = models.IntegerField(default=0)
GoodSum = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if hasattr(self, 'PedigreeName') and self.PedigreeName in correction_dict:
self.PedigreeName = correction_dict[self.PedigreeName]
if AllProductsTransport.objects.filter(hatching__id=self.id, trash=False, product='جوجه یک روزه گوشتی').exists():
date1 = AllProductsTransport.objects.filter(hatching__id=self.id, trash=False, product='جوجه یک روزه گوشتی').order_by('date').first()
if date1:
date = datetime.datetime(year=date1.date.year, month=date1.date.month, day=date1.date.day, hour=10,
minute=1,
second=1)
self.Date = date
else:
hatching_date = self.SendDateFa.split('/')
date = convert_to_miladi(
year=int(hatching_date[0]),
month=int(hatching_date[1]),
day=int(hatching_date[2])
)
self.Date = date
self.Age = (datetime.datetime.now().date() - self.Date.date()).days + 1
if self.ProvinceName and self.ProvinceName not in search_province_list:
self.ProvinceName = correct_province(self.ProvinceName)
if self.CityName and self.CityName not in search_city_list:
self.CityName = correct_city(self.CityName, self.ProvinceName)
self.ChickCountSum = self.GoodSum
super(Hatching, self).save(*args, **kwargs)
class TransportingDetail(BaseModel):
hatching = models.ForeignKey(
Hatching,
on_delete=models.CASCADE,
related_name="transport_hatching",
null=True
)
BroilerFlockRequestId = models.IntegerField(null=True, blank=True)
TrackingCode = models.CharField(max_length=200, null=True)
DesCertId = models.CharField(max_length=200, null=True)
IssueDate = models.CharField(max_length=200, null=True)
IssueDatePersian = models.CharField(max_length=200, null=True)
GoodCode = models.IntegerField(null=True)
GoodName = models.CharField(max_length=200, null=True)
GoodAmount = models.IntegerField(null=True)
TrackingStatus = models.IntegerField(null=True)
TrackingStatusDescription = models.CharField(max_length=200, null=True)
TakhlieDate = models.CharField(max_length=200, null=True)
TakhlieDatePersian = models.CharField(max_length=200, null=True)
SourcePartIdCode = models.CharField(max_length=200, null=True)
SourceUnitPartIdCode = models.CharField(max_length=200, null=True)
SourceUnitName = models.CharField(max_length=200, null=True)
SourceCertId = models.CharField(max_length=200, null=True)
ResideDate = models.CharField(max_length=200, null=True)
ResideDatePersian = models.CharField(max_length=200, null=True)
PedigreeName = models.CharField(max_length=200, null=True)
DesUnitName = models.CharField(max_length=200, null=True)
DesPartIdCode = models.CharField(max_length=200, null=True)
HealthPermitId = models.IntegerField(null=True)
Province = models.CharField(max_length=200, null=True)
City = models.CharField(max_length=200, null=True)
Age = models.IntegerField(null=True)
Date = models.DateTimeField(null=True)
Out = models.BooleanField(default=False)
def save(self, *args, **kwargs):
issue = self.IssueDatePersian.split('/')
date = convert_to_miladi(
year=int(issue[0]),
month=int(issue[1]),
day=int(issue[2])
)
self.Date = date
kill_house = KillHouse.objects.filter(PartIdCode=self.DesPartIdCode, trash=False).first()
if kill_house:
self.Province = kill_house.Province
self.City = kill_house.City
if self.Province and self.Province not in search_province_list:
self.Province = correct_province(self.Province)
if self.City and self.City not in search_city_list:
self.City = correct_city(self.City, self.Province)
super(TransportingDetail, self).save(*args, **kwargs)
class TransportingChickenDetail(BaseModel):
hatching = models.ForeignKey(
PoultryHatching,
on_delete=models.CASCADE,
related_name="transporting_hatching",
null=True
)
TrackingCode = models.CharField(max_length=200, null=True)
DesCertId = models.CharField(max_length=200, null=True)
IssueDate = models.CharField(max_length=200, null=True)
IssueDatePersian = models.CharField(max_length=200, null=True)
issue_date = models.DateTimeField(null=True)
GoodCode = models.IntegerField(null=True)
GoodName = models.CharField(max_length=200, null=True)
GoodAmount = models.IntegerField(null=True)
TrackingStatus = models.IntegerField(null=True)
TrackingStatusDescription = models.CharField(max_length=200, null=True)
TakhlieDate = models.CharField(max_length=200, null=True)
TakhlieDatePersian = models.CharField(max_length=200, null=True)
SourcePartIdCode = models.CharField(max_length=200, null=True)
SourceUnitName = models.CharField(max_length=200, null=True)
SourceCertId = models.CharField(max_length=200, null=True)
ParentPartIdCode = models.CharField(max_length=200, null=True)
ParentUnitName = models.CharField(max_length=200, null=True)
CertId = models.CharField(max_length=200, null=True)
ResideDate = models.CharField(max_length=200, null=True)
ResideDatePersian = models.CharField(max_length=200, null=True)
reside_date = models.DateTimeField(null=True)
PedigreeName = models.CharField(max_length=200, null=True)
BroilerFlockRequestId = models.IntegerField(null=True)
SourceUnitPartIdCode = models.CharField(max_length=200, null=True)
DesUnitName = models.CharField(max_length=200, null=True)
DesPartIdCode = models.CharField(max_length=200, null=True)
HealthPermitId = models.IntegerField(null=True)
ProvinceId = models.CharField(max_length=200, null=True)
Province = models.CharField(max_length=200, null=True)
age = models.IntegerField(default=1)
def save(self, *args, **kwargs):
Issue = self.IssueDatePersian.split('/')
date = convert_to_miladi(
year=int(Issue[0]),
month=int(Issue[1]),
day=int(Issue[2])
)
self.issue_date = date
Reside = self.ResideDatePersian.split('/')
date = convert_to_miladi(
year=int(Reside[0]),
month=int(Reside[1]),
day=int(Reside[2])
)
self.reside_date = date
if self.hatching:
self.age = (self.issue_date.date() - self.hatching.Date.date()).days + 1
super(TransportingChickenDetail, self).save(*args, **kwargs)
class KillHouse(BaseModel):
PartIdCode = models.CharField(max_length=250, null=True, blank=True)
UnitName = models.CharField(max_length=250, null=True, blank=True)
Province = models.CharField(max_length=250, null=True, blank=True)
City = models.CharField(max_length=250, null=True, blank=True)
ProvinceId = models.CharField(max_length=200, null=True, blank=True)
CityId = models.CharField(max_length=200, null=True, blank=True)
def save(self, *args, **kwargs):
super(KillHouse, self).save(*args, **kwargs)
class ApkInfo(BaseModel):
info = models.JSONField(null=True)
download_link = models.CharField(max_length=700, null=True, blank=True)
def save(self, *args, **kwargs):
super(ApkInfo, self).save(*args, **kwargs)
class TransportCarcassDetail(BaseModel): # بارهای لاشه
id_quarantineh = models.CharField(max_length=255, null=True, blank=True) # id
destination_prev = models.CharField(max_length=255, null=True, blank=True) # مقصد قبلی
destination_changed = models.CharField(max_length=255, null=True, blank=True) # تغییر مقصد
payment = models.CharField(max_length=255, null=True, blank=True) # پرداخت
tracking = models.CharField(max_length=255, null=True, blank=True, unique=True) # رهگیری
date = models.DateField(null=True, blank=True) # تاریخ
time = models.TimeField(null=True, blank=True) # ساعت
product = models.CharField(max_length=255, null=True, blank=True) # محصول
items = models.CharField(max_length=255, null=True, blank=True) # اقلام
quantity = models.FloatField(null=True, blank=True) # مقدار
unit = models.CharField(max_length=50, null=True, blank=True) # واحد
origin_province = models.CharField(max_length=255, null=True, blank=True) # استان مبدا
origin_city = models.CharField(max_length=255, null=True, blank=True) # شهرستان مبدا
origin = models.CharField(max_length=255, null=True, blank=True) # مبدا
destination_province = models.CharField(max_length=255, null=True, blank=True) # استان مقصد
destination_city = models.CharField(max_length=255, null=True, blank=True) # شهرستان مقصد
destination = models.CharField(max_length=255, null=True, blank=True) # مقصد
jihadi_origin = models.CharField(max_length=255, null=True, blank=True) # ش جهادی مبدا
jihadi_destination = models.CharField(max_length=255, null=True, blank=True) # ش جهادی مقصد
owner = models.CharField(max_length=255, null=True, blank=True) # مالک
car_tracking_code = models.CharField(max_length=255, null=True, blank=True) # کد رهگیری خودرو
driver_name = models.CharField(max_length=255, null=True, blank=True) # نام راننده
plate = models.CharField(max_length=50, null=True, blank=True) # پلاک
amount = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True) # مبلغ
unloading = models.CharField(max_length=255, null=True, blank=True) # تخلیه
gross_weight = models.FloatField(null=True, blank=True) # وزن پر
tare_weight = models.FloatField(null=True, blank=True) # وزن خالی
net_weight = models.FloatField(null=True, blank=True) # وزن
scale_code = models.CharField(max_length=255, null=True, blank=True) # کد باسکول
scale_name = models.CharField(max_length=255, null=True, blank=True) # نام باسکول
scale_receipt = models.CharField(max_length=255, null=True, blank=True) # قبض باسکول
unloading_date = models.DateField(null=True, blank=True) # تاریخ تخلیه
out = models.BooleanField(default=False) # Out (True/False)
product_date = models.DateField(null=True, blank=True) # تاریخ
has_product_date = models.BooleanField(default=False) # دارای تاریخ
def save(self, *args, **kwargs):
if self.origin_province:
self.origin_province = normalize_text(correct_province(self.origin_province))
if self.origin_city:
self.origin_city = normalize_text(correct_city(self.origin_city, self.origin_province))
if self.destination_province:
self.destination_province = normalize_text(correct_province(self.destination_province))
if self.destination_city:
self.destination_city = normalize_text(correct_city(self.destination_city, self.destination_province))
if isinstance(self.product_date, str):
try:
self.product_date = datetime.datetime.strptime(self.product_date, '%Y-%m-%d').date()
except ValueError:
try:
self.product_date = datetime.datetime.strptime(self.product_date, '%Y/%m/%d').date()
except ValueError:
self.product_date = None
super(TransportCarcassDetail, self).save(*args, **kwargs)
class Guilds(BaseModel):
name = models.CharField(max_length=255, null=True, blank=True)
city = models.CharField(max_length=255, null=True, blank=True)
province = models.CharField(max_length=255, null=True, blank=True)
jihadi_code = models.CharField(max_length=255, null=True, blank=True)
is_steward = models.BooleanField(default=False)
def save(self, *args, **kwargs):
if self.province:
self.province = normalize_text(correct_province(self.province))
if self.city:
self.city = normalize_text(correct_city(self.city, self.province))
super(Guilds, self).save(*args, **kwargs)
class Driver(BaseModel):
car_id = models.CharField(max_length=255, null=True, blank=True)
driver_name = models.CharField(max_length=255, null=True, blank=True)
owner_name = models.CharField(max_length=255, null=True, blank=True)
city = models.CharField(max_length=255, null=True, blank=True)
province = models.CharField(max_length=255, null=True, blank=True)
pelak = models.CharField(max_length=255, null=True, blank=True)
tracking_code = models.CharField(max_length=255, null=True, blank=True)
weight = models.IntegerField(null=True, blank=True)
car_type = models.CharField(max_length=255, null=True, blank=True)
expire_licence_date = models.DateField(null=True, blank=True)
health_permit = models.CharField(max_length=255, null=True, blank=True)
product = models.CharField(max_length=255, null=True, blank=True)
part_id_code = models.CharField(max_length=255, null=True, blank=True)
kill_house_name = models.CharField(max_length=255, null=True, blank=True)
def save(self, *args, **kwargs):
if self.province:
self.province = normalize_text(correct_province(self.province))
if self.city:
self.city = normalize_text(correct_city(self.city, self.province))
super(Driver, self).save(*args, **kwargs)
class InquiryCredentials(BaseModel):
data = models.JSONField(null=True, blank=True)
numbers = models.JSONField(null=True, blank=True)
def save(self, *args, **kwargs):
super(InquiryCredentials, self).save(*args, **kwargs)
class EvacuationDetail(BaseModel): # گزارشات تلفات جوجه ریزی
hatching = models.ForeignKey(
Hatching,
on_delete=models.CASCADE,
related_name="evacuation_details",
null=True,
blank=True
)
PartIdCode = models.CharField(max_length=200, null=True, blank=True)
RequestId = models.CharField(max_length=200, null=True, blank=True)
MoReportId = models.CharField(max_length=200, null=True, blank=True)
ReportType = models.IntegerField(null=True, blank=True)
ReportTypeString = models.CharField(max_length=255, null=True, blank=True)
ReportDate = models.CharField(max_length=200, null=True, blank=True)
ReportDateShamsi = models.CharField(max_length=200, null=True, blank=True)
MoReason = models.TextField(null=True, blank=True)
MoDate = models.CharField(max_length=200, null=True, blank=True)
MoDateShamsi = models.CharField(max_length=200, null=True, blank=True)
MoStartDay = models.IntegerField(null=True, blank=True)
MoEndDay = models.IntegerField(null=True, blank=True)
MoReportSubId = models.CharField(max_length=200, null=True, blank=True)
ReportStatus = models.IntegerField(null=True, blank=True)
GoodCount = models.IntegerField(null=True, blank=True)
Message = models.TextField(null=True, blank=True)
ErrorCode = models.IntegerField(null=True, blank=True)
IsDeleted = models.BooleanField(default=False)
RegDate = models.CharField(max_length=200, null=True, blank=True)
RegDateShamsi = models.CharField(max_length=200, null=True, blank=True)
RegDateShamsiWithTime = models.CharField(max_length=200, null=True, blank=True)
RegDateShamsiOnlyTime = models.CharField(max_length=200, null=True, blank=True)
ExternalId = models.CharField(max_length=200, null=True, blank=True)
StringId = models.CharField(max_length=200, null=True, blank=True)
IsPersisted = models.BooleanField(default=False)
AllowInsert = models.BooleanField(default=False)
AllowUpdate = models.BooleanField(default=False)
ModalCss = models.CharField(max_length=255, null=True, blank=True)
GridContainerParametersModel = models.CharField(max_length=255, null=True, blank=True)
MenuUserAccess = models.CharField(max_length=255, null=True, blank=True)
MenuUserAccessId = models.IntegerField(null=True, blank=True)
LogTableName = models.CharField(max_length=255, null=True, blank=True)
LogTableAlias = models.CharField(max_length=255, null=True, blank=True)
PageTitle = models.CharField(max_length=255, null=True, blank=True)
def save(self, *args, **kwargs):
def parse_dotnet_date(dotnet_string):
if not dotnet_string:
return None
try:
match = re.search(r'/Date\((\d+)\)/', str(dotnet_string))
if match:
milliseconds = int(match.group(1))
return datetime.datetime.utcfromtimestamp(milliseconds / 1000)
except (ValueError, TypeError):
pass
return None
def parse_shamsi_date(shamsi_string):
if not shamsi_string:
return None
try:
parts = str(shamsi_string).split('/')
if len(parts) == 3:
year, month, day = map(int, parts)
return convert_to_miladi(year=year, month=month, day=day)
except (ValueError, TypeError):
pass
return None
def parse_shamsi_with_time(value):
if not value:
return None
try:
text = str(value)
if '(' in text and ')' in text:
date_part, time_part = text.split('(')
date_part = date_part.strip()
time_part = time_part.replace(')', '').strip()
base_date = parse_shamsi_date(date_part)
if base_date:
hour, minute, second = map(int, time_part.split(':'))
return datetime.datetime(
year=base_date.year,
month=base_date.month,
day=base_date.day,
hour=hour,
minute=minute,
second=second
)
except (ValueError, TypeError):
pass
return None
def parse_time_only(value):
if not value:
return None
try:
hour, minute, second = map(int, value.split(':'))
return datetime.time(hour=hour, minute=minute, second=second)
except (ValueError, TypeError):
pass
return None
dotnet_report = parse_dotnet_date(self.ReportDate)
if dotnet_report:
self.ReportDate = dotnet_report.strftime('%Y-%m-%d %H:%M:%S')
dotnet_mo = parse_dotnet_date(self.MoDate)
if dotnet_mo:
self.MoDate = dotnet_mo.strftime('%Y-%m-%d %H:%M:%S')
dotnet_reg = parse_dotnet_date(self.RegDate)
if dotnet_reg:
self.RegDate = dotnet_reg.strftime('%Y-%m-%d %H:%M:%S')
shamsi_report = parse_shamsi_date(self.ReportDateShamsi)
if shamsi_report:
self.ReportDateShamsi = shamsi_report.strftime('%Y-%m-%d')
shamsi_mo = parse_shamsi_date(self.MoDateShamsi)
if shamsi_mo:
self.MoDateShamsi = shamsi_mo.strftime('%Y-%m-%d')
shamsi_reg = parse_shamsi_date(self.RegDateShamsi)
if shamsi_reg:
self.RegDateShamsi = shamsi_reg.strftime('%Y-%m-%d')
shamsi_with_time = parse_shamsi_with_time(self.RegDateShamsiWithTime)
if shamsi_with_time:
self.RegDateShamsiWithTime = shamsi_with_time.strftime('%Y-%m-%d %H:%M:%S')
time_only = parse_time_only(self.RegDateShamsiOnlyTime)
if time_only:
self.RegDateShamsiOnlyTime = time_only.strftime('%H:%M:%S')
super(EvacuationDetail, self).save(*args, **kwargs)
class AllProductsTransport(BaseModel): # بارهای تمامی محصولات
hatching = models.ForeignKey(
Hatching,
on_delete=models.SET_NULL,
related_name="all_products_transports",
null=True,
blank=True
)
record_id = models.CharField(max_length=255, null=True, blank=True) # id (نام تغییر یافته)
destination_prev = models.CharField(max_length=255, null=True, blank=True) # مقصد قبلی
destination_changed = models.CharField(max_length=255, null=True, blank=True) # تغییر مقصد
tracking = models.CharField(max_length=255, null=True, blank=True, unique=True) # کد رهگیری
date = models.DateField(null=True, blank=True) # تاریخ
product = models.CharField(max_length=255, null=True, blank=True) # محصول
items = models.CharField(max_length=255, null=True, blank=True) # اقلام
quantity = models.FloatField(null=True, blank=True) # مقدار
unit = models.CharField(max_length=50, null=True, blank=True) # واحد
origin_province = models.CharField(max_length=255, null=True, blank=True) # استان مبدا
origin_city = models.CharField(max_length=255, null=True, blank=True) # شهرستان مبدا
origin = models.CharField(max_length=255, null=True, blank=True) # مبدا
destination_province = models.CharField(max_length=255, null=True, blank=True) # استان مقصد
destination_city = models.CharField(max_length=255, null=True, blank=True) # شهرستان مقصد
destination = models.CharField(max_length=255, null=True, blank=True) # مقصد
jihadi_origin = models.CharField(max_length=255, null=True, blank=True) # ش جهادی مبدا
jihadi_destination = models.CharField(max_length=255, null=True, blank=True) # ش جهادی مقصد
owner = models.CharField(max_length=255, null=True, blank=True) # مالک
car_tracking_code = models.CharField(max_length=255, null=True, blank=True) # کد رهگیری خودرو
driver_name = models.CharField(max_length=255, null=True, blank=True) # نام راننده
gross_weight = models.FloatField(null=True, blank=True) # وزن پر
tare_weight = models.FloatField(null=True, blank=True) # وزن خالی
net_weight = models.FloatField(null=True, blank=True) # وزن
scale_code = models.CharField(max_length=255, null=True, blank=True) # کد باسکول
scale_name = models.CharField(max_length=255, null=True, blank=True) # نام باسکول
scale_receipt = models.CharField(max_length=255, null=True, blank=True) # قبض باسکول
unloading_date = models.DateField(null=True, blank=True) # تاریخ تخلیه
unloading = models.CharField(max_length=255, null=True, blank=True) # تخلیه
out = models.BooleanField(default=False) # Out (True/False)
def save(self, *args, **kwargs):
# تصحیح استان/شهر مبدا
if self.origin_province:
self.origin_province = normalize_text(correct_province(self.origin_province))
if self.origin_city:
self.origin_city = normalize_text(correct_city(self.origin_city, self.origin_province))
# تصحیح استان/شهر مقصد
if self.destination_province:
self.destination_province = normalize_text(correct_province(self.destination_province))
if self.destination_city:
self.destination_city = normalize_text(correct_city(self.destination_city, self.destination_province))
# تنظیم out بر اساس تفاوت استان مبدا و مقصد
if self.origin_province and self.destination_province:
if self.origin_province != self.destination_province:
self.out = True
else:
self.out = False
# تبدیل تاریخ‌ها از string به date در صورت نیاز
if isinstance(self.date, str):
try:
self.date = datetime.datetime.strptime(self.date, '%Y-%m-%d').date()
except ValueError:
try:
self.date = datetime.datetime.strptime(self.date, '%Y/%m/%d').date()
except ValueError:
self.date = None
if isinstance(self.unloading_date, str):
try:
self.unloading_date = datetime.datetime.strptime(self.unloading_date, '%Y-%m-%d').date()
except ValueError:
try:
self.unloading_date = datetime.datetime.strptime(self.unloading_date, '%Y/%m/%d').date()
except ValueError:
self.unloading_date = None
super(AllProductsTransport, self).save(*args, **kwargs)
class RasadyarAppInfo(BaseModel):
info = models.JSONField(null=True, blank=True)
file = models.CharField(max_length=700, null=True, blank=True)
def save(self, *args, **kwargs):
super(RasadyarAppInfo, self).save(*args, **kwargs)