# backend/modules/task_management/models.py from django.db import models from django.conf import settings from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from core.base_models import BaseModel class Task(BaseModel): """ Modularni Task model nasljeđuje sva polja iz BaseModel. """ STATUS_CHOICES = [ ('aktivan', 'Aktivan'), ('servis', 'U tijeku'), ('spreman_za_zavrsetak', 'Spreman za završetak'), ('zavrsen', 'Završen'), ('neaktivan', 'Otkazano'), ] title = models.CharField(max_length=255) description = models.TextField(blank=True) status = models.CharField( max_length=20, choices=STATUS_CHOICES, default='aktivan' ) assigned_to = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='tasks' ) vehicle = models.ForeignKey( 'fleet.Vehicle', on_delete=models.SET_NULL, null=True, blank=True, related_name='tasks', verbose_name=_("Dizalica"), ) work_order = models.ForeignKey( 'fleet.WorkOrder', on_delete=models.SET_NULL, null=True, blank=True, related_name='work_order_tasks', verbose_name=_("Putni nalog"), ) scheduled_date = models.DateField( null=True, blank=True, db_index=True, verbose_name=_("Planirani datum izvršenja"), help_text=_("Datum kada je planirano izvršenje radnog zadatka."), ) service_report_note = models.TextField( blank=True, default='', verbose_name=_("Napomena izvještaja servisera"), help_text=_("Tekst napomene za PDF izvještaj servisera za ovaj zadatak."), ) class Meta: ordering = ['-created_at'] def __str__(self): return f"{self.title} ({self.status})" def clean(self): super().clean() if self.status in {'neaktivan', 'zavrsen'} and not self.work_order_id: raise ValidationError({ 'work_order': "Putni nalog je obavezan prije zatvaranja zadatka." }) class TaskCalendar(Task): class Meta: proxy = True verbose_name = _("Kalendar zadatka") verbose_name_plural = _("Kalendar zadataka") class TaskWorkHoursTable(BaseModel): """Interaktivna tablica radnih sati povezana s radnim zadatkom.""" task = models.OneToOneField( Task, on_delete=models.CASCADE, related_name='work_hours_table', verbose_name=_("Radni zadatak"), ) data = models.JSONField( null=True, blank=True, default=None, verbose_name=_("Podaci tablice radnih sati"), ) class Meta: ordering = ['-updated_at'] verbose_name = _("Tablica radnih sati") verbose_name_plural = _("Tablice radnih sati") def __str__(self): return f"Work hours table for task {self.task_id}" class TaskTemplate(BaseModel): """Predložak za brzo kreiranje servisnog radnog zadatka.""" code = models.SlugField(max_length=64, unique=True) title = models.CharField(max_length=255) description = models.TextField(blank=True) status = models.CharField(max_length=20, choices=Task.STATUS_CHOICES, default='aktivan') class Meta: ordering = ['title'] def __str__(self): return f"{self.title} ({self.code})" class TaskTemplateEntry(BaseModel): """Predlošci radnih unosa koji se generiraju prilikom kreiranja Taska.""" task_template = models.ForeignKey( TaskTemplate, on_delete=models.CASCADE, related_name='entries', ) sort_order = models.PositiveSmallIntegerField(default=1) title = models.CharField(max_length=255) work_description = models.TextField(blank=True) active_faults = models.TextField(blank=True, help_text=_("Aktivne greške.")) explanation_hr = models.TextField(blank=True, help_text=_("Obrazloženje na hrvatskom jeziku.")) class Meta: ordering = ['sort_order', 'created_at'] constraints = [ models.UniqueConstraint( fields=['task_template', 'sort_order'], name='task_template_entry_sort_order_unique', ) ] def __str__(self): return f"{self.task_template.code} #{self.sort_order} - {self.title}" class TaskWorkEntry(BaseModel): """Radni unos na konkretnom Tasku (generiran iz templatea ili ručno).""" task = models.ForeignKey( Task, on_delete=models.CASCADE, related_name='work_entries', ) template_entry = models.ForeignKey( TaskTemplateEntry, on_delete=models.SET_NULL, null=True, blank=True, related_name='task_work_entries', ) sort_order = models.PositiveSmallIntegerField(default=1) title = models.CharField(max_length=255) work_description = models.TextField(blank=True) active_faults = models.TextField(blank=True) explanation_hr = models.TextField(blank=True) class Meta: ordering = ['sort_order', 'created_at'] def __str__(self): return f"{self.task_id} #{self.sort_order} - {self.title}"