723 lines
38 KiB
Python
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)
|
|
|
|
|