193 lines
5.2 KiB
PHP
193 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
|
|
class DocumentoCollegato extends Model
|
|
{
|
|
use SoftDeletes;
|
|
|
|
protected $table = 'documenti_collegati';
|
|
|
|
protected $fillable = [
|
|
'stabile_id',
|
|
'contatto_id', // Riferimento alla rubrica universale (fornitore/assicurazione)
|
|
'tipo_documento', // 'assicurazione', 'pulizia', 'caldaia', 'ascensore', 'regolamento', 'piantine', 'manutenzione'
|
|
'titolo',
|
|
'descrizione',
|
|
'numero_protocollo',
|
|
'data_sottoscrizione',
|
|
'data_scadenza',
|
|
'data_disdetta_limite', // Data limite per disdetta
|
|
'giorni_preavviso_disdetta', // 90, 60, 30 giorni
|
|
'tipo_contratto', // 'mensile', 'bimestrale', 'trimestrale', 'semestrale', 'annuale'
|
|
'importo_contratto',
|
|
'valuta',
|
|
'stato_documento', // 'attivo', 'scaduto', 'disdetto', 'rinnovato'
|
|
'numero_pagine_totali',
|
|
'path_file_originale',
|
|
'path_file_scansione',
|
|
'note',
|
|
'creato_da',
|
|
'modificato_da'
|
|
];
|
|
|
|
protected $casts = [
|
|
'data_sottoscrizione' => 'date',
|
|
'data_scadenza' => 'date',
|
|
'data_disdetta_limite' => 'date',
|
|
'importo_contratto' => 'decimal:2',
|
|
'giorni_preavviso_disdetta' => 'integer',
|
|
'numero_pagine_totali' => 'integer',
|
|
'created_at' => 'datetime',
|
|
'updated_at' => 'datetime',
|
|
'deleted_at' => 'datetime',
|
|
];
|
|
|
|
/**
|
|
* Relazione con Stabile
|
|
*/
|
|
public function stabile()
|
|
{
|
|
return $this->belongsTo(Stabile::class, 'stabile_id');
|
|
}
|
|
|
|
/**
|
|
* Relazione con RubricaUniversale (fornitore/assicurazione)
|
|
*/
|
|
public function contatto()
|
|
{
|
|
return $this->belongsTo(RubricaUniversale::class, 'contatto_id');
|
|
}
|
|
|
|
/**
|
|
* Relazione con utente che ha creato
|
|
*/
|
|
public function createBy()
|
|
{
|
|
return $this->belongsTo(User::class, 'creato_da');
|
|
}
|
|
|
|
/**
|
|
* Relazione con utente che ha modificato
|
|
*/
|
|
public function updatedBy()
|
|
{
|
|
return $this->belongsTo(User::class, 'modificato_da');
|
|
}
|
|
|
|
/**
|
|
* Accessor per protocollo formattato
|
|
*/
|
|
public function getProtocolloFormattatoAttribute()
|
|
{
|
|
$prefissi = [
|
|
'assicurazione' => 'ASS',
|
|
'pulizia' => 'PUL',
|
|
'caldaia' => 'CAL',
|
|
'ascensore' => 'ASC',
|
|
'regolamento' => 'REG',
|
|
'piantine' => 'PIA',
|
|
'manutenzione' => 'MAN',
|
|
];
|
|
|
|
$prefisso = $prefissi[$this->tipo_documento] ?? 'DOC';
|
|
$anno = $this->data_sottoscrizione ? $this->data_sottoscrizione->format('Y') : date('Y');
|
|
|
|
return "{$prefisso}/{$anno}/{$this->numero_protocollo}";
|
|
}
|
|
|
|
/**
|
|
* Accessor per stato scadenza
|
|
*/
|
|
public function getStatoScadenzaAttribute()
|
|
{
|
|
if (!$this->data_scadenza) {
|
|
return 'indefinito';
|
|
}
|
|
|
|
$oggi = now();
|
|
$scadenza = $this->data_scadenza;
|
|
$disdetta = $this->data_disdetta_limite;
|
|
|
|
if ($scadenza->isPast()) {
|
|
return 'scaduto';
|
|
} elseif ($disdetta && $disdetta->isPast()) {
|
|
return 'disdetta_scaduta';
|
|
} elseif ($disdetta && $oggi->diffInDays($disdetta) <= 30) {
|
|
return 'disdetta_imminente';
|
|
} elseif ($oggi->diffInDays($scadenza) <= 90) {
|
|
return 'scadenza_imminente';
|
|
}
|
|
|
|
return 'attivo';
|
|
}
|
|
|
|
/**
|
|
* Accessor per giorni alla scadenza
|
|
*/
|
|
public function getGiorniAllaScadenzaAttribute()
|
|
{
|
|
return $this->data_scadenza ? now()->diffInDays($this->data_scadenza, false) : null;
|
|
}
|
|
|
|
/**
|
|
* Accessor per giorni alla disdetta
|
|
*/
|
|
public function getGiorniAllaDisdettaAttribute()
|
|
{
|
|
return $this->data_disdetta_limite ? now()->diffInDays($this->data_disdetta_limite, false) : null;
|
|
}
|
|
|
|
/**
|
|
* Scope per documenti attivi
|
|
*/
|
|
public function scopeAttivi($query)
|
|
{
|
|
return $query->where('stato_documento', 'attivo');
|
|
}
|
|
|
|
/**
|
|
* Scope per documenti in scadenza
|
|
*/
|
|
public function scopeInScadenza($query, $giorni = 90)
|
|
{
|
|
return $query->where('data_scadenza', '<=', now()->addDays($giorni))
|
|
->where('data_scadenza', '>=', now());
|
|
}
|
|
|
|
/**
|
|
* Scope per tipo documento
|
|
*/
|
|
public function scopeTipo($query, $tipo)
|
|
{
|
|
return $query->where('tipo_documento', $tipo);
|
|
}
|
|
|
|
/**
|
|
* Scope per stabile
|
|
*/
|
|
public function scopePerStabile($query, $stabileId)
|
|
{
|
|
return $query->where('stabile_id', $stabileId);
|
|
}
|
|
|
|
/**
|
|
* Genera etichetta per archivio fisico
|
|
*/
|
|
public function generaEtichettaArchivio()
|
|
{
|
|
return [
|
|
'protocollo' => $this->protocollo_formattato,
|
|
'titolo' => $this->titolo,
|
|
'data_sottoscrizione' => $this->data_sottoscrizione?->format('d/m/Y'),
|
|
'data_scadenza' => $this->data_scadenza?->format('d/m/Y'),
|
|
'pagine_totali' => $this->numero_pagine_totali,
|
|
'contatto' => $this->contatto?->nome_completo,
|
|
'stabile' => $this->stabile?->denominazione,
|
|
];
|
|
}
|
|
}
|