Compare commits

...
Sign in to create a new pull request.

4 commits

14 changed files with 285 additions and 198 deletions

View file

@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>تاییدیه - {{ instance.code }}</title> <title>تاییدیه - {{ instance.code }}</title>
{% load static %} {% load static %}
{% load common_tags %}
<!-- Fonts (match project) --> <!-- Fonts (match project) -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
@ -52,21 +53,22 @@
<h6 class="my-2">مشخصات چاه و کنتور هوشمند</h6> <h6 class="my-2">مشخصات چاه و کنتور هوشمند</h6>
<div class="row" style="font-size: 14px;"> <div class="row" style="font-size: 14px;">
<div class="col-4"> <div class="col-4">
<div>موقعیت مکانی (UTM): {{ latest_report.utm_x|default:'-' }} , {{ latest_report.utm_y|default:'-' }}</div> <div>موقعیت مکانی (UTM): X: {{ latest_report.utm_x|default:'-' }} , Y: {{ latest_report.utm_y|default:'-' }}</div>
<div>نیرو محرکه چاه: {{ latest_report.driving_force|default:'-' }}</div> <div>نوع پمپ: {{ latest_report.get_pump_type_display|default:'-' }}</div>
<div> نوع کنتور: {{ latest_report.get_meter_type_display|default:'-' }}</div> <div> نوع کنتور: {{ latest_report.get_meter_type_display|default:'-' }}</div>
<div>نام شرکت کنتورساز: {{ latest_report.water_meter_manufacturer.name|default:'-' }}</div>
<div>قطر لوله آبده (اینچ): {{ latest_report.discharge_pipe_diameter|default:'-' }}</div> <div>قطر لوله آبده (اینچ): {{ latest_report.discharge_pipe_diameter|default:'-' }}</div>
<div>نوع مصرف: {{ latest_report.get_usage_type_display|default:'-' }}</div> <div>نوع مصرف: {{ latest_report.get_usage_type_display|default:'-' }}</div>
<div>شماره سیم‌کارت: {{ latest_report.sim_number|default:'-' }}</div> <div>توان مصرفی (کیلووات): {{ latest_report.motor_power|default:'-' }}</div>
</div> </div>
<div class="col-4"> <div class="col-4">
<div>سایز کنتور: {{ latest_report.meter_size|default:'-' }}</div> <div>دبی بعد از کالیبراسیون (لیتر بر ثانیه): {{ latest_report.flow_rate|default:'-' }}</div>
<div>ساعت کارکرد پروانه: {{ latest_report.licence_working_hour|default:'-' }}</div>
<div>شماره پلمپ: {{ latest_report.seal_number|default:'-' }}</div>
<div>شماره پروانه بهره‌برداری چاه: {{ latest_report.exploitation_license_number|default:'-' }}</div> <div>شماره پروانه بهره‌برداری چاه: {{ latest_report.exploitation_license_number|default:'-' }}</div>
<div>قدرت موتور: {{ latest_report.motor_power|default:'-' }}</div> <div>پایان اعتبار شارژ: {{ latest_report.meter_charge_expiration_date|to_jalali|default:'-' }}</div>
<div>دبی قبل از کالیبراسیون: {{ latest_report.pre_calibration_flow_rate|default:'-' }}</div> <div>سریال کنتور: {{ instance.well.water_meter_serial_number|default:'-' }}</div>
<div>دبی بعد از کالیبراسیون: {{ latest_report.post_calibration_flow_rate|default:'-' }}</div> <div>تابلو قطع: {{ latest_report.is_panel_cut|yesno:'دارد,ندارد' }}</div>
<div>نام شرکت کنتورساز: {{ latest_report.water_meter_manufacturer.name|default:'-' }}</div>
<div>شماره سریال کنتور: {{ instance.well.water_meter_serial_number|default:'-' }}</div>
</div> </div>
<div class="col-4"> <div class="col-4">
<!-- Signature --> <!-- Signature -->

View file

@ -2,6 +2,7 @@
{% load static %} {% load static %}
{% load processes_tags %} {% load processes_tags %}
{% load humanize %} {% load humanize %}
{% load common_tags %}
{% load accounts_tags %} {% load accounts_tags %}
{% block sidebar %} {% block sidebar %}
@ -73,21 +74,24 @@
<h6 class="mb-2">مشخصات چاه و کنتور هوشمند</h6> <h6 class="mb-2">مشخصات چاه و کنتور هوشمند</h6>
<div class="row g-2 small"> <div class="row g-2 small">
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<div class="d-flex gap-2"><span class="text-muted">موقعیت مکانی (UTM):</span><span class="fw-medium">{{ latest_report.utm_x|default:'-' }} , {{ latest_report.utm_y|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">موقعیت مکانی (UTM):</span><span class="fw-medium">X: {{ latest_report.utm_x|default:'-' }} , Y: {{ latest_report.utm_y|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">نیرو محرکه چاه:</span><span class="fw-medium">{{ latest_report.driving_force|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">نوع پمپ:</span><span class="fw-medium">{{ latest_report.get_pump_type_display|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">نوع کنتور:</span><span class="fw-medium">{{ latest_report.get_meter_type_display|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">نوع کنتور:</span><span class="fw-medium">{{ latest_report.get_meter_type_display|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">نام شرکت کنتورساز:</span><span class="fw-medium">{{ latest_report.water_meter_manufacturer.name|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">قطر لوله آبده (اینچ):</span><span class="fw-medium">{{ latest_report.discharge_pipe_diameter|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">قطر لوله آبده (اینچ):</span><span class="fw-medium">{{ latest_report.discharge_pipe_diameter|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">نوع مصرف:</span><span class="fw-medium">{{ latest_report.get_usage_type_display|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">نوع مصرف:</span><span class="fw-medium">{{ latest_report.get_usage_type_display|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">شماره سیم‌کارت:</span><span class="fw-medium">{{ latest_report.sim_number|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">توان مصرفی (کیلووات):</span><span class="fw-medium">{{ latest_report.motor_power|default:'-' }}</span></div>
</div> </div>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<div class="d-flex gap-2"><span class="text-muted">سایز کنتور:</span><span class="fw-medium">{{ latest_report.meter_size|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">دبی بعد از کالیبراسیون (لیتر بر ثانیه):</span><span class="fw-medium">{{ latest_report.flow_rate|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">ساعت کارکرد پروانه:</span><span class="fw-medium">{{ latest_report.licence_working_hour|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">شماره پلمپ:</span><span class="fw-medium">{{ latest_report.seal_number|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">شماره پروانه بهره‌برداری چاه:</span><span class="fw-medium">{{ latest_report.exploitation_license_number|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">شماره پروانه بهره‌برداری چاه:</span><span class="fw-medium">{{ latest_report.exploitation_license_number|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">قدرت موتور:</span><span class="fw-medium">{{ latest_report.motor_power|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">پایان اعتبار شارژ:</span><span class="fw-medium">{{ latest_report.meter_charge_expiration_date|to_jalali|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">دبی قبل از کالیبراسیون:</span><span class="fw-medium">{{ latest_report.pre_calibration_flow_rate|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">سریال کنتور:</span><span class="fw-medium">{{ instance.well.water_meter_serial_number|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">دبی بعد از کالیبراسیون:</span><span class="fw-medium">{{ latest_report.post_calibration_flow_rate|default:'-' }}</span></div> <div class="d-flex gap-2"><span class="text-muted">تابلو قطع:</span><span class="fw-medium">{{ latest_report.is_panel_cut|yesno:'دارد,ندارد' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">نام شرکت کنتورساز:</span><span class="fw-medium">{{ latest_report.water_meter_manufacturer.name|default:'-' }}</span></div>
<div class="d-flex gap-2"><span class="text-muted">شماره سریال کنتور:</span><span class="fw-medium">{{ instance.well.water_meter_serial_number|default:'-' }}</span></div>
</div> </div>
</div> </div>
<div class="signature-section d-flex justify-content-end"> <div class="signature-section d-flex justify-content-end">

View file

@ -83,7 +83,7 @@ def certificate_step(request, instance_id, step_id):
messages.error(request, 'مانده فاکتور باید صفر باشد') messages.error(request, 'مانده فاکتور باید صفر باشد')
return redirect('processes:request_list') return redirect('processes:request_list')
template = CertificateTemplate.objects.filter(is_active=True).order_by('-created').first() template = CertificateTemplate.objects.filter(is_active=True, company=instance.broker.company).order_by('-created').first()
if not template: if not template:
return render(request, 'certificates/missing.html', {}) return render(request, 'certificates/missing.html', {})

Binary file not shown.

View file

@ -24,11 +24,13 @@ class InstallationReportAdmin(admin.ModelAdmin):
list_display = ( list_display = (
'assignment', 'visited_date', 'meter_type', 'meter_size', 'water_meter_manufacturer', 'assignment', 'visited_date', 'meter_type', 'meter_size', 'water_meter_manufacturer',
'discharge_pipe_diameter', 'usage_type', 'exploitation_license_number', 'discharge_pipe_diameter', 'usage_type', 'exploitation_license_number',
'motor_power', 'pre_calibration_flow_rate', 'post_calibration_flow_rate', 'motor_power', 'flow_rate', 'meter_reading', 'meter_charge', 'meter_charge_expiration_date',
'pump_type', 'licence_working_hour',
'new_water_meter_serial', 'seal_number', 'sim_number', 'new_water_meter_serial', 'seal_number', 'sim_number',
'is_panel_sealed', 'is_panel_cut', 'is_disconnection_done',
'is_meter_suspicious', 'approved', 'created' 'is_meter_suspicious', 'approved', 'created'
) )
list_filter = ('is_meter_suspicious', 'approved', 'visited_date', 'meter_type', 'usage_type', 'water_meter_manufacturer') list_filter = ('is_meter_suspicious', 'is_panel_sealed', 'is_panel_cut', 'is_disconnection_done', 'approved', 'visited_date', 'meter_type', 'pump_type', 'usage_type', 'water_meter_manufacturer')
search_fields = ( search_fields = (
'assignment__process_instance__code', 'new_water_meter_serial', 'seal_number', 'exploitation_license_number', 'sim_number' 'assignment__process_instance__code', 'new_water_meter_serial', 'seal_number', 'exploitation_license_number', 'sim_number'
) )
@ -43,13 +45,16 @@ class InstallationReportAdmin(admin.ModelAdmin):
) )
}), }),
('مشخصات هیدرولیکی', { ('مشخصات هیدرولیکی', {
'fields': ('discharge_pipe_diameter', 'pre_calibration_flow_rate', 'post_calibration_flow_rate') 'fields': ('discharge_pipe_diameter', 'flow_rate', 'meter_reading', 'meter_charge', 'meter_charge_expiration_date')
}), }),
('کاربری و مجوز', { ('کاربری و مجوز', {
'fields': ('usage_type', 'exploitation_license_number') 'fields': ('usage_type', 'exploitation_license_number')
}), }),
('توان و محرکه', { ('توان و محرکه', {
'fields': ('driving_force', 'motor_power') 'fields': ('driving_force', 'motor_power', 'pump_type', 'licence_working_hour')
}),
('وضعیت تابلو/قطع', {
'fields': ('is_panel_sealed', 'is_panel_cut', 'is_disconnection_done')
}), }),
('توضیحات', { ('توضیحات', {
'fields': ('description',) 'fields': ('description',)

View file

@ -20,10 +20,12 @@ class InstallationReportForm(forms.ModelForm):
model = InstallationReport model = InstallationReport
fields = [ fields = [
'visited_date', 'new_water_meter_serial', 'seal_number', 'visited_date', 'new_water_meter_serial', 'seal_number',
'utm_x', 'utm_y', 'meter_type', 'meter_size', 'meter_model', 'utm_x', 'utm_y', 'meter_type',
'discharge_pipe_diameter', 'usage_type', 'exploitation_license_number', 'discharge_pipe_diameter', 'usage_type', 'exploitation_license_number',
'motor_power', 'pre_calibration_flow_rate', 'post_calibration_flow_rate', 'motor_power', 'flow_rate', 'meter_charge_expiration_date',
'water_meter_manufacturer', 'sim_number', 'driving_force', 'pump_type', 'licence_working_hour',
'is_panel_cut',
'water_meter_manufacturer',
'is_meter_suspicious', 'description' 'is_meter_suspicious', 'description'
] ]
@ -59,16 +61,7 @@ class InstallationReportForm(forms.ModelForm):
('smart', 'هوشمند (آب و برق)'), ('smart', 'هوشمند (آب و برق)'),
('volumetric', 'حجمی') ('volumetric', 'حجمی')
]), ]),
'meter_size': forms.TextInput(attrs={ # meter_size and meter_model removed from form UI
'class': 'form-control'
}),
'meter_model': forms.Select(attrs={
'class': 'form-select'
}, choices=[
('', 'انتخاب کنید'),
('direct', 'مستقیم'),
('indirect', 'غیرمستقیم')
]),
'discharge_pipe_diameter': forms.NumberInput(attrs={ 'discharge_pipe_diameter': forms.NumberInput(attrs={
'class': 'form-control', 'class': 'form-control',
'required': True 'required': True
@ -90,35 +83,41 @@ class InstallationReportForm(forms.ModelForm):
'class': 'form-control', 'class': 'form-control',
'required': True 'required': True
}), }),
'pre_calibration_flow_rate': forms.NumberInput(attrs={ 'flow_rate': forms.NumberInput(attrs={
'class': 'form-control', 'class': 'form-control',
'min': '0', 'min': '0',
'step': '0.0001', 'step': '0.0001',
'required': True
}), }),
'post_calibration_flow_rate': forms.NumberInput(attrs={ # meter_reading and meter_charge removed from form UI
'meter_charge_expiration_date': forms.DateInput(attrs={
'type': 'date',
'class': 'form-control', 'class': 'form-control',
'min': '0',
'step': '0.0001',
'required': True
}), }),
'water_meter_manufacturer': forms.Select(attrs={ 'water_meter_manufacturer': forms.Select(attrs={
'class': 'form-select', 'class': 'form-select',
'id': 'id_water_meter_manufacturer', 'id': 'id_water_meter_manufacturer',
'required': True 'required': True
}), }),
'sim_number': forms.TextInput(attrs={ # sim_number and driving_force removed from form UI
'class': 'form-control', 'pump_type': forms.Select(attrs={
'class': 'form-select',
'required': True 'required': True
}), }),
'driving_force': forms.TextInput(attrs={ 'licence_working_hour': forms.NumberInput(attrs={
'class': 'form-control', 'class': 'form-control',
'min': '0',
'step': '1',
'required': True 'required': True
}), }),
'is_meter_suspicious': forms.CheckboxInput(attrs={ 'is_meter_suspicious': forms.CheckboxInput(attrs={
'class': 'form-check-input', 'class': 'form-check-input',
'id': 'id_is_meter_suspicious', 'id': 'id_is_meter_suspicious',
}), }),
# is_panel_sealed removed from form UI
'is_panel_cut': forms.CheckboxInput(attrs={
'class': 'form-check-input',
}),
# is_disconnection_done removed from form UI
'description': forms.Textarea(attrs={ 'description': forms.Textarea(attrs={
'class': 'form-control', 'class': 'form-control',
'rows': 3 'rows': 3
@ -127,22 +126,22 @@ class InstallationReportForm(forms.ModelForm):
labels = { labels = {
'visited_date': 'تاریخ مراجعه', 'visited_date': 'تاریخ مراجعه',
'new_water_meter_serial': 'سریال کنتور جدید', 'new_water_meter_serial': 'سریال کنتور',
'seal_number': 'شماره پلمپ', 'seal_number': 'شماره پلمپ',
'utm_x': 'UTM X', 'utm_x': 'UTM X',
'utm_y': 'UTM Y', 'utm_y': 'UTM Y',
'meter_type': 'نوع کنتور', 'meter_type': 'نوع کنتور',
'meter_size': 'سایز کنتور',
'discharge_pipe_diameter': 'قطر لوله آبده (اینچ)', 'discharge_pipe_diameter': 'قطر لوله آبده (اینچ)',
'usage_type': 'نوع مصرف', 'usage_type': 'نوع مصرف',
'exploitation_license_number': 'شماره پروانه بهره‌برداری', 'exploitation_license_number': 'شماره پروانه بهره‌برداری',
'motor_power': 'قدرت موتور (کیلووات ساعت)', 'motor_power': 'توان مصرفی (کیلووات)',
'pre_calibration_flow_rate': 'دبی قبل از کالیبراسیون (لیتر بر ثانیه)', 'flow_rate': 'دبی بعد از کالیبراسیون (لیتر بر ثانیه)',
'post_calibration_flow_rate': 'دبی بعد از کالیبراسیون (لیتر بر ثانیه)', 'meter_charge_expiration_date': 'تاریخ پایان اعتبار شارژ',
'pump_type': 'نوع پمپ',
'licence_working_hour': 'ساعت کارکرد پروانه',
'water_meter_manufacturer': 'شرکت سازنده کنتور', 'water_meter_manufacturer': 'شرکت سازنده کنتور',
'sim_number': 'شماره سیمکارت',
'driving_force': 'نیرو محرکه چاه',
'is_meter_suspicious': 'کنتور مشکوک است', 'is_meter_suspicious': 'کنتور مشکوک است',
'is_panel_cut': 'تابلو قطع',
'description': 'توضیحات' 'description': 'توضیحات'
} }

View file

@ -0,0 +1,50 @@
# Generated by Django 5.2.4 on 2025-10-27 03:42
import django.core.validators
from decimal import Decimal
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('installations', '0011_alter_installationreport_discharge_pipe_diameter'),
]
operations = [
migrations.AddField(
model_name='installationreport',
name='flow_rate',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='(لیتر بر ثانیه)دبی'),
),
migrations.AddField(
model_name='installationreport',
name='is_disconnection_done',
field=models.BooleanField(default=False, verbose_name='انجام عملیات قطع'),
),
migrations.AddField(
model_name='installationreport',
name='is_panel_cut',
field=models.BooleanField(default=False, verbose_name='تابلو قطع'),
),
migrations.AddField(
model_name='installationreport',
name='is_panel_sealed',
field=models.BooleanField(default=False, verbose_name='پلمپ تابلو'),
),
migrations.AddField(
model_name='installationreport',
name='meter_charge',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, validators=[django.core.validators.MinValueValidator(Decimal('0'))], verbose_name='شارژ کنتور (متر مکعب)'),
),
migrations.AddField(
model_name='installationreport',
name='meter_charge_expiration_date',
field=models.DateField(blank=True, null=True, verbose_name='تاریخ پایان اعتبار شارژ'),
),
migrations.AddField(
model_name='installationreport',
name='meter_reading',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, validators=[django.core.validators.MinValueValidator(Decimal('0'))], verbose_name='عدد کنتور (متر مکعب)'),
),
]

View file

@ -0,0 +1,21 @@
# Generated by Django 5.2.4 on 2025-10-27 03:47
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('installations', '0012_installationreport_flow_rate_and_more'),
]
operations = [
migrations.RemoveField(
model_name='installationreport',
name='post_calibration_flow_rate',
),
migrations.RemoveField(
model_name='installationreport',
name='pre_calibration_flow_rate',
),
]

View file

@ -0,0 +1,38 @@
# Generated by Django 5.2.4 on 2025-11-23 08:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('installations', '0013_remove_installationreport_post_calibration_flow_rate_and_more'),
]
operations = [
migrations.AddField(
model_name='installationreport',
name='licence_working_hour',
field=models.PositiveIntegerField(blank=True, null=True, verbose_name='ساعت کارکرد پروانه'),
),
migrations.AddField(
model_name='installationreport',
name='pump_type',
field=models.CharField(blank=True, choices=[('shaft_sleeve', 'شفت و غلاف'), ('submersible', 'شناور')], max_length=20, null=True, verbose_name='نوع پمپ'),
),
migrations.AlterField(
model_name='installationreport',
name='flow_rate',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='(لیتر بر ثانیه)دبی بعد از کالیبراسیون'),
),
migrations.AlterField(
model_name='installationreport',
name='motor_power',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='(کیلووات)توان مصرفی'),
),
migrations.AlterField(
model_name='installationreport',
name='new_water_meter_serial',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='سریال کنتور'),
),
]

View file

@ -41,7 +41,7 @@ class InstallationReport(BaseModel):
related_name='reports', verbose_name='اختصاص' related_name='reports', verbose_name='اختصاص'
) )
visited_date = models.DateField(null=True, blank=True, verbose_name='تاریخ مراجعه') visited_date = models.DateField(null=True, blank=True, verbose_name='تاریخ مراجعه')
new_water_meter_serial = models.CharField(max_length=50, null=True, blank=True, verbose_name='سریال کنتور جدید') new_water_meter_serial = models.CharField(max_length=50, null=True, blank=True, verbose_name='سریال کنتور')
seal_number = models.CharField(max_length=50, null=True, blank=True, verbose_name='شماره پلمپ') seal_number = models.CharField(max_length=50, null=True, blank=True, verbose_name='شماره پلمپ')
is_meter_suspicious = models.BooleanField(default=False, verbose_name='کنتور مشکوک است؟') is_meter_suspicious = models.BooleanField(default=False, verbose_name='کنتور مشکوک است؟')
METER_TYPE_CHOICES = [ METER_TYPE_CHOICES = [
@ -55,6 +55,18 @@ class InstallationReport(BaseModel):
] ]
meter_model = models.CharField(max_length=20, choices=METER_MODEL_CHOICES, null=True, blank=True, verbose_name='مدل کنتور') meter_model = models.CharField(max_length=20, choices=METER_MODEL_CHOICES, null=True, blank=True, verbose_name='مدل کنتور')
meter_size = models.CharField(max_length=50, null=True, blank=True, verbose_name='سایز کنتور') meter_size = models.CharField(max_length=50, null=True, blank=True, verbose_name='سایز کنتور')
meter_reading = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, validators=[MinValueValidator(Decimal('0'))], verbose_name='عدد کنتور (متر مکعب)')
meter_charge = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, validators=[MinValueValidator(Decimal('0'))], verbose_name='شارژ کنتور (متر مکعب)')
meter_charge_expiration_date = models.DateField(null=True, blank=True, verbose_name='تاریخ پایان اعتبار شارژ')
is_panel_sealed = models.BooleanField(default=False, verbose_name='پلمپ تابلو')
is_panel_cut = models.BooleanField(default=False, verbose_name='تابلو قطع')
is_disconnection_done = models.BooleanField(default=False, verbose_name='انجام عملیات قطع')
PUMP_TYPE_CHOICES = [
('shaft_sleeve', 'شفت و غلاف'),
('submersible', 'شناور'),
]
pump_type = models.CharField(max_length=20, choices=PUMP_TYPE_CHOICES, null=True, blank=True, verbose_name='نوع پمپ')
licence_working_hour = models.PositiveIntegerField(null=True, blank=True, verbose_name='ساعت کارکرد پروانه')
discharge_pipe_diameter = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='قطر لوله آبده (اینچ)') discharge_pipe_diameter = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='قطر لوله آبده (اینچ)')
USAGE_TYPE_CHOICES = [ USAGE_TYPE_CHOICES = [
('domestic', 'شرب و خدمات'), ('domestic', 'شرب و خدمات'),
@ -63,9 +75,8 @@ class InstallationReport(BaseModel):
] ]
usage_type = models.CharField(max_length=20, choices=USAGE_TYPE_CHOICES, null=True, verbose_name='نوع مصرف') usage_type = models.CharField(max_length=20, choices=USAGE_TYPE_CHOICES, null=True, verbose_name='نوع مصرف')
exploitation_license_number = models.CharField(max_length=50, verbose_name='شماره پروانه بهره‌برداری چاه') exploitation_license_number = models.CharField(max_length=50, verbose_name='شماره پروانه بهره‌برداری چاه')
motor_power = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(کیلووات ساعت) قدرت موتور') motor_power = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(کیلووات)توان مصرفی')
pre_calibration_flow_rate = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(لیتر بر ثانیه)دبی قبل از کالیبراسیون') flow_rate = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(لیتر بر ثانیه)دبی بعد از کالیبراسیون')
post_calibration_flow_rate = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(لیتر بر ثانیه)دبی بعد از کالیبراسیون')
water_meter_manufacturer = models.ForeignKey('wells.WaterMeterManufacturer', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='شرکت سازنده کنتور آب') water_meter_manufacturer = models.ForeignKey('wells.WaterMeterManufacturer', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='شرکت سازنده کنتور آب')
sim_number = models.CharField(max_length=20, null=True, blank=True, verbose_name='شماره سیمکارت') sim_number = models.CharField(max_length=20, null=True, blank=True, verbose_name='شماره سیمکارت')
driving_force = models.CharField(max_length=50, null=True, blank=True, verbose_name='نیرو محرکه چاه') driving_force = models.CharField(max_length=50, null=True, blank=True, verbose_name='نیرو محرکه چاه')

View file

@ -146,28 +146,23 @@
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<p class="text-nowrap mb-2"><i class="bx bx-calendar-event bx-sm me-2"></i>تاریخ مراجعه: {{ report.visited_date|to_jalali|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-calendar-event bx-sm me-2"></i>تاریخ مراجعه: {{ report.visited_date|to_jalali|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-purchase-tag bx-sm me-2"></i>سریال جدید: {{ report.new_water_meter_serial|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-purchase-tag bx-sm me-2"></i>سریال کنتور: {{ report.new_water_meter_serial|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-lock-alt bx-sm me-2"></i>شماره پلمپ: {{ report.seal_number|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-lock-alt bx-sm me-2"></i>شماره پلمپ: {{ report.seal_number|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-chip bx-sm me-2"></i>نوع کنتور: {{ report.get_meter_type_display|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-chip bx-sm me-2"></i>نوع کنتور: {{ report.get_meter_type_display|default:'-' }}</p>
{% if report.meter_type == 'smart' %}
<p class="text-nowrap mb-2"><i class="bx bx-chip bx-sm me-2"></i>مدل کنتور: {{ report.get_meter_model_display|default:'-' }}</p>
{% else %}
<p class="text-nowrap mb-2"><i class="bx bx-ruler bx-sm me-2"></i>سایز کنتور: {{ report.meter_size|default:'-' }}</p>
{% endif %}
<p class="text-nowrap mb-2"><i class="bx bx-tachometer bx-sm me-2"></i>قطر لوله آبده (اینچ): {{ report.discharge_pipe_diameter|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-tachometer bx-sm me-2"></i>قطر لوله آبده (اینچ): {{ report.discharge_pipe_diameter|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-building bx-sm me-2"></i>سازنده کنتور: {{ report.water_meter_manufacturer|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-building bx-sm me-2"></i>شرکت سازنده کنتور: {{ report.water_meter_manufacturer.name|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-sim-card bx-sm me-2"></i>شماره سیمکارت: {{ report.sim_number|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-calendar-exclamation bx-sm me-2"></i>پایان اعتبار شارژ: {{ report.meter_charge_expiration_date|to_jalali|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-cog bx-sm me-2"></i>نیرو محرکه چاه: {{ report.driving_force|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-help-circle bx-sm me-2"></i>کنتور مشکوک: {{ report.is_meter_suspicious|yesno:'بله,خیر' }}</p>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<p class="text-nowrap mb-2"><i class="bx bx-help-circle bx-sm me-2"></i>کنتور مشکوک: {{ report.is_meter_suspicious|yesno:'بله,خیر' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-map bx-sm me-2"></i>UTM X: {{ report.utm_x|default:'-' }} Y: {{ report.utm_y|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-map bx-sm me-2"></i>UTM X: {{ report.utm_x|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-map-pin bx-sm me-2"></i>UTM Y: {{ report.utm_y|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-category bx-sm me-2"></i>نوع مصرف: {{ report.get_usage_type_display|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-category bx-sm me-2"></i>نوع مصرف: {{ report.get_usage_type_display|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-id-card bx-sm me-2"></i>شماره پروانه بهره‌برداری: {{ report.exploitation_license_number|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-id-card bx-sm me-2"></i>شماره پروانه بهره‌برداری: {{ report.exploitation_license_number|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-bolt-circle bx-sm me-2"></i>قدرت موتور(کیلووات ساعت): {{ report.motor_power|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-bolt-circle bx-sm me-2"></i>توان مصرفی (کیلووات): {{ report.motor_power|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-water bx-sm me-2"></i>دبی قبل کالیبراسیون(لیتر/ثانیه): {{ report.pre_calibration_flow_rate|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-water bx-sm me-2"></i>دبی بعد از کالیبراسیون (لیتر بر ثانیه): {{ report.flow_rate|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-water bx-sm me-2"></i>دبی بعد کالیبراسیون(لیتر/ثانیه): {{ report.post_calibration_flow_rate|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-cycling bx-sm me-2"></i>نوع پمپ: {{ report.get_pump_type_display|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-time-five bx-sm me-2"></i>ساعت کارکرد پروانه: {{ report.licence_working_hour|default:'-' }}</p>
<p class="text-nowrap mb-2"><i class="bx bx-power-off bx-sm me-2"></i>تابلو قطع: {{ report.is_panel_cut|yesno:'بله,خیر' }}</p>
</div> </div>
</div> </div>
@ -346,20 +341,7 @@
<div class="invalid-feedback">{{ form.meter_type.errors.0 }}</div> <div class="invalid-feedback">{{ form.meter_type.errors.0 }}</div>
{% endif %} {% endif %}
</div> </div>
<div class="col-md-3" id="meter_size_wrapper"> <!-- meter_size and meter_model removed from form UI -->
{{ form.meter_size.label_tag }}
{{ form.meter_size }}
{% if form.meter_size.errors %}
<div class="invalid-feedback">{{ form.meter_size.errors.0 }}</div>
{% endif %}
</div>
<div class="col-md-3" id="meter_model_wrapper">
{{ form.meter_model.label_tag }}
{{ form.meter_model }}
{% if form.meter_model.errors %}
<div class="invalid-feedback">{{ form.meter_size.errors.0 }}</div>
{% endif %}
</div>
<div class="col-md-3"> <div class="col-md-3">
{{ form.discharge_pipe_diameter.label_tag }} {{ form.discharge_pipe_diameter.label_tag }}
{{ form.discharge_pipe_diameter }} {{ form.discharge_pipe_diameter }}
@ -389,21 +371,23 @@
{% endif %} {% endif %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
{{ form.pre_calibration_flow_rate.label_tag }} {{ form.flow_rate.label_tag }}
{{ form.pre_calibration_flow_rate }} {{ form.flow_rate }}
{% if form.pre_calibration_flow_rate.errors %} {% if form.flow_rate.errors %}
<div class="invalid-feedback">{{ form.pre_calibration_flow_rate.errors.0 }}</div> <div class="invalid-feedback">{{ form.flow_rate.errors.0 }}</div>
{% endif %}
</div>
<!-- meter_reading and meter_charge removed from form UI -->
<div class="col-md-3">
{{ form.meter_charge_expiration_date.label_tag }}
<input type="text" id="id_meter_charge_expiration_date_display" class="form-control{% if form.meter_charge_expiration_date.errors %} is-invalid{% endif %}" placeholder="انتخاب تاریخ" {% if not user_is_installer %}disabled{% endif %} readonly value="{% if report and edit_mode and report.meter_charge_expiration_date %}{{ report.meter_charge_expiration_date|date:'Y/m/d' }}{% elif form.meter_charge_expiration_date.value %}{{ form.meter_charge_expiration_date.value|date:'Y/m/d' }}{% endif %}">
<input type="hidden" id="id_meter_charge_expiration_date" name="meter_charge_expiration_date" value="{% if report and edit_mode and report.meter_charge_expiration_date %}{{ report.meter_charge_expiration_date|date:'Y-m-d' }}{% elif form.meter_charge_expiration_date.value %}{{ form.meter_charge_expiration_date.value }}{% endif %}">
{% if form.meter_charge_expiration_date.errors %}
<div class="invalid-feedback">{{ form.meter_charge_expiration_date.errors.0 }}</div>
{% endif %} {% endif %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
{{ form.post_calibration_flow_rate.label_tag }} {{ form.water_meter_manufacturer.label_tag }}
{{ form.post_calibration_flow_rate }}
{% if form.post_calibration_flow_rate.errors %}
<div class="invalid-feedback">{{ form.post_calibration_flow_rate.errors.0 }}</div>
{% endif %}
</div>
<div class="col-md-3">
{{ form.water_meter_manufacturer.label_tag }}حجمی
<div class="input-group"> <div class="input-group">
{{ form.water_meter_manufacturer }} {{ form.water_meter_manufacturer }}
{{ form.new_manufacturer }} {{ form.new_manufacturer }}
@ -418,20 +402,22 @@
<div class="invalid-feedback">{{ form.new_manufacturer.errors.0 }}</div> <div class="invalid-feedback">{{ form.new_manufacturer.errors.0 }}</div>
{% endif %} {% endif %}
</div> </div>
<!-- sim_number and driving_force removed from form UI -->
<div class="col-md-3"> <div class="col-md-3">
{{ form.sim_number.label_tag }} {{ form.pump_type.label_tag }}
{{ form.sim_number }} {{ form.pump_type }}
{% if form.sim_number.errors %} {% if form.pump_type.errors %}
<div class="invalid-feedback">{{ form.sim_number.errors.0 }}</div> <div class="invalid-feedback">{{ form.pump_type.errors.0 }}</div>
{% endif %} {% endif %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
{{ form.driving_force.label_tag }} {{ form.licence_working_hour.label_tag }}
{{ form.driving_force }} {{ form.licence_working_hour }}
{% if form.driving_force.errors %} {% if form.licence_working_hour.errors %}
<div class="invalid-feedback">{{ form.driving_force.errors.0 }}</div> <div class="invalid-feedback">{{ form.licence_working_hour.errors.0 }}</div>
{% endif %} {% endif %}
</div> </div>
<div class="row mt-3">
<div class="col-md-3 d-flex align-items-end"> <div class="col-md-3 d-flex align-items-end">
<div class="form-check"> <div class="form-check">
{{ form.is_meter_suspicious }} {{ form.is_meter_suspicious }}
@ -441,6 +427,18 @@
<div class="invalid-feedback">{{ form.is_meter_suspicious.errors.0 }}</div> <div class="invalid-feedback">{{ form.is_meter_suspicious.errors.0 }}</div>
{% endif %} {% endif %}
</div> </div>
<!-- is_panel_sealed removed from form UI -->
<div class="col-md-3 d-flex align-items-end">
<div class="form-check">
{{ form.is_panel_cut }}
{{ form.is_panel_cut.label_tag }}
</div>
{% if form.is_panel_cut.errors %}
<div class="invalid-feedback">{{ form.is_panel_cut.errors.0 }}</div>
{% endif %}
</div>
<!-- is_disconnection_done removed from form UI -->
</div>
</div> </div>
<div class="my-3"> <div class="my-3">
{{ form.description.label_tag }} {{ form.description.label_tag }}
@ -653,7 +651,7 @@
<script src="https://unpkg.com/persian-date@latest/dist/persian-date.min.js"></script> <script src="https://unpkg.com/persian-date@latest/dist/persian-date.min.js"></script>
<script src="https://unpkg.com/persian-datepicker@latest/dist/js/persian-datepicker.min.js"></script> <script src="https://unpkg.com/persian-datepicker@latest/dist/js/persian-datepicker.min.js"></script>
<script> <script>
// Persian datepicker for visited_date (exact pattern like sample: display + altField) // Persian datepicker helper for date fields (DRY)
(function(){ (function(){
function convertPersianToEnglishNumbers(str) { function convertPersianToEnglishNumbers(str) {
const persianNumbers = '۰۱۲۳۴۵۶۷۸۹'; const persianNumbers = '۰۱۲۳۴۵۶۷۸۹';
@ -664,12 +662,12 @@
}).join(''); }).join('');
} }
if (window.$ && $.fn.persianDatepicker && $('#id_visited_date_display').length) { function initPersianDateField(displaySelector, hiddenSelector){
if (!(window.$ && $.fn.persianDatepicker)) return;
var $display = $(displaySelector);
var $hidden = $(hiddenSelector);
if (!$display.length || !$hidden.length) return;
try { try {
var $display = $('#id_visited_date_display');
var $hidden = $('#id_visited_date');
// Prefill from hidden Gregorian to visible Jalali
var initialGregorian = $hidden.val(); var initialGregorian = $hidden.val();
if (initialGregorian) { if (initialGregorian) {
try { try {
@ -678,10 +676,9 @@
} catch (e) {} } catch (e) {}
} }
// Initialize datepicker with altField exactly like the sample $display.persianDatepicker({
var picker = $display.persianDatepicker({
calendarType: 'persian', calendarType: 'persian',
altField: '#id_visited_date', altField: hiddenSelector,
format: 'YYYY/MM/DD', format: 'YYYY/MM/DD',
altFormat: 'YYYY-MM-DD', altFormat: 'YYYY-MM-DD',
observer: true, observer: true,
@ -694,8 +691,12 @@
$hidden.val(g); $hidden.val(g);
} }
}); });
} catch (e) { console.error('Error initializing Persian Date Picker:', e); } } catch (e) { console.error('Error initializing Persian Date Picker:', displaySelector, e); }
} }
// Initialize both fields
initPersianDateField('#id_visited_date_display', '#id_visited_date');
initPersianDateField('#id_meter_charge_expiration_date_display', '#id_meter_charge_expiration_date');
})(); })();
// Require date and show success toast on submit (persist across redirect) // Require date and show success toast on submit (persist across redirect)
@ -816,23 +817,14 @@
if (!$select.length || !$btn.length) return; if (!$select.length || !$btn.length) return;
$btn.on('click', function(){ $btn.on('click', function(){
if ($select.is(':visible')) { if ($select.is(':visible')) {
$select.hide(); // Switch to input mode: disable select required, enable input required
$input.show().focus(); $select.prop('disabled', true).prop('required', false).hide();
$input.prop('required', true).show().focus();
$btn.html('<i class="bx bx-check"></i>'); $btn.html('<i class="bx bx-check"></i>');
} else { } else {
// When switching back, if input has value, append it as selected option // Back to select mode: remove input required, enable select required
const val = ($input.val() || '').trim(); $input.prop('required', false).hide();
if (val) { $select.prop('disabled', false).prop('required', true).show();
// Add a temporary option with value prefixed 'new:' to be handled server-side
const exists = $select.find('option').filter(function(){ return $(this).text().trim() === val; }).length > 0;
if (!exists) {
const opt = $('<option></option>').val('').text(val);
$select.append(opt);
}
$select.val('');
}
$input.hide();
$select.show();
$btn.html('<i class="bx bx-plus"></i>'); $btn.html('<i class="bx bx-plus"></i>');
} }
}); });
@ -861,46 +853,7 @@
} }
} }
// Dynamic meter field visibility based on meter type // meter_size/meter_model dynamic handling removed
(function() {
const meterTypeSelect = document.getElementById('{{ form.meter_type.id_for_label }}');
const meterSizeWrapper = document.getElementById('meter_size_wrapper');
const meterModelWrapper = document.getElementById('meter_model_wrapper');
function updateMeterFields() {
if (!meterTypeSelect) return;
const selectedType = meterTypeSelect.value;
if (selectedType === 'smart') {
// Show meter_model, hide meter_size
meterModelWrapper.style.display = '';
meterSizeWrapper.style.display = 'none';
// Clear meter_size value when hidden
const meterSizeInput = meterSizeWrapper.querySelector('input, select');
if (meterSizeInput) meterSizeInput.value = '';
} else if (selectedType === 'volumetric') {
// Show meter_size, hide meter_model
meterSizeWrapper.style.display = '';
meterModelWrapper.style.display = 'none';
// Clear meter_model value when hidden
const meterModelSelect = meterModelWrapper.querySelector('select');
if (meterModelSelect) meterModelSelect.value = '';
} else {
// No selection: hide both
meterSizeWrapper.style.display = 'none';
meterModelWrapper.style.display = 'none';
}
}
// Initial update on page load
updateMeterFields();
// Update on change
if (meterTypeSelect) {
meterTypeSelect.addEventListener('change', updateMeterFields);
}
})();
</script> </script>
{% endblock %} {% endblock %}

View file

@ -23,7 +23,7 @@ def installation_assign_step(request, instance_id, step_id):
next_step = instance.process.steps.filter(order__gt=step.order).first() next_step = instance.process.steps.filter(order__gt=step.order).first()
# Installers list (profiles that have installer role) # Installers list (profiles that have installer role)
installers = Profile.objects.filter(roles__slug=UserRoles.INSTALLER.value, county=instance.well.county).select_related('user').all() installers = Profile.objects.filter(roles__slug=UserRoles.INSTALLER.value, county__city=instance.well.county.city).select_related('user').all()
assignment, _ = InstallationAssignment.objects.get_or_create(process_instance=instance) assignment, _ = InstallationAssignment.objects.get_or_create(process_instance=instance)
# Role flags # Role flags

View file

@ -122,11 +122,11 @@
</div> </div>
{% if installation_assignment.scheduled_date %} {% if installation_assignment.scheduled_date %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-calendar-star bx-sm me-2"></i>تاریخ برنامه‌ریزی: {{ installation_assignment.scheduled_date|to_jalali }}</p> <p class="text-nowrap mb-2"><i class="bx bx-calendar-star bx-sm me-2"></i>تاریخ تعیین شده: {{ installation_assignment.scheduled_date|to_jalali }}</p>
</div> </div>
{% endif %} {% endif %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-purchase-tag bx-sm me-2"></i>سریال کنتور جدید: {{ latest_report.new_water_meter_serial|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-purchase-tag bx-sm me-2"></i>سریال کنتور: {{ latest_report.new_water_meter_serial|default:'-' }}</p>
</div> </div>
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-lock-alt bx-sm me-2"></i>شماره پلمپ: {{ latest_report.seal_number|default:'-' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-lock-alt bx-sm me-2"></i>شماره پلمپ: {{ latest_report.seal_number|default:'-' }}</p>
@ -134,24 +134,16 @@
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-help-circle bx-sm me-2"></i>کنتور مشکوک: {{ latest_report.is_meter_suspicious|yesno:'بله,خیر' }}</p> <p class="text-nowrap mb-2"><i class="bx bx-help-circle bx-sm me-2"></i>کنتور مشکوک: {{ latest_report.is_meter_suspicious|yesno:'بله,خیر' }}</p>
</div> </div>
{% if latest_report.sim_number %} {# sim_number removed from summary UI #}
<div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-mobile bx-sm me-2"></i>شماره سیمکارت: {{ latest_report.sim_number }}</p>
</div>
{% endif %}
{% if latest_report.meter_type %} {% if latest_report.meter_type %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-category bx-sm me-2"></i>نوع کنتور: {{ latest_report.get_meter_type_display }}</p> <p class="text-nowrap mb-2"><i class="bx bx-category bx-sm me-2"></i>نوع کنتور: {{ latest_report.get_meter_type_display }}</p>
</div> </div>
{% endif %} {# meter model/size removed from summary UI #}
{% if latest_report.meter_size %}
<div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-ruler bx-sm me-2"></i>سایز کنتور: {{ latest_report.meter_size }}</p>
</div>
{% endif %} {% endif %}
{% if latest_report.water_meter_manufacturer %} {% if latest_report.water_meter_manufacturer %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-buildings bx-sm me-2"></i>سازنده: {{ latest_report.water_meter_manufacturer.name }}</p> <p class="text-nowrap mb-2"><i class="bx bx-buildings bx-sm me-2"></i>شرکت سازنده کنتور: {{ latest_report.water_meter_manufacturer.name }}</p>
</div> </div>
{% endif %} {% endif %}
{% if latest_report.discharge_pipe_diameter %} {% if latest_report.discharge_pipe_diameter %}
@ -164,14 +156,10 @@
<p class="text-nowrap mb-2"><i class="bx bx-droplet bx-sm me-2"></i>نوع مصرف: {{ latest_report.get_usage_type_display }}</p> <p class="text-nowrap mb-2"><i class="bx bx-droplet bx-sm me-2"></i>نوع مصرف: {{ latest_report.get_usage_type_display }}</p>
</div> </div>
{% endif %} {% endif %}
{% if latest_report.driving_force %} {# driving_force removed from summary UI #}
<div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-car bx-sm me-2"></i>نیرو محرکه: {{ latest_report.driving_force }}</p>
</div>
{% endif %}
{% if latest_report.motor_power %} {% if latest_report.motor_power %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-tag bx-sm me-2"></i>قدرت موتور: {{ latest_report.motor_power }} کیلووات ساعت</p> <p class="text-nowrap mb-2"><i class="bx bx-tag bx-sm me-2"></i>توان مصرفی (کیلووات): {{ latest_report.motor_power }}</p>
</div> </div>
{% endif %} {% endif %}
{% if latest_report.exploitation_license_number %} {% if latest_report.exploitation_license_number %}
@ -179,14 +167,30 @@
<p class="text-nowrap mb-2"><i class="bx bx-id-card bx-sm me-2"></i>شماره پروانه: {{ latest_report.exploitation_license_number }}</p> <p class="text-nowrap mb-2"><i class="bx bx-id-card bx-sm me-2"></i>شماره پروانه: {{ latest_report.exploitation_license_number }}</p>
</div> </div>
{% endif %} {% endif %}
{% if latest_report.pre_calibration_flow_rate %} {% if latest_report.flow_rate %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-water bx-sm me-2"></i>دبی قبل از کالیبراسیون: {{ latest_report.pre_calibration_flow_rate }} لیتر/ثانیه</p> <p class="text-nowrap mb-2"><i class="bx bx-water bx-sm me-2"></i>دبی بعد از کالیبراسیون (لیتر بر ثانیه): {{ latest_report.flow_rate }}</p>
</div> </div>
{% endif %} {% endif %}
{% if latest_report.post_calibration_flow_rate %} {# meter_reading and meter_charge removed from summary UI #}
{% if latest_report.meter_charge_expiration_date %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-tachometer bx-sm me-2"></i>دبی بعد از کالیبراسیون: {{ latest_report.post_calibration_flow_rate }} لیتر/ثانیه</p> <p class="text-nowrap mb-2"><i class="bx bx-calendar-exclamation bx-sm me-2"></i>پایان اعتبار شارژ: {{ latest_report.meter_charge_expiration_date|to_jalali }}</p>
</div>
{% endif %}
{# is_panel_sealed removed from summary UI #}
<div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-power-off bx-sm me-2"></i>تابلو قطع: {{ latest_report.is_panel_cut|yesno:'دارد,ندارد' }}</p>
</div>
{# is_disconnection_done removed from summary UI #}
{% if latest_report.pump_type %}
<div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-cycling bx-sm me-2"></i>نوع پمپ: {{ latest_report.get_pump_type_display }}</p>
</div>
{% endif %}
{% if latest_report.licence_working_hour %}
<div class="col-12 col-md-4">
<p class="text-nowrap mb-2"><i class="bx bx-time-five bx-sm me-2"></i>ساعت کارکرد پروانه: {{ latest_report.licence_working_hour }}</p>
</div> </div>
{% endif %} {% endif %}
<div class="col-12 col-md-4"> <div class="col-12 col-md-4">

View file

@ -21,7 +21,7 @@ def scope_instances_queryset(user, queryset=None):
if profile.has_role(UserRoles.BROKER): if profile.has_role(UserRoles.BROKER):
return qs.filter(broker=profile.broker) return qs.filter(broker=profile.broker)
if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER) or profile.has_role(UserRoles.WATER_RESOURCE_MANAGER): if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER) or profile.has_role(UserRoles.WATER_RESOURCE_MANAGER):
return qs.filter(broker__affairs__county=profile.county) return qs.filter(broker__affairs__county__city=profile.county.city)
if profile.has_role(UserRoles.ADMIN): if profile.has_role(UserRoles.ADMIN):
return qs return qs
# if profile.has_role(UserRoles.WATER_RESOURCE_MANAGER) or profile.has_role(UserRoles.HEADQUARTER): # if profile.has_role(UserRoles.WATER_RESOURCE_MANAGER) or profile.has_role(UserRoles.HEADQUARTER):
@ -70,7 +70,7 @@ def scope_wells_queryset(user, queryset=None):
if profile.has_role(UserRoles.BROKER): if profile.has_role(UserRoles.BROKER):
return qs.filter(broker=profile.broker) return qs.filter(broker=profile.broker)
if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER) or profile.has_role(UserRoles.WATER_RESOURCE_MANAGER): if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER) or profile.has_role(UserRoles.WATER_RESOURCE_MANAGER):
return qs.filter(broker__affairs__county=profile.county) return qs.filter(broker__affairs__county__city=profile.county.city)
if profile.has_role(UserRoles.INSTALLER): if profile.has_role(UserRoles.INSTALLER):
# Wells that have instances assigned to this installer # Wells that have instances assigned to this installer
from installations.models import InstallationAssignment from installations.models import InstallationAssignment
@ -103,7 +103,7 @@ def scope_customers_queryset(user, queryset=None):
if profile.has_role(UserRoles.BROKER): if profile.has_role(UserRoles.BROKER):
return qs.filter(broker=profile.broker) return qs.filter(broker=profile.broker)
if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER) or profile.has_role(UserRoles.WATER_RESOURCE_MANAGER): if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER) or profile.has_role(UserRoles.WATER_RESOURCE_MANAGER):
return qs.filter(county=profile.county) return qs.filter(county__city=profile.county.city)
if profile.has_role(UserRoles.INSTALLER): if profile.has_role(UserRoles.INSTALLER):
# Customers that are representatives of instances assigned to this installer # Customers that are representatives of instances assigned to this installer
from installations.models import InstallationAssignment from installations.models import InstallationAssignment