shafafiyat/installations/models.py

111 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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']