GESTIONE DOCUMENTI 1. Cosa Avevamo Previsto di Archiviare L'obiettivo era creare un sistema in grado di gestire qualsiasi tipo di file rilevante per la gestione condominiale, tra cui: Fatture Elettroniche (XML): Questo era il punto di partenza. Non solo archiviare il file, ma anche estrarne i dati per automatizzare la contabilità. Fatture Passive (PDF): Le classiche fatture in PDF. Verbali di Assemblea (PDF/DOCX): Per avere uno storico consultabile. Contratti di Fornitura (PDF): Contratti con fornitori, assicurazioni, etc. Preventivi (PDF): Preventivi ricevuti e inviati. Documenti di Identità: Dei soggetti o dei legali rappresentanti. Foto e Immagini: Relative a sinistri, lavori, o per documentare lo stato di un immobile. 2. Come Avevamo Previsto di Gestirli: L'Architettura La soluzione che avevamo definito è basata su un concetto chiave di Laravel: le Relazioni Polimorfiche. Invece di creare una tabella documenti_stabile, una documenti_fornitore, etc., avevamo pianificato di creare una sola tabella documenti centrale e di renderla "collegabile" a qualsiasi altra entità del sistema. Nuova Tabella: documenti Scopo: Un archivio unico per tutti i file, con un sistema di collegamento intelligente. Nome Campo Tipo Dati Chiave/Indice Note id BIGINT (PK) Chiave primaria. documentable_id BIGINT INDEX L'ID del modello a cui è collegato (es. id_stabile, id_fornitore). documentable_type VARCHAR(255) INDEX La classe del modello (es. App\Models\Stabile). Questo è il cuore della polimorfia. nome_file VARCHAR(255) Nome originale del file caricato. path_file VARCHAR(255) Percorso del file nello storage di Laravel. tipo_documento VARCHAR(255) Categoria (es. 'Fattura', 'Verbale', 'Contratto', 'Altro'). descrizione TEXT Note opzionali sul documento. created_at, updated_at TIMESTAMP Timestamps standard. 3. Il Piano di Lavoro per il Team Per rendere questo sistema funzionante, ecco i passaggi che il team di sviluppo deve seguire: Creare la Migration: Scrivere il file di migrazione per la tabella documenti come descritta sopra, assicurandosi di definire i campi documentable_id e documentable_type. Creare il Modello Documento: Creare il modello App\Models\Documento.php. All'interno del modello, definire la relazione polimorfica inversa: php public function documentable() { return $this->morphTo(); } Aggiornare i Modelli Esistenti: In ogni modello che può avere documenti (es. Stabile.php, Fornitore.php, Ticket.php, etc.), aggiungere la relazione polimorfica "in avanti": php // In Stabile.php, Fornitore.php, etc. public function documenti() { return $this->morphMany('App\Models\Documento', 'documentable'); } Questo permetterà di fare chiamate intuitive come $stabile->documenti per ottenere tutti i file associati a quello stabile. Sviluppare il DocumentoController: Creare un controller per gestire la logica di upload, visualizzazione e cancellazione dei file. Il metodo store dovrà: Validare il file caricato. Salvare il file nello storage di Laravel (es. storage/app/public/documenti/{stabile_id}/...). Creare un nuovo record nella tabella documenti, popolando documentable_id e documentable_type con i dati del modello a cui si sta allegando il file. Integrare l'Interfaccia Utente: Nella pagina di dettaglio di ogni entità (es. admin.stabili.show), aggiungere un nuovo TAB "Documenti". Questo tab conterrà un form per l'upload di nuovi file e una tabella che elenca tutti i documenti già associati a quell'entità, con pulsanti per il download e la cancellazione. Questo approccio è estremamente potente e scalabile. Ci permette di avere un sistema di gestione documentale centralizzato, pulito e facilmente estendibile a qualsiasi nuova funzionalità che aggiungeremo in futuro. L'idea di base è smettere di pensare al documento come a un semplice file, ma come a un oggetto digitale composto da due parti: il file originale e i metadati associati. 1. Il Concetto Fondamentale: Metadati + File Ogni documento che carichi nel sistema dovrebbe avere una "carta d'identità" nel database, separata dal file fisico. Tabella documenti nel database: Questa tabella non contiene il file, ma le informazioni sul file. id (PK) protocollo (es. 2025-0001) data_protocollo tipo_documento (Fattura, Contratto, Estratto Conto, Verbale...) stabile_id (FK alla tabella stabili) fornitore_id (FK alla tabella fornitori, se applicabile) esercizio_contabile_id (FK all'esercizio di riferimento) descrizione importo (se applicabile) data_documento percorso_file (il path dove il file è salvato, es. documenti/2025/fattura_xyz.pdf) testo_estratto_ocr (un campo TEXT dove salveremo il contenuto testuale del documento) Storage (Archiviazione): I file fisici (PDF, XML, JPG) vengono salvati in una cartella specifica sul server o, ancora meglio, su un servizio di cloud storage come Amazon S3, Google Cloud Storage o DigitalOcean Spaces. Laravel, con il suo sistema di Filesystem, rende trasparente l'uso di questi servizi. 2. Protocollo Intelligente e Automazione dell'Acquisizione Quando carichi un documento, il sistema deve fare molto più che salvarlo. Fatture Elettroniche (XML): Questa è la tua più grande opportunità di automazione. Essendo file XML, sono dati strutturati. Il tuo sistema dovrebbe: Leggere l'XML: Estrarre automaticamente Fornitore (Partita IVA), Data, Numero Fattura, Importo Totale e descrizione delle righe. Compilare i Metadati: Pre-compilare la "carta d'identità" del documento. L'utente deve solo verificare e confermare. Archiviazione: Salvare sia il file XML originale che una versione PDF di cortesia (che puoi generare o che è già allegata). PDF e Immagini (Contratti, Ricevute, ecc.): Qui entra in gioco la tecnologia OCR (Optical Character Recognition). Coda di Elaborazione: Quando l'utente carica un PDF o un'immagine, Laravel dovrebbe mettere il file in una coda di elaborazione (Laravel Queues). Questo evita che l'utente debba attendere. Processo OCR: Un processo in background analizza il file. Hai due strade: Open Source: Usare una libreria come Tesseract. Richiede più configurazione ma è gratuita. Servizi Cloud (Consigliato): Usare API come Google Vision AI o Amazon Textract. Sono incredibilmente potenti (Textract è specializzato nel riconoscere tabelle e dati da fatture) e paghi solo per quello che usi. Salvataggio del Testo: Il testo estratto dall'OCR viene salvato nel campo testo_estratto_ocr della tabella documenti. 3. Organizzazione Flessibile e Ricerca Potente Etichette (Tags) invece di Categorie Rigide: Oltre al tipo_documento, permetti all'utente di applicare delle etichette (tags) ai documenti. Una singola fattura potrebbe essere etichettata come manutenzione, ascensore, straordinaria. Questo rende la ricerca e il raggruppamento molto più flessibili. Collegamento tra Documenti: Crea la possibilità di collegare i documenti tra loro. Un verbale di assemblea può essere collegato a un contratto d'appalto. Un contratto può essere collegato a tutte le fatture emesse da quel fornitore. Una fattura può essere collegata al movimento dell'estratto conto che la salda. Ricerca Full-Text (La Funzionalità Killer): Ora che hai il testo di ogni documento nel database (o estratto dall'XML o dall'OCR), puoi implementare una ricerca potentissima. Laravel Scout è lo strumento perfetto per questo. È un pacchetto ufficiale di Laravel che si integra con motori di ricerca come MeiliSearch (leggero e velocissimo) o Elasticsearch. Quando un utente cerca "sostituzione pompa", Scout cercherà quella frase non solo nei metadati (descrizione, tipo), ma anche all'interno di tutti i documenti, inclusi i PDF scansionati, restituendo risultati istantanei. Questo approccio trasforma un semplice archivio di file in un vero e proprio centro di conoscenza intelligente per l'amministratore, dove trovare qualsiasi informazione è questione di secondi.