'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, ]; } }