complete first version of main proccess
This commit is contained in:
parent
6ff4740d04
commit
f2fc2362a7
61 changed files with 3280 additions and 28 deletions
111
installations/models.py
Normal file
111
installations/models.py
Normal file
|
@ -0,0 +1,111 @@
|
|||
from django.db import models
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.utils import timezone
|
||||
from common.models import BaseModel
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class InstallationAssignment(BaseModel):
|
||||
"""انتخاب نصاب و زمان مراجعه برای یک درخواست"""
|
||||
process_instance = models.ForeignKey(
|
||||
'processes.ProcessInstance', on_delete=models.CASCADE,
|
||||
related_name='installation_assignments', verbose_name='نمونه فرآیند'
|
||||
)
|
||||
installer = models.ForeignKey(
|
||||
User, on_delete=models.SET_NULL, null=True, blank=True,
|
||||
related_name='assigned_installations', verbose_name='نصاب'
|
||||
)
|
||||
scheduled_date = models.DateField(null=True, blank=True, verbose_name='تاریخ مراجعه')
|
||||
notes = models.TextField(blank=True, verbose_name='یادداشت')
|
||||
assigned_by = models.ForeignKey(
|
||||
User, on_delete=models.SET_NULL, null=True, blank=True,
|
||||
related_name='assigner_installations', verbose_name='اختصاصدهنده'
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'اختصاص نصاب'
|
||||
verbose_name_plural = 'اختصاصهای نصاب'
|
||||
ordering = ['-created']
|
||||
|
||||
def __str__(self):
|
||||
return f"Assignment for {self.process_instance.code} to {getattr(self.installer, 'username', '-') }"
|
||||
|
||||
|
||||
class InstallationReport(BaseModel):
|
||||
"""گزارش نصب توسط نصاب"""
|
||||
assignment = models.ForeignKey(
|
||||
InstallationAssignment, on_delete=models.CASCADE,
|
||||
related_name='reports', 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='سریال کنتور جدید')
|
||||
seal_number = models.CharField(max_length=50, null=True, blank=True, verbose_name='شماره پلمپ')
|
||||
is_meter_suspicious = models.BooleanField(default=False, verbose_name='کنتور مشکوک است؟')
|
||||
utm_x = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True, verbose_name='UTM X')
|
||||
utm_y = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True, verbose_name='UTM Y')
|
||||
description = models.TextField(blank=True, verbose_name='توضیحات')
|
||||
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='ایجادکننده')
|
||||
approved = models.BooleanField(default=False, verbose_name='تایید شده')
|
||||
approved_at = models.DateTimeField(null=True, blank=True, verbose_name='تاریخ تایید')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'گزارش نصب'
|
||||
verbose_name_plural = 'گزارشهای نصب'
|
||||
ordering = ['-created']
|
||||
|
||||
def __str__(self):
|
||||
return f"Report for {self.assignment.process_instance.code}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# set approved time
|
||||
if self.approved and self.approved_at is None:
|
||||
self.approved_at = timezone.now()
|
||||
super().save(*args, **kwargs)
|
||||
# if approved, propagate UTM to well
|
||||
try:
|
||||
if self.approved and self.assignment and self.assignment.process_instance and self.assignment.process_instance.well:
|
||||
well = self.assignment.process_instance.well
|
||||
changed = False
|
||||
if self.utm_x is not None:
|
||||
well.utm_x = self.utm_x
|
||||
changed = True
|
||||
if self.utm_y is not None:
|
||||
well.utm_y = self.utm_y
|
||||
changed = True
|
||||
if changed:
|
||||
well.save()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
class InstallationPhoto(BaseModel):
|
||||
report = models.ForeignKey(InstallationReport, on_delete=models.CASCADE, related_name='photos', verbose_name='گزارش')
|
||||
image = models.ImageField(upload_to='installations/photos/%Y/%m/%d/', verbose_name='عکس')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'عکس نصب'
|
||||
verbose_name_plural = 'عکسهای نصب'
|
||||
ordering = ['created']
|
||||
|
||||
|
||||
class InstallationItemChange(BaseModel):
|
||||
"""تغییرات اقلام در مرحله نصب (افزودن/حذف نسبت به اقلام مرحله ۱)"""
|
||||
CHANGE_CHOICES = [
|
||||
('add', 'افزودن'),
|
||||
('remove', 'حذف'),
|
||||
]
|
||||
report = models.ForeignKey(InstallationReport, on_delete=models.CASCADE, related_name='item_changes', verbose_name='گزارش')
|
||||
item = models.ForeignKey('invoices.Item', on_delete=models.CASCADE, verbose_name='آیتم')
|
||||
change_type = models.CharField(max_length=6, choices=CHANGE_CHOICES, verbose_name='نوع تغییر')
|
||||
quantity = models.PositiveIntegerField(verbose_name='تعداد')
|
||||
unit_price = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='قیمت واحد', null=True, blank=True)
|
||||
total_price = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='قیمت کل', null=True, blank=True)
|
||||
notes = models.TextField(blank=True, verbose_name='یادداشت')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'تغییر آیتم نصب'
|
||||
verbose_name_plural = 'تغییرات آیتمهای نصب'
|
||||
ordering = ['created']
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue