""" Service models for tracking service events. """ import uuid from django.db import models from django.utils import timezone class Service(models.Model): """Service records for accounts""" STATUS_CHOICES = ( ('scheduled', 'Scheduled'), ('in_progress', 'In Progress'), ('completed', 'Completed'), ('cancelled', 'Cancelled'), ) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) account = models.ForeignKey('Account', on_delete=models.CASCADE, related_name='services') date = models.DateField() status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='scheduled') team_members = models.ManyToManyField('Profile', related_name='services') notes = models.TextField(blank=True, null=True) # Service window deadline_start = models.DateTimeField() deadline_end = models.DateTimeField() # Timestamps created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) completed_at = models.DateTimeField(blank=True, null=True) class Meta: app_label = 'core' verbose_name = 'Service' verbose_name_plural = 'Services' ordering = ['-date'] indexes = [ models.Index(fields=['account']), models.Index(fields=['date']), models.Index(fields=['status']), ] def __str__(self): return f"Service for {self.account.name} on {self.date}" def save(self, *args, **kwargs): """Override save to set completed_at when status changes to completed""" if self.status == 'completed' and not self.completed_at: self.completed_at = timezone.now() super().save(*args, **kwargs) @property def is_upcoming(self): """Check if service is upcoming""" return self.date > timezone.now().date() @property def is_today(self): """Check if service is scheduled for today""" return self.date == timezone.now().date() @property def is_past_due(self): """Check if service is past due""" return self.date < timezone.now().date() and self.status not in ['completed', 'cancelled'] @property def team_member_names(self): """Get list of team member names""" return [f"{member.first_name} {member.last_name}" for member in self.team_members.all()]