Compare commits
	
		
			3 commits
		
	
	
		
			241f56f550
			...
			916c66a281
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 916c66a281 | |||
| d22473e14a | |||
| 001dc313f6 | 
					 8 changed files with 159 additions and 35 deletions
				
			
		| 
						 | 
				
			
			@ -64,21 +64,25 @@ class CustomerForm(forms.ModelForm):
 | 
			
		|||
            'address': forms.Textarea(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'آدرس کامل',
 | 
			
		||||
                'rows': '3'
 | 
			
		||||
                'rows': '3',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'card_number': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'شماره کارت بانکی',
 | 
			
		||||
                'maxlength': '16'
 | 
			
		||||
                'maxlength': '16',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'account_number': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'شماره حساب بانکی',
 | 
			
		||||
                'maxlength': '20'
 | 
			
		||||
                'maxlength': '20',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'bank_name': forms.Select(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'نام بانک',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
        }
 | 
			
		||||
        labels = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,74 @@
 | 
			
		|||
# Generated by Django 5.2.4 on 2025-10-04 10:36
 | 
			
		||||
 | 
			
		||||
import django.core.validators
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('accounts', '0008_alter_historicalprofile_phone_number_1_and_more'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalprofile',
 | 
			
		||||
            name='account_number',
 | 
			
		||||
            field=models.CharField(default=1, max_length=20, validators=[django.core.validators.RegexValidator(code='invalid_account_number', message='شماره حساب باید فقط شامل اعداد باشد.', regex='^\\d+$')], verbose_name='شماره حساب'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalprofile',
 | 
			
		||||
            name='address',
 | 
			
		||||
            field=models.TextField(default=1, verbose_name='آدرس'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalprofile',
 | 
			
		||||
            name='bank_name',
 | 
			
		||||
            field=models.CharField(choices=[('mellat', 'بانک ملت'), ('saman', 'بانک سامان'), ('parsian', 'بانک پارسیان'), ('sina', 'بانک سینا'), ('tejarat', 'بانک تجارت'), ('tosee', 'بانک توسعه'), ('iran_zamin', 'بانک ایران زمین'), ('meli', 'بانک ملی'), ('saderat', 'بانک توسعه صادرات'), ('iran_zamin', 'بانک ایران زمین'), ('refah', 'بانک رفاه'), ('eghtesad_novin', 'بانک اقتصاد نوین'), ('pasargad', 'بانک پاسارگاد'), ('other', 'سایر')], default=1, max_length=255, verbose_name='نام بانک'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalprofile',
 | 
			
		||||
            name='card_number',
 | 
			
		||||
            field=models.CharField(default=1, max_length=16, validators=[django.core.validators.RegexValidator(code='invalid_card_number', message='شماره کارت باید فقط شامل اعداد باشد.', regex='^\\d+$')], verbose_name='شماره کارت'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalprofile',
 | 
			
		||||
            name='national_code',
 | 
			
		||||
            field=models.CharField(default=1, max_length=10, validators=[django.core.validators.RegexValidator(code='invalid_national_code', message='کد ملی باید فقط شامل اعداد باشد.', regex='^\\d+$')], verbose_name='کد ملی'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='profile',
 | 
			
		||||
            name='account_number',
 | 
			
		||||
            field=models.CharField(default=1, max_length=20, validators=[django.core.validators.RegexValidator(code='invalid_account_number', message='شماره حساب باید فقط شامل اعداد باشد.', regex='^\\d+$')], verbose_name='شماره حساب'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='profile',
 | 
			
		||||
            name='address',
 | 
			
		||||
            field=models.TextField(default=1, verbose_name='آدرس'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='profile',
 | 
			
		||||
            name='bank_name',
 | 
			
		||||
            field=models.CharField(choices=[('mellat', 'بانک ملت'), ('saman', 'بانک سامان'), ('parsian', 'بانک پارسیان'), ('sina', 'بانک سینا'), ('tejarat', 'بانک تجارت'), ('tosee', 'بانک توسعه'), ('iran_zamin', 'بانک ایران زمین'), ('meli', 'بانک ملی'), ('saderat', 'بانک توسعه صادرات'), ('iran_zamin', 'بانک ایران زمین'), ('refah', 'بانک رفاه'), ('eghtesad_novin', 'بانک اقتصاد نوین'), ('pasargad', 'بانک پاسارگاد'), ('other', 'سایر')], default=1, max_length=255, verbose_name='نام بانک'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='profile',
 | 
			
		||||
            name='card_number',
 | 
			
		||||
            field=models.CharField(default=1, max_length=16, validators=[django.core.validators.RegexValidator(code='invalid_card_number', message='شماره کارت باید فقط شامل اعداد باشد.', regex='^\\d+$')], verbose_name='شماره کارت'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='profile',
 | 
			
		||||
            name='national_code',
 | 
			
		||||
            field=models.CharField(default=1, max_length=10, validators=[django.core.validators.RegexValidator(code='invalid_national_code', message='کد ملی باید فقط شامل اعداد باشد.', regex='^\\d+$')], verbose_name='کد ملی'),
 | 
			
		||||
            preserve_default=False,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -27,9 +27,7 @@ class Profile(BaseModel):
 | 
			
		|||
    )
 | 
			
		||||
    national_code = models.CharField(
 | 
			
		||||
        max_length=10,
 | 
			
		||||
        null=True,
 | 
			
		||||
        verbose_name="کد ملی",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        validators=[
 | 
			
		||||
            RegexValidator(
 | 
			
		||||
                regex=r'^\d+$',
 | 
			
		||||
| 
						 | 
				
			
			@ -39,15 +37,11 @@ class Profile(BaseModel):
 | 
			
		|||
        ]
 | 
			
		||||
    )
 | 
			
		||||
    address = models.TextField(
 | 
			
		||||
        null=True,
 | 
			
		||||
        verbose_name="آدرس",
 | 
			
		||||
        blank=True
 | 
			
		||||
    )
 | 
			
		||||
    card_number = models.CharField(
 | 
			
		||||
        max_length=16,
 | 
			
		||||
        null=True,
 | 
			
		||||
        verbose_name="شماره کارت",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        validators=[
 | 
			
		||||
            RegexValidator(
 | 
			
		||||
                regex=r'^\d+$',
 | 
			
		||||
| 
						 | 
				
			
			@ -58,9 +52,7 @@ class Profile(BaseModel):
 | 
			
		|||
    )
 | 
			
		||||
    account_number = models.CharField(
 | 
			
		||||
        max_length=20,
 | 
			
		||||
        null=True,
 | 
			
		||||
        verbose_name="شماره حساب",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        validators=[
 | 
			
		||||
            RegexValidator(
 | 
			
		||||
                regex=r'^\d+$',
 | 
			
		||||
| 
						 | 
				
			
			@ -72,9 +64,7 @@ class Profile(BaseModel):
 | 
			
		|||
    bank_name = models.CharField(
 | 
			
		||||
        max_length=255,
 | 
			
		||||
        choices=BANK_CHOICES,
 | 
			
		||||
        null=True,
 | 
			
		||||
        verbose_name="نام بانک",
 | 
			
		||||
        blank=True
 | 
			
		||||
    )
 | 
			
		||||
    phone_number_1 = models.CharField(
 | 
			
		||||
        max_length=11,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								db.sqlite3
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								db.sqlite3
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -34,24 +34,29 @@ class InstallationReportForm(forms.ModelForm):
 | 
			
		|||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'new_water_meter_serial': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control'
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'seal_number': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control'
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'utm_x': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'step': '1'
 | 
			
		||||
                'step': '1',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'utm_y': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'step': '1'
 | 
			
		||||
                'step': '1',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'meter_type': forms.Select(attrs={
 | 
			
		||||
                'class': 'form-select'
 | 
			
		||||
                'class': 'form-select',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }, choices=[
 | 
			
		||||
                ('', 'انتخاب کنید'),
 | 
			
		||||
                ('smart', 'هوشمند (آبی/برق)'),
 | 
			
		||||
                ('smart', 'هوشمند (آب و برق)'),
 | 
			
		||||
                ('volumetric', 'حجمی')
 | 
			
		||||
            ]),
 | 
			
		||||
            'meter_size': forms.TextInput(attrs={
 | 
			
		||||
| 
						 | 
				
			
			@ -60,10 +65,12 @@ class InstallationReportForm(forms.ModelForm):
 | 
			
		|||
            'discharge_pipe_diameter': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'min': '0',
 | 
			
		||||
                'step': '1'
 | 
			
		||||
                'step': '1',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'usage_type': forms.Select(attrs={
 | 
			
		||||
                'class': 'form-select'
 | 
			
		||||
                'class': 'form-select',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }, choices=[
 | 
			
		||||
                ('', 'انتخاب کنید'),
 | 
			
		||||
                ('domestic', 'شرب و خدمات'),
 | 
			
		||||
| 
						 | 
				
			
			@ -77,31 +84,37 @@ class InstallationReportForm(forms.ModelForm):
 | 
			
		|||
            'motor_power': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'min': '0',
 | 
			
		||||
                'step': '1'
 | 
			
		||||
                'step': '1',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'pre_calibration_flow_rate': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'min': '0',
 | 
			
		||||
                'step': '0.01'
 | 
			
		||||
                'step': '0.01',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'post_calibration_flow_rate': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'min': '0',
 | 
			
		||||
                'step': '0.01'
 | 
			
		||||
                'step': '0.01',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'water_meter_manufacturer': forms.Select(attrs={
 | 
			
		||||
                'class': 'form-select',
 | 
			
		||||
                'id': 'id_water_meter_manufacturer'
 | 
			
		||||
                'id': 'id_water_meter_manufacturer',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'sim_number': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control'
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'driving_force': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control'
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'is_meter_suspicious': forms.CheckboxInput(attrs={
 | 
			
		||||
                'class': 'form-check-input',
 | 
			
		||||
                'id': 'id_is_meter_suspicious'
 | 
			
		||||
                'id': 'id_is_meter_suspicious',
 | 
			
		||||
            }),
 | 
			
		||||
            'description': forms.Textarea(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,12 +83,10 @@ class WellForm(forms.ModelForm):
 | 
			
		|||
            'utm_x': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'X UTM',
 | 
			
		||||
                'required': 'required',
 | 
			
		||||
            }),
 | 
			
		||||
            'utm_y': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'Y UTM',
 | 
			
		||||
                'required': 'required',
 | 
			
		||||
            }),
 | 
			
		||||
            'utm_zone': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
| 
						 | 
				
			
			@ -97,17 +95,17 @@ class WellForm(forms.ModelForm):
 | 
			
		|||
                'max': '60'
 | 
			
		||||
            }),
 | 
			
		||||
            'utm_hemisphere': forms.Select(attrs={
 | 
			
		||||
                'class': 'form-select'
 | 
			
		||||
                'class': 'form-select',
 | 
			
		||||
            }),
 | 
			
		||||
            'well_power': forms.NumberInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'قدرت چاه',
 | 
			
		||||
                'min': '0'
 | 
			
		||||
                'min': '0',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'reference_letter_number': forms.TextInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
                'placeholder': 'شماره معرفی نامه',
 | 
			
		||||
                'required': True
 | 
			
		||||
            }),
 | 
			
		||||
            'reference_letter_date': forms.DateInput(attrs={
 | 
			
		||||
                'class': 'form-control',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										43
									
								
								wells/migrations/0006_alter_historicalwell_utm_x_and_more.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								wells/migrations/0006_alter_historicalwell_utm_x_and_more.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
# Generated by Django 5.2.4 on 2025-10-04 10:43
 | 
			
		||||
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('wells', '0005_alter_historicalwell_utm_x_and_more'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalwell',
 | 
			
		||||
            name='utm_x',
 | 
			
		||||
            field=models.DecimalField(blank=True, decimal_places=0, max_digits=10, null=True, verbose_name='X UTM'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalwell',
 | 
			
		||||
            name='utm_y',
 | 
			
		||||
            field=models.DecimalField(blank=True, decimal_places=0, max_digits=10, null=True, verbose_name='Y UTM'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='historicalwell',
 | 
			
		||||
            name='well_power',
 | 
			
		||||
            field=models.PositiveIntegerField(verbose_name='قدرت چاه'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='well',
 | 
			
		||||
            name='utm_x',
 | 
			
		||||
            field=models.DecimalField(blank=True, decimal_places=0, max_digits=10, null=True, verbose_name='X UTM'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='well',
 | 
			
		||||
            name='utm_y',
 | 
			
		||||
            field=models.DecimalField(blank=True, decimal_places=0, max_digits=10, null=True, verbose_name='Y UTM'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='well',
 | 
			
		||||
            name='well_power',
 | 
			
		||||
            field=models.PositiveIntegerField(verbose_name='قدرت چاه'),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -80,11 +80,15 @@ class Well(SluggedModel):
 | 
			
		|||
        max_digits=10,
 | 
			
		||||
        decimal_places=0,
 | 
			
		||||
        verbose_name="X UTM",
 | 
			
		||||
        null=True,
 | 
			
		||||
        blank=True
 | 
			
		||||
        )
 | 
			
		||||
    utm_y = models.DecimalField(
 | 
			
		||||
        max_digits=10,
 | 
			
		||||
        decimal_places=0,
 | 
			
		||||
        verbose_name="Y UTM",
 | 
			
		||||
        null=True,
 | 
			
		||||
        blank=True
 | 
			
		||||
        )
 | 
			
		||||
    utm_zone = models.PositiveIntegerField(
 | 
			
		||||
        verbose_name="زون UTM",
 | 
			
		||||
| 
						 | 
				
			
			@ -103,8 +107,6 @@ class Well(SluggedModel):
 | 
			
		|||
 | 
			
		||||
    well_power = models.PositiveIntegerField(
 | 
			
		||||
        verbose_name="قدرت چاه",
 | 
			
		||||
        null=True,
 | 
			
		||||
        blank=True
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    reference_letter_number = models.CharField(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue