netgescon-master/_BACKUP_OLD_netgescon-laravel_INACTIVE/app/Models/SubentroUnita.php

162 lines
4.3 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class SubentroUnita extends Model
{
protected $table = 'subentri_unita';
protected $fillable = [
'unita_immobiliare_id',
'soggetto_precedente_id',
'soggetto_nuovo_id',
'data_subentro',
'tipo_subentro',
'quota_precedente',
'quota_nuova',
'numero_atto',
'data_atto',
'notaio',
'prezzo_vendita',
'stato_subentro',
'data_completamento',
'ripartizioni_aggiornate',
'comunicazioni_inviate',
'note',
'allegati',
'created_by'
];
protected $casts = [
'data_subentro' => '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);
}
}