'date', 'data_atto' => 'date', 'data_completamento' => 'datetime', 'quota_precedente' => 'decimal:4', 'quota_nuova' => 'decimal:4', 'prezzo_vendita' => 'decimal:2', 'ripartizioni_aggiornate' => 'boolean', 'comunicazioni_inviate' => 'boolean', 'allegati' => 'array' ]; // === RELAZIONI === public function unitaImmobiliare(): BelongsTo { return $this->belongsTo(UnitaImmobiliare::class); } public function soggettoPrecedente(): BelongsTo { return $this->belongsTo(Soggetto::class, 'soggetto_precedente_id'); } public function soggettoNuovo(): BelongsTo { return $this->belongsTo(Soggetto::class, 'soggetto_nuovo_id'); } public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } // === METODI UTILITÀ === public function getStatoBadgeColor(): string { return match($this->stato_subentro) { 'proposto' => 'warning', 'in_corso' => 'info', 'completato' => 'success', 'annullato' => 'danger', default => 'secondary' }; } public function getTipoSubentroBadgeColor(): string { return match($this->tipo_subentro) { 'vendita' => 'primary', 'eredita' => 'success', 'donazione' => 'info', 'locazione' => 'warning', 'comodato' => 'secondary', default => 'dark' }; } public function getTipoSubentroIcon(): string { return match($this->tipo_subentro) { 'vendita' => 'fas fa-euro-sign', 'eredita' => 'fas fa-gift', 'donazione' => 'fas fa-heart', 'locazione' => 'fas fa-key', 'comodato' => 'fas fa-handshake', default => 'fas fa-exchange-alt' }; } public function isPending(): bool { return in_array($this->stato_subentro, ['proposto', 'in_corso']); } public function isCompletato(): bool { return $this->stato_subentro === 'completato'; } public function calcolaTempistiche(): array { $now = now(); $dataSubentro = $this->data_subentro; if ($this->isCompletato()) { $tempoCompletamento = $this->data_completamento->diffInDays($this->created_at); return [ 'stato' => 'completato', 'giorni_completamento' => $tempoCompletamento, 'in_tempo' => $tempoCompletamento <= 30 ]; } $giorniTrascorsi = $this->created_at->diffInDays($now); $giorniAlSubentro = $now->diffInDays($dataSubentro, false); return [ 'stato' => 'in_corso', 'giorni_trascorsi' => $giorniTrascorsi, 'giorni_al_subentro' => $giorniAlSubentro, 'urgente' => $giorniAlSubentro <= 7 && $giorniAlSubentro > 0, 'scaduto' => $giorniAlSubentro < 0 ]; } // === SCOPES === public function scopePending($query) { return $query->whereIn('stato_subentro', ['proposto', 'in_corso']); } public function scopeCompletati($query) { return $query->where('stato_subentro', 'completato'); } public function scopeDelPeriodo($query, $dataInizio, $dataFine) { return $query->whereBetween('data_subentro', [$dataInizio, $dataFine]); } public function scopePerTipo($query, string $tipo) { return $query->where('tipo_subentro', $tipo); } }