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)