from django.contrib.auth.models import ( AbstractUser ) from django.db import models from apps.core.models import BaseModel class User(BaseModel, AbstractUser): mobile = models.CharField(max_length=18, null=True) phone = models.CharField(max_length=18, null=True) national_code = models.CharField(max_length=16, null=True) birthdate = models.DateTimeField(null=True) nationality = models.CharField(max_length=20, null=True) ownership_types = ( ('N', 'Natural'), ('L', 'Legal') ) ownership = models.CharField( max_length=1, choices=ownership_types, default='N', help_text="N is natural & L is legal" ) address = models.TextField(max_length=1000, null=True) unit_name = models.CharField(max_length=150, null=True) unit_national_id = models.CharField(max_length=25, null=True) photo = models.CharField(max_length=50, null=True) province = models.ForeignKey( 'Province', on_delete=models.CASCADE, related_name='user_province', null=True ) city = models.ForeignKey( 'City', on_delete=models.CASCADE, related_name='user_city', null=True ) otp_status = models.BooleanField(default=False) is_herd_owner = models.BooleanField(default=False) def __str__(self): return f'{self.username} {self.last_name}-{self.last_login}' def save(self, *args, **kwargs): super(User, self).save(*args, **kwargs) class Province(BaseModel): # noqa name = models.CharField(max_length=50) def __str__(self): return f'{self.name}' def save(self, *args, **kwargs): super(Province, self).save(*args, **kwargs) class City(BaseModel): name = models.CharField(max_length=50) province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name='cities', null=True ) def __str__(self): return f'{self.name}' def save(self, *args, **kwargs): super(City, self).save(*args, **kwargs) class OrganizationType(BaseModel): organization_keys = ( ('EMP', 'empty'), ('J', 'Jihad'), ('U', 'Union'), ('CO', 'Cooperative'), ('CMP', 'Companies') ) parent = models.ForeignKey( 'self', on_delete=models.CASCADE, related_name='children', null=True ) key = models.CharField(choices=organization_keys, default='EMP', max_length=3) name = models.CharField(max_length=50, unique=True, null=True) code = models.IntegerField(default=0) org_type_field = models.CharField(choices=[ ('CI', 'city'), ('CO', 'country'), ('PR', 'province'), ], max_length=25, null=True) is_repeatable = models.BooleanField(default=False) def __str__(self): return f'{self.key}-{self.name}' def save(self, *args, **kwargs): super(OrganizationType, self).save(*args, **kwargs) class Organization(BaseModel): name = models.CharField(max_length=250, null=True) en_name = models.CharField(max_length=150, null=True) phone = models.CharField(max_length=25, null=True) type = models.ForeignKey( 'OrganizationType', on_delete=models.CASCADE, related_name="organization_type", null=True ) national_unique_id = models.CharField(max_length=30, default="0") activity_fields = ( ('CO', 'Country'), ('PR', 'Province'), ('CI', 'City') ) field_of_activity = models.CharField(max_length=2, choices=activity_fields, default="") free_visibility_by_scope = models.BooleanField(default=False) company_code = models.CharField(max_length=30, default="") province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name="province_organization", null=True ) city = models.ForeignKey( 'City', on_delete=models.CASCADE, related_name='city_organization', null=True ) parent_organization = models.ForeignKey( 'Organization', on_delete=models.CASCADE, related_name='parents', null=True ) address = models.TextField(max_length=1000, null=True, blank=True) separate_warehouse = models.BooleanField(default=False) has_pos = models.BooleanField(default=False) additional_data = models.JSONField(default=dict) def __str__(self): return f'{self.name}-{self.type}' def save(self, *args, **kwargs): super(Organization, self).save(*args, **kwargs) class OrganizationStats(BaseModel): organization = models.OneToOneField( Organization, on_delete=models.CASCADE, related_name='stats', null=True ) total_quota_received = models.PositiveBigIntegerField(default=0) active_quotas_weight = models.PositiveBigIntegerField(default=0) closed_quotas_weight = models.PositiveBigIntegerField(default=0) total_quotas_weight = models.PositiveBigIntegerField(default=0) total_distributed = models.PositiveBigIntegerField(default=0) total_inventory_in = models.PositiveBigIntegerField(default=0) total_sold = models.PositiveBigIntegerField(default=0) def __str__(self): return f'Organization: {self.organization.name}' def save(self, *args, **kwargs): return super(OrganizationStats, self).save(*args, **kwargs) class BankAccountInformation(BaseModel): user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="bank_information", null=True ) organization = models.ForeignKey( Organization, on_delete=models.CASCADE, related_name='bank_information', null=True ) type_choices = ( ('ORG', 'organization'), ('USR', 'user'), ) account_type = models.CharField(max_length=10, default='USR') name = models.CharField(max_length=150, null=True) card = models.CharField(max_length=25, null=True, unique=True) account = models.CharField(max_length=25, null=True, unique=True) sheba = models.CharField(max_length=30, null=True, unique=True) def __str__(self): return f'{self.name}-{self.card}' def save(self, *args, **kwargs): super(BankAccountInformation, self).save(*args, **kwargs) class BlacklistedAccessToken(models.Model): jti = models.CharField(max_length=255, unique=True) token = models.TextField() user_id = models.IntegerField() blacklisted_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Blacklisted JTI: {self.jti}"