162 lines
4.3 KiB
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);
|
|
}
|
|
}
|