# πŸ“„ SPECIFICHE STAMPE - NetGesCon Laravel **πŸ“… Creato**: 9 Luglio 2025 **🎯 Scopo**: Specifiche per creazione moduli stampa PDF **πŸ‘₯ Team**: Michele + Sviluppatori esterni **πŸ“‹ Status**: Template e specifiche --- ## 🎯 **OBIETTIVO STAMPE** ### πŸ“„ **Moduli PDF da Implementare** Sistema di stampe PDF per documenti condominiali con: - **Template personalizzabili** per ogni amministratore - **Dati compilati** automaticamente da NetGesCon - **Logo e intestazioni** configurabili - **Firme digitali** e timbri - **Invio automatico** email/PEC - **Archiviazione** documenti generati --- ## πŸ—οΈ **ARCHITETTURA STAMPE** ### πŸ“ **Struttura File** ``` netgescon-laravel/ β”œβ”€β”€ resources/views/stampe/ β”‚ β”œβ”€β”€ templates/ β”‚ β”‚ β”œβ”€β”€ base.blade.php # Template base comune β”‚ β”‚ β”œβ”€β”€ intestazione.blade.php # Header personalizzabile β”‚ β”‚ └── footer.blade.php # Footer con firme β”‚ β”œβ”€β”€ documenti/ β”‚ β”‚ β”œβ”€β”€ assemblea/ β”‚ β”‚ β”‚ β”œβ”€β”€ convocazione.blade.php β”‚ β”‚ β”‚ β”œβ”€β”€ verbale.blade.php β”‚ β”‚ β”‚ └── foglio-presenze.blade.php β”‚ β”‚ β”œβ”€β”€ contabilita/ β”‚ β”‚ β”‚ β”œβ”€β”€ estratto-conto.blade.php β”‚ β”‚ β”‚ β”œβ”€β”€ bilancio.blade.php β”‚ β”‚ β”‚ β”œβ”€β”€ rendiconto.blade.php β”‚ β”‚ β”‚ └── sollecito-pagamento.blade.php β”‚ β”‚ β”œβ”€β”€ contratti/ β”‚ β”‚ β”‚ β”œβ”€β”€ contratto-locazione.blade.php β”‚ β”‚ β”‚ β”œβ”€β”€ disdetta.blade.php β”‚ β”‚ β”‚ └── rinnovo.blade.php β”‚ β”‚ └── comunicazioni/ β”‚ β”‚ β”œβ”€β”€ avviso-lavori.blade.php β”‚ β”‚ β”œβ”€β”€ comunicazione-generica.blade.php β”‚ β”‚ └── bollettino-informativo.blade.php β”œβ”€β”€ app/Services/ β”‚ β”œβ”€β”€ StampaService.php # Service principale β”‚ β”œβ”€β”€ PdfGeneratorService.php # Generazione PDF β”‚ └── TemplateService.php # Gestione template β”œβ”€β”€ storage/stampe/ β”‚ β”œβ”€β”€ generated/ # PDF generati β”‚ β”œβ”€β”€ templates/ # Template personalizzati β”‚ └── assets/ # Logo, firme, timbri ``` ### βš™οΈ **Tecnologie** ```php // Package consigliati "dompdf/dompdf": "^2.0", // PDF generation "barryvdh/laravel-dompdf": "^2.0", // Laravel integration "intervention/image": "^2.7", // Image manipulation "spatie/laravel-pdf": "^1.0" // Alternative PDF ``` --- ## πŸ“‹ **DOCUMENTI PRIORITARI** ### 🏠 **1. Assemblee Condominiali** #### **πŸ“„ Convocazione Assemblea** ```php // Dati richiesti da NetGesCon $dati_convocazione = [ 'condominio' => [ 'denominazione' => 'Condominio Verdi', 'indirizzo' => 'Via Giuseppe Verdi 12, Milano', 'codice_fiscale' => '80012345678' ], 'amministratore' => [ 'nome_completo' => 'Dott. Mario Rossi', 'indirizzo_studio' => 'Via Roma 1, Milano', 'telefono' => '+39 02 1234567', 'email' => 'admin@studio.com', 'pec' => 'admin@pec.studio.com' ], 'assemblea' => [ 'data_prima_convocazione' => '2024-03-15 18:00', 'data_seconda_convocazione' => '2024-03-15 19:00', 'luogo' => 'Sala riunioni - Via Verdi 12', 'ordine_giorno' => [ '1. Approvazione verbale assemblea precedente', '2. Relazione amministratore gestione 2023', '3. Approvazione bilancio consuntivo 2023', '4. Approvazione bilancio preventivo 2024', '5. Nomina amministratore e determinazione compenso', '6. Lavori manutenzione straordinaria tetto', '7. Varie ed eventuali' ] ], 'condomini' => [ [ 'nome_completo' => 'Mario Bianchi', 'unita' => 'Appartamento 1', 'millesimi' => 95, 'indirizzo_corrispondenza' => 'Via Verdi 12, Milano' ], // ... altri condomini ], 'allegati' => [ 'bilancio_consuntivo_2023.pdf', 'bilancio_preventivo_2024.pdf', 'preventivo_lavori_tetto.pdf' ] ]; ``` #### **πŸ“‹ Verbale Assemblea** ```php $dati_verbale = [ 'assemblea' => [ 'data' => '2024-03-15 18:30', 'presidente' => 'Mario Bianchi', 'segretario' => 'Dott. Mario Rossi (Amministratore)', 'tipo_convocazione' => 'prima', // prima|seconda 'millesimi_presenti' => 650, // su 1000 'millesimi_rappresentati' => 750, 'validita' => true ], 'presenze' => [ [ 'condomino' => 'Mario Bianchi', 'unita' => 'Appartamento 1', 'millesimi' => 95, 'presente' => true, 'rappresentato_da' => null ], [ 'condomino' => 'Giulia Verdi', 'unita' => 'Appartamento 3', 'millesimi' => 105, 'presente' => false, 'rappresentato_da' => 'Mario Bianchi' ] ], 'deliberazioni' => [ [ 'numero' => 1, 'oggetto' => 'Approvazione verbale assemblea precedente', 'votazione' => [ 'favorevoli' => 650, 'contrari' => 0, 'astenuti' => 100 ], 'esito' => 'approvata', 'note' => '' ] ] ]; ``` ### πŸ’° **2. Documenti Contabili** #### **πŸ’³ Estratto Conto Condomino** ```php $dati_estratto = [ 'periodo' => [ 'data_inizio' => '2024-01-01', 'data_fine' => '2024-12-31', 'gestione' => 'Gestione Ordinaria 2024' ], 'condomino' => [ 'nome_completo' => 'Mario Bianchi', 'codice_fiscale' => 'BNCMRA70A01F205X', 'unita' => 'Appartamento 1', 'millesimi_proprieta' => 95, 'millesimi_riscaldamento' => 145 ], 'movimenti' => [ [ 'data' => '2024-01-15', 'descrizione' => 'Rata I trimestre 2024', 'dare' => 350.00, 'avere' => 0.00, 'saldo' => 350.00 ], [ 'data' => '2024-01-20', 'descrizione' => 'Pagamento rata trimestrale', 'dare' => 0.00, 'avere' => 350.00, 'saldo' => 0.00 ] ], 'ripartizioni' => [ 'spese_generali' => [ 'pulizie' => 85.50, 'ascensore' => 57.00, 'giardino' => 28.50, 'amministrazione' => 42.75 ], 'spese_riscaldamento' => [ 'gas_metano' => 195.30, 'manutenzione_caldaia' => 34.80 ] ], 'saldo_finale' => [ 'precedente' => 150.00, 'movimenti_periodo' => -25.50, 'finale' => 124.50, 'tipo' => 'credito' // credito|debito ] ]; ``` #### **πŸ“Š Bilancio Consuntivo** ```php $dati_bilancio = [ 'esercizio' => '2024', 'periodo' => '01/01/2024 - 31/12/2024', 'entrate' => [ 'categorie' => [ 'rate_condominiali' => [ 'preventivo' => 16800.00, 'consuntivo' => 16950.00, 'scostamento' => 150.00 ], 'interessi_mora' => [ 'preventivo' => 0.00, 'consuntivo' => 45.30, 'scostamento' => 45.30 ] ], 'totale_preventivo' => 16800.00, 'totale_consuntivo' => 16995.30, 'totale_scostamento' => 195.30 ], 'uscite' => [ 'categorie' => [ 'pulizie' => [ 'preventivo' => 3600.00, 'consuntivo' => 3480.00, 'scostamento' => -120.00, 'dettaglio' => [ 'Pulizie Srl - Servizio annuale' => 3480.00 ] ], 'riscaldamento' => [ 'preventivo' => 4500.00, 'consuntivo' => 4650.30, 'scostamento' => 150.30, 'dettaglio' => [ 'Eni Gas - Consumo annuale' => 4200.30, 'Tecnico caldaia - Manutenzione' => 450.00 ] ] ], 'totale_preventivo' => 15800.00, 'totale_consuntivo' => 15234.80, 'totale_scostamento' => -565.20 ], 'risultato' => [ 'avanzo_precedente' => 1200.00, 'avanzo_esercizio' => 1760.50, 'fondo_cassa' => 2960.50 ] ]; ``` ### πŸ“ **3. Comunicazioni** #### **πŸ”§ Avviso Lavori** ```php $dati_avviso_lavori = [ 'lavori' => [ 'tipo' => 'Rifacimento tetto', 'descrizione' => 'Sostituzione completa manto di copertura e impermeabilizzazione', 'data_inizio' => '2024-06-01', 'data_fine_prevista' => '2024-08-31', 'orario' => '08:00 - 17:00 (LunedΓ¬-VenerdΓ¬)', 'ditta_esecutrice' => 'Edilizia Moderna Srl' ], 'informazioni' => [ 'accesso_condomini' => 'Garantito tramite scala di sicurezza', 'rumori' => 'Previsti rumori nelle ore 08:00-12:00 e 14:00-17:00', 'parcheggio' => 'Riduzione posti auto per cantiere (2 posti su 6)', 'contatti_emergenza' => '+39 333 1234567 (Capo cantiere)' ], 'precauzioni' => [ 'Evitare stendere panni nei balconi esposti', 'Tenere chiuse finestre mansarda durante i lavori', 'Segnalare immediatamente eventuali infiltrazioni' ] ]; ``` --- ## 🎨 **TEMPLATE DESIGN** ### πŸ“„ **Template Base** ```blade {{-- resources/views/stampe/templates/base.blade.php --}} {{ $documento_tipo }} - {{ $condominio_denominazione }} @include('stampe.templates.intestazione')
@yield('contenuto')
@include('stampe.templates.footer') ``` ### 🏒 **Intestazione Personalizzabile** ```blade {{-- resources/views/stampe/templates/intestazione.blade.php --}}
@if($amministratore_logo) @endif
{{ $amministratore_nome }}
{{ $amministratore_indirizzo }}
Tel: {{ $amministratore_telefono }}
@if($amministratore_email) Email: {{ $amministratore_email }}
@endif @if($amministratore_pec) PEC: {{ $amministratore_pec }}
@endif @if($amministratore_partita_iva) P.IVA: {{ $amministratore_partita_iva }} @endif

{{ $documento_tipo }}

{{ $condominio_denominazione }}
{{ $condominio_indirizzo }}
@if($condominio_codice_fiscale) C.F.: {{ $condominio_codice_fiscale }} @endif
``` --- ## πŸ”§ **IMPLEMENTAZIONE SERVIZI** ### πŸ“„ **StampaService principale** ```php preparaDatiConvocazione($assemblea); return $this->pdfGenerator->genera( 'stampe.documenti.assemblea.convocazione', $dati, $opzioni ); } /** * Genera estratto conto condomino */ public function generaEstrattoConto( Soggetto $condomino, Carbon $dataInizio, Carbon $dataFine, array $opzioni = [] ): string { $dati = $this->preparaDatiEstrattoConto( $condomino, $dataInizio, $dataFine ); return $this->pdfGenerator->genera( 'stampe.documenti.contabilita.estratto-conto', $dati, $opzioni ); } /** * Genera bilancio consuntivo */ public function generaBilancioConsuntivo( Bilancio $bilancio, array $opzioni = [] ): string { $dati = $this->preparaDatiBilancio($bilancio); return $this->pdfGenerator->genera( 'stampe.documenti.contabilita.bilancio', $dati, $opzioni ); } private function preparaDatiConvocazione(Assemblea $assemblea): array { return [ 'documento_tipo' => 'CONVOCAZIONE ASSEMBLEA CONDOMINIALE', 'condominio' => [ 'denominazione' => $assemblea->stabile->denominazione, 'indirizzo' => $assemblea->stabile->indirizzo_completo, 'codice_fiscale' => $assemblea->stabile->codice_fiscale ], 'amministratore' => $this->getDatiAmministratore($assemblea->stabile), 'assemblea' => [ 'data_prima_convocazione' => $assemblea->data_prima_convocazione, 'data_seconda_convocazione' => $assemblea->data_seconda_convocazione, 'luogo' => $assemblea->luogo, 'ordine_giorno' => $assemblea->ordine_giorno ], 'condomini' => $this->getCondominiConMillesimi($assemblea->stabile), 'data_generazione' => now()->format('d/m/Y H:i') ]; } } ``` ### 🎨 **PdfGeneratorService** ```php 'A4', 'orientation' => 'portrait', 'margin_top' => 20, 'margin_right' => 15, 'margin_bottom' => 20, 'margin_left' => 15, 'font_size' => 11, 'font_family' => 'DejaVu Sans' ], $opzioni); // Genera PDF $pdf = Pdf::loadView($template, $dati) ->setPaper($opzioni['format'], $opzioni['orientation']) ->setOptions([ 'dpi' => 150, 'defaultFont' => $opzioni['font_family'], 'isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true ]); // Salva file $filename = $this->generaNomeFile($dati, $template); $path = "stampe/generated/{$filename}"; Storage::put($path, $pdf->output()); return $path; } private function generaNomeFile(array $dati, string $template): string { $timestamp = now()->format('Y-m-d_H-i-s'); $tipo_documento = str_replace(['stampe.documenti.', '.'], ['', '_'], $template); $condominio = str_slug($dati['condominio']['denominazione'] ?? 'documento'); return "{$tipo_documento}_{$condominio}_{$timestamp}.pdf"; } } ``` --- ## πŸ“§ **INTEGRAZIONE EMAIL** ### πŸ“¨ **Invio Automatico** ```php // app/Mail/DocumentoCondominialeGenerated.php namespace App\Mail; use Illuminate\Mail\Mailable; class DocumentoCondominialeGenerated extends Mailable { public function __construct( private string $tipoDocumento, private string $pathDocumento, private array $destinatari ) {} public function build() { return $this->view('emails.documento-generato') ->subject("Nuovo documento: {$this->tipoDocumento}") ->attach(storage_path("app/{$this->pathDocumento}")); } } ``` --- ## πŸ”§ **CONTROLLER INTEGRATION** ### πŸ“‹ **StampeController** ```php stampaService->generaConvocazioneAssemblea($assemblea); return response()->download(storage_path("app/{$pathPdf}")); } public function estrattoContoCondomino(Request $request) { $request->validate([ 'condomino_id' => 'required|exists:soggetti,id', 'data_inizio' => 'required|date', 'data_fine' => 'required|date|after:data_inizio' ]); $condomino = Soggetto::findOrFail($request->condomino_id); $pathPdf = $this->stampaService->generaEstrattoConto( $condomino, Carbon::parse($request->data_inizio), Carbon::parse($request->data_fine) ); return response()->download(storage_path("app/{$pathPdf}")); } } ``` --- ## πŸ“Š **CONFIGURAZIONE AMMINISTRATORI** ### βš™οΈ **Template Personalizzabili** ```php // app/Models/AmministratoreTemplate.php class AmministratoreTemplate extends Model { protected $fillable = [ 'amministratore_id', 'tipo_documento', 'template_html', 'css_personalizzato', 'logo_path', 'firma_digitale_path', 'attivo' ]; protected $casts = [ 'attivo' => 'boolean' ]; } ``` --- ## πŸš€ **DEPLOYMENT STAMPE** ### πŸ“¦ **Package Installation** ```bash # Install PDF packages composer require barryvdh/laravel-dompdf composer require intervention/image # Publish config php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" # Create directories mkdir -p storage/stampe/{generated,templates,assets} # Set permissions chmod -R 775 storage/stampe/ ``` ### βš™οΈ **Configuration** ```php // config/dompdf.php return [ 'show_warnings' => false, 'public_path' => public_path(), 'convert_entities' => true, 'options' => [ 'font_dir' => storage_path('fonts/'), 'font_cache' => storage_path('fonts/'), 'temp_dir' => sys_get_temp_dir(), 'chroot' => realpath(base_path()), 'allowed_protocols' => [ 'file://' => ['rules' => []], 'http://' => ['rules' => []], 'https://' => ['rules' => []] ], 'log_output_file' => null, 'enable_font_subsetting' => false, 'pdf_backend' => 'CPDF', 'default_media_type' => 'screen', 'default_paper_size' => 'a4', 'default_paper_orientation' => 'portrait', 'default_font' => 'DejaVu Sans', 'dpi' => 96, 'enable_php' => false, 'enable_javascript' => true, 'enable_remote' => true, 'font_height_ratio' => 1.1, 'enable_html5_parser' => true ] ]; ``` --- ## πŸ“ž **DELIVERABLE PER SVILUPPATORI** ### πŸ“‹ **Cosa Fornire** 1. **πŸ“ Templates Blade** completi per ogni documento 2. **🎨 CSS Styles** responsive e print-friendly 3. **πŸ“Š Data Structure** per ogni tipo documento 4. **πŸ”§ Service Classes** per generazione PDF 5. **πŸ“§ Email Integration** per invio automatico 6. **βš™οΈ Admin Interface** per configurazione template 7. **πŸ“ Documentation** completa utilizzo 8. **πŸ§ͺ Test Cases** per ogni documento ### πŸ“Š **Specifiche Tecniche** - **Format**: PDF/A per archiviazione a lungo termine - **Resolution**: 150 DPI per stampa professionale - **Fonts**: DejaVu Sans (supporto caratteri speciali) - **Size**: Ottimizzazione file <2MB per documento - **Accessibility**: PDF accessibile screen reader - **Security**: Protezione copia/modifica se richiesta --- *πŸ“„ Specifiche complete per implementazione sistema stampe* *πŸ”„ Aggiornare dopo implementazione con feedback reale* *πŸ“ž Coordinamento con team sviluppo esterno consigliato*