from django.db import models from django.core.exceptions import ValidationError from simple_history.models import HistoricalRecords class Directie(models.Model): name = models.CharField(max_length=255, verbose_name="Nume Direcție") history = HistoricalRecords() def __str__(self): return self.name class Meta: verbose_name = "Direcție" verbose_name_plural = "Direcții" class Serviciu(models.Model): name = models.CharField(max_length=255, verbose_name="Nume Serviciu") # A Serviciu is directly assigned to a Direcție directie = models.ForeignKey( Directie, on_delete=models.CASCADE, related_name="servicii", verbose_name="Direcție", ) history = HistoricalRecords() def __str__(self): return self.name class Meta: verbose_name = "Serviciu" verbose_name_plural = "Servicii" class Compartiment(models.Model): name = models.CharField(max_length=255, verbose_name="Nume Compartiment") # A Compartiment can be part of a Serviciu or directly included in a Direcție directie = models.ForeignKey( Directie, on_delete=models.CASCADE, null=True, blank=True, related_name="compartimente_directe", verbose_name="Direcție (Direct)", ) serviciu = models.ForeignKey( Serviciu, on_delete=models.CASCADE, null=True, blank=True, related_name="compartimente_subordonate", verbose_name="Serviciu", ) history = HistoricalRecords() def clean(self): # Validation to ensure the Compartiment belongs to either a Direcție OR a Serviciu, but not both or neither. if not self.directie and not self.serviciu: raise ValidationError( "Un compartiment trebuie să aparțină de o Direcție sau de un Serviciu." ) if self.directie and self.serviciu: raise ValidationError( "Un compartiment nu poate aparține simultan și de o Direcție și de un Serviciu." ) def save(self, *args, **kwargs): self.clean() super().save(*args, **kwargs) def __str__(self): return self.name class Meta: verbose_name = "Compartiment" verbose_name_plural = "Compartimente" class Employee(models.Model): """ Represents the 'Users' from the project specification who will hold equipment. Named 'Employee' to avoid conflicts with Django's built-in auth.User model. """ name = models.CharField(max_length=255, verbose_name="Name") username = models.CharField(max_length=150, unique=True, verbose_name="User name") role = models.CharField(max_length=255, verbose_name="Function/role") office_number = models.CharField(max_length=50, verbose_name="Office number") email = models.EmailField(verbose_name="Email address") # Keep only this single observations field observations = models.TextField(blank=True, null=True, verbose_name="Observații") # Organizational Placement - Employees can be placed at any of the three levels directie = models.ForeignKey( Directie, on_delete=models.SET_NULL, null=True, blank=True, related_name="employees", verbose_name="Direcție", ) serviciu = models.ForeignKey( Serviciu, on_delete=models.SET_NULL, null=True, blank=True, related_name="employees", verbose_name="Serviciu", ) compartiment = models.ForeignKey( Compartiment, on_delete=models.SET_NULL, null=True, blank=True, related_name="employees", verbose_name="Compartiment", ) @property def get_active_inventory(self): """Returns a dictionary of all active equipment and certificates assigned to the user.""" return { "computers": self.computers.filter(status="activ"), "monitors": self.monitors.filter(status="activ"), "peripherals": self.peripherals.filter(status="activ"), "certificates": self.digital_certificates.filter(is_canceled=False), } history = HistoricalRecords() def __str__(self): return f"{self.name} ({self.username})" class Meta: verbose_name = "Angajat / Utilizator" verbose_name_plural = "Angajați / Utilizatori" ordering = ["name"]