netgescon-master/app/Models/DocumentoCollegato.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,
];
}
}