seedTemplates(); $this->seedConfigurations(); // Solo in development, aggiungi dati di test if (app()->environment('local', 'development')) { $this->seedTestData(); } } /** * Seed template di base */ private function seedTemplates(): void { $templates = [ [ 'nome' => 'Template Rata Standard', 'descrizione' => 'Template base per la stampa delle rate condominiali', 'categoria' => 'rate_standard', 'html_content' => $this->getTemplateRataStandard(), 'css_content' => $this->getCssRataStandard(), 'variabili' => json_encode([ 'condominio' => ['nome', 'indirizzo', 'codice_fiscale', 'amministratore', 'telefono', 'email'], 'proprietario' => ['nome', 'indirizzo', 'codice_fiscale', 'interno', 'millesimi'], 'rata' => ['numero', 'importo', 'scadenza', 'descrizione', 'periodo', 'note'], 'sistema' => ['data_stampa', 'numero_pagina', 'totale_pagine'] ]), 'tags' => 'standard,base,rate,condominiali', 'status' => 'attivo', 'versione' => '1.0.0', 'is_pubblico' => true, 'created_by' => 1, 'created_at' => now(), 'updated_at' => now() ], [ 'nome' => 'Template Avviso Scadenza', 'descrizione' => 'Template per avvisi di pagamento in scadenza o scaduti', 'categoria' => 'avvisi', 'html_content' => $this->getTemplateAvvisoScadenza(), 'css_content' => $this->getCssAvvisoScadenza(), 'variabili' => json_encode([ 'condominio' => ['nome', 'indirizzo', 'amministratore', 'telefono'], 'proprietario' => ['nome', 'indirizzo', 'interno'], 'rata' => ['numero', 'importo', 'scadenza', 'giorni_ritardo', 'interessi_mora'], 'avviso' => ['tipo', 'sollecito_numero', 'note_legali'] ]), 'tags' => 'avviso,scadenza,solleciti,mora', 'status' => 'attivo', 'versione' => '1.0.0', 'is_pubblico' => true, 'created_by' => 1, 'created_at' => now(), 'updated_at' => now() ], [ 'nome' => 'Template Riepilogativo Annuale', 'descrizione' => 'Template per il riepilogo annuale dei pagamenti', 'categoria' => 'riepilogativo', 'html_content' => $this->getTemplateRiepilogativo(), 'css_content' => $this->getCssRiepilogativo(), 'variabili' => json_encode([ 'condominio' => ['nome', 'indirizzo', 'amministratore'], 'proprietario' => ['nome', 'interno', 'millesimi'], 'riepilogo' => ['anno', 'totale_dovuto', 'totale_pagato', 'saldo', 'rate_pagate', 'rate_scadute'], 'dettaglio_rate' => ['lista_rate', 'pagamenti', 'saldi_mese'] ]), 'tags' => 'riepilogo,annuale,saldo,pagamenti', 'status' => 'attivo', 'versione' => '1.0.0', 'is_pubblico' => true, 'created_by' => 1, 'created_at' => now(), 'updated_at' => now() ], [ 'nome' => 'Template Moderno Colorato', 'descrizione' => 'Template moderno con design colorato e professionale', 'categoria' => 'rate_personalizzate', 'html_content' => $this->getTemplateModerno(), 'css_content' => $this->getCssModerno(), 'variabili' => json_encode([ 'condominio' => ['nome', 'indirizzo', 'logo_url'], 'proprietario' => ['nome', 'interno'], 'rata' => ['numero', 'importo', 'scadenza', 'descrizione'], 'design' => ['colore_primario', 'colore_secondario', 'font_family'] ]), 'tags' => 'moderno,colorato,design,professionale', 'status' => 'attivo', 'versione' => '1.0.0', 'is_pubblico' => true, 'created_by' => 1, 'created_at' => now(), 'updated_at' => now() ], [ 'nome' => 'Template Minimale', 'descrizione' => 'Template essenziale e pulito per stampe veloci', 'categoria' => 'rate_standard', 'html_content' => $this->getTemplateMinimale(), 'css_content' => $this->getCssMinimale(), 'variabili' => json_encode([ 'condominio' => ['nome'], 'proprietario' => ['nome', 'interno'], 'rata' => ['numero', 'importo', 'scadenza'] ]), 'tags' => 'minimale,veloce,essenziale,semplice', 'status' => 'attivo', 'versione' => '1.0.0', 'is_pubblico' => true, 'created_by' => 1, 'created_at' => now(), 'updated_at' => now() ] ]; foreach ($templates as $template) { DB::table('stampe_templates')->insert($template); } echo "✅ Creati " . count($templates) . " template di base\n"; } /** * Seed configurazioni modulo */ private function seedConfigurations(): void { $configurations = [ [ 'chiave' => 'stampe_rate.pdf_engine', 'valore' => 'dompdf', 'tipo' => 'string', 'descrizione' => 'Engine per generazione PDF (dompdf, wkhtmltopdf, tcpdf)', 'is_public' => false ], [ 'chiave' => 'stampe_rate.default_font_size', 'valore' => '12', 'tipo' => 'number', 'descrizione' => 'Dimensione font di default per i PDF', 'is_public' => true ], [ 'chiave' => 'stampe_rate.default_paper_size', 'valore' => 'A4', 'tipo' => 'string', 'descrizione' => 'Formato carta di default (A4, A3, Letter)', 'is_public' => true ], [ 'chiave' => 'stampe_rate.logo_path', 'valore' => '/images/logo.png', 'tipo' => 'string', 'descrizione' => 'Percorso del logo aziendale', 'is_public' => true ], [ 'chiave' => 'stampe_rate.email_from_name', 'valore' => 'Amministratore Condominio', 'tipo' => 'string', 'descrizione' => 'Nome mittente per le email', 'is_public' => false ], [ 'chiave' => 'stampe_rate.email_from_address', 'valore' => 'admin@netgescon.local', 'tipo' => 'string', 'descrizione' => 'Indirizzo email mittente', 'is_public' => false ], [ 'chiave' => 'stampe_rate.auto_cleanup_days', 'valore' => '90', 'tipo' => 'number', 'descrizione' => 'Giorni dopo i quali eliminare automaticamente le stampe', 'is_public' => false ], [ 'chiave' => 'stampe_rate.max_file_size', 'valore' => '10485760', 'tipo' => 'number', 'descrizione' => 'Dimensione massima file in bytes (10MB)', 'is_public' => false ], [ 'chiave' => 'stampe_rate.email_tracking_enabled', 'valore' => 'true', 'tipo' => 'boolean', 'descrizione' => 'Abilita tracking aperture email', 'is_public' => false ], [ 'chiave' => 'stampe_rate.watermark_text', 'valore' => '', 'tipo' => 'string', 'descrizione' => 'Testo watermark sui PDF (vuoto = disabilitato)', 'is_public' => true ], [ 'chiave' => 'stampe_rate.default_template_id', 'valore' => '1', 'tipo' => 'number', 'descrizione' => 'ID del template di default', 'is_public' => true ], [ 'chiave' => 'stampe_rate.batch_email_limit', 'valore' => '50', 'tipo' => 'number', 'descrizione' => 'Limite invii email in batch', 'is_public' => false ], [ 'chiave' => 'stampe_rate.template_cache_enabled', 'valore' => 'true', 'tipo' => 'boolean', 'descrizione' => 'Abilita cache per i template compilati', 'is_public' => false ], [ 'chiave' => 'stampe_rate.pdf_compression', 'valore' => 'true', 'tipo' => 'boolean', 'descrizione' => 'Abilita compressione PDF', 'is_public' => true ], [ 'chiave' => 'stampe_rate.footer_text', 'valore' => 'Generato da NetGescon - Sistema di Gestione Condominiale', 'tipo' => 'string', 'descrizione' => 'Testo footer di default', 'is_public' => true ] ]; foreach ($configurations as $config) { $config['updated_by'] = 1; $config['created_at'] = now(); $config['updated_at'] = now(); DB::table('stampe_rate_config')->insert($config); } echo "✅ Create " . count($configurations) . " configurazioni base\n"; } /** * Seed dati di test (solo development) */ private function seedTestData(): void { // Crea alcune stampe di test $stampeTest = [ [ 'nome' => 'Test Stampa Rate Gennaio 2025', 'descrizione' => 'Stampa di test per le rate di gennaio', 'tipo_documento' => 'rata_multipla', 'status' => 'generata', 'template_id' => 1, 'stabile_id' => 1, 'rate_selezionate' => json_encode([1, 2, 3, 4, 5]), 'proprietari_selezionati' => json_encode([1, 2, 3, 4]), 'parametri_stampa' => json_encode([ 'font_size' => 12, 'paper_size' => 'A4', 'margins' => ['top' => 20, 'bottom' => 20, 'left' => 15, 'right' => 15] ]), 'file_count' => 4, 'file_size_total' => 2048576, 'download_count' => 3, 'created_by' => 1, 'created_at' => now()->subDays(5), 'updated_at' => now()->subDays(5) ], [ 'nome' => 'Avvisi Scadenza Dicembre 2024', 'descrizione' => 'Avvisi per rate scadute di dicembre', 'tipo_documento' => 'avviso_scadenza', 'status' => 'inviata', 'template_id' => 2, 'stabile_id' => 1, 'rate_selezionate' => json_encode([10, 11]), 'proprietari_selezionati' => json_encode([2, 5]), 'email_abilitata' => true, 'email_subject' => 'Avviso pagamento in scadenza', 'email_inviate_count' => 2, 'email_aperte_count' => 1, 'file_count' => 2, 'created_by' => 1, 'created_at' => now()->subDays(10), 'updated_at' => now()->subDays(8) ] ]; foreach ($stampeTest as $stampa) { DB::table('stampe_rate')->insert($stampa); } // Crea cronologia di test $historyTest = [ [ 'stampa_id' => 1, 'action' => 'created', 'dettagli' => 'Stampa creata dall\'utente admin', 'ip_address' => '127.0.0.1', 'created_by' => 1, 'created_at' => now()->subDays(5) ], [ 'stampa_id' => 1, 'action' => 'generated', 'dettagli' => 'PDF generati con successo (4 file)', 'ip_address' => '127.0.0.1', 'created_by' => 1, 'created_at' => now()->subDays(5) ], [ 'stampa_id' => 1, 'action' => 'downloaded', 'dettagli' => 'Download ZIP con tutti i file', 'ip_address' => '127.0.0.1', 'created_by' => 1, 'created_at' => now()->subDays(3) ], [ 'stampa_id' => 2, 'action' => 'created', 'dettagli' => 'Avviso scadenza creato', 'ip_address' => '127.0.0.1', 'created_by' => 1, 'created_at' => now()->subDays(10) ], [ 'stampa_id' => 2, 'action' => 'sent', 'dettagli' => 'Email inviate a 2 destinatari', 'ip_address' => '127.0.0.1', 'created_by' => 1, 'created_at' => now()->subDays(8) ] ]; foreach ($historyTest as $history) { DB::table('stampe_rate_history')->insert($history); } // Crea log email di test $emailTest = [ [ 'stampa_id' => 2, 'tracking_id' => (string) Str::uuid(), 'unsubscribe_token' => Str::random(32), 'recipient_email' => 'proprietario1@example.com', 'recipient_name' => 'Mario Rossi', 'recipient_type' => 'proprietario', 'proprietario_id' => 2, 'subject' => 'Avviso pagamento in scadenza - Condominio Via Roma', 'body_html' => '

Gentile proprietario, la informiamo che...

', 'status' => 'sent', 'sent_at' => now()->subDays(8), 'opened_at' => now()->subDays(7), 'opened_count' => 2, 'opened_ip' => '192.168.1.100', 'sent_by' => 1, 'created_at' => now()->subDays(8), 'updated_at' => now()->subDays(7) ], [ 'stampa_id' => 2, 'tracking_id' => (string) Str::uuid(), 'unsubscribe_token' => Str::random(32), 'recipient_email' => 'proprietario2@example.com', 'recipient_name' => 'Giuseppe Verdi', 'recipient_type' => 'proprietario', 'proprietario_id' => 5, 'subject' => 'Avviso pagamento in scadenza - Condominio Via Roma', 'body_html' => '

Gentile proprietario, la informiamo che...

', 'status' => 'sent', 'sent_at' => now()->subDays(8), 'sent_by' => 1, 'created_at' => now()->subDays(8), 'updated_at' => now()->subDays(8) ] ]; foreach ($emailTest as $email) { DB::table('stampe_rate_email_log')->insert($email); } echo "✅ Creati dati di test per il modulo\n"; } // Template HTML/CSS private function getTemplateRataStandard(): string { return ' Rata Condominiale

{{condominio.nome}}

{{condominio.indirizzo}}

C.F. {{condominio.codice_fiscale}}

{{#if condominio.amministratore}}

Amministratore: {{condominio.amministratore}}

{{/if}}

Spett.le

{{proprietario.nome}}

{{proprietario.indirizzo}}

Interno: {{proprietario.interno}}

{{#if proprietario.codice_fiscale}}

C.F. {{proprietario.codice_fiscale}}

{{/if}}

RATA CONDOMINIALE N. {{rata.numero}}

Periodo: {{rata.periodo}}
Scadenza: {{rata.scadenza}}
Importo: € {{rata.importo}}
{{#if proprietario.millesimi}}
Millesimi: {{proprietario.millesimi}}
{{/if}}
{{#if rata.descrizione}}

Descrizione

{{rata.descrizione}}

{{/if}} {{#if rata.note}}

Note

{{rata.note}}

{{/if}} '; } private function getCssRataStandard(): string { return 'body { font-family: Arial, sans-serif; font-size: 11pt; line-height: 1.4; margin: 0; padding: 20px; color: #333; } .header { display: flex; justify-content: space-between; align-items: flex-start; border-bottom: 2px solid #333; padding-bottom: 15px; margin-bottom: 20px; } .logo img { max-height: 60px; max-width: 120px; } .condominio-info { text-align: right; flex: 1; margin-left: 20px; } .condominio-info h1 { margin: 0 0 10px 0; font-size: 16pt; color: #2c3e50; } .condominio-info p { margin: 3px 0; font-size: 9pt; } .destinatario { margin: 30px 0; padding: 15px; background-color: #f8f9fa; border-left: 4px solid #3498db; } .destinatario h3 { margin: 0 0 10px 0; font-size: 12pt; } .destinatario p { margin: 5px 0; } .rata-info { margin: 30px 0; text-align: center; } .rata-info h2 { font-size: 18pt; color: #2c3e50; border: 2px solid #3498db; padding: 15px; margin-bottom: 20px; background-color: #ecf0f1; } .rata-dettagli { display: table; width: 100%; border-collapse: collapse; } .rata-campo { display: table-row; } .rata-campo .label, .rata-campo .value { display: table-cell; padding: 8px 15px; border: 1px solid #bdc3c7; } .rata-campo .label { background-color: #ecf0f1; font-weight: bold; width: 40%; } .rata-campo .value { text-align: right; } .rata-campo .value.important { font-weight: bold; font-size: 12pt; color: #e74c3c; } .descrizione, .note { margin: 20px 0; padding: 15px; background-color: #f8f9fa; border-radius: 5px; } .descrizione h3, .note h3 { margin: 0 0 10px 0; font-size: 12pt; color: #2c3e50; } .footer { margin-top: 40px; padding-top: 15px; border-top: 1px solid #bdc3c7; text-align: center; font-size: 9pt; color: #7f8c8d; } .footer p { margin: 5px 0; }'; } private function getTemplateAvvisoScadenza(): string { return ' Avviso di Pagamento

⚠️ AVVISO DI PAGAMENTO

{{avviso.tipo}}

{{condominio.nome}}

{{condominio.indirizzo}}

Alla cortese attenzione di:

{{proprietario.nome}}

{{proprietario.indirizzo}}

Interno: {{proprietario.interno}}

Con la presente La informiamo che risulta non ancora pervenuto il pagamento della seguente rata condominiale:

DETTAGLI RATA SCADUTA

Rata N. {{rata.numero}}
€ {{rata.importo}}
Scadenza: {{rata.scadenza}}
{{#if rata.giorni_ritardo}}
Ritardo: {{rata.giorni_ritardo}} giorni
{{/if}}
{{#if rata.interessi_mora}}

Interessi di mora maturati: € {{rata.interessi_mora}}

{{/if}}

🏦 MODALITÀ DI PAGAMENTO

Il pagamento dovrà essere effettuato entro 15 giorni dal ricevimento del presente avviso.

Per informazioni sui metodi di pagamento, contattare l\'amministratore.

{{#if avviso.note_legali}}

⚖️ NOTE LEGALI

{{avviso.note_legali}}

{{/if}}

📞 CONTATTI AMMINISTRATORE

{{condominio.amministratore}}

Tel: {{condominio.telefono}}

'; } private function getCssAvvisoScadenza(): string { return 'body { font-family: Arial, sans-serif; font-size: 11pt; line-height: 1.5; margin: 0; padding: 20px; color: #2c3e50; } .header.urgente { background: linear-gradient(135deg, #e74c3c, #c0392b); color: white; padding: 20px; border-radius: 10px; text-align: center; margin-bottom: 30px; } .header.urgente h1 { font-size: 22pt; margin: 0 0 10px 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.3); } .sottotitolo { font-size: 14pt; font-weight: bold; margin: 10px 0; } .condominio-info h2 { font-size: 16pt; margin: 10px 0 5px 0; } .destinatario { background-color: #ecf0f1; padding: 20px; border-left: 5px solid #e74c3c; margin: 20px 0; } .nome-destinatario { font-size: 14pt; font-weight: bold; color: #e74c3c; margin: 10px 0; } .messaggio-principale { background-color: #fff3cd; border: 1px solid #ffeaa7; padding: 20px; border-radius: 5px; margin: 30px 0; text-align: center; font-size: 12pt; } .rata-scaduta { background-color: #f8d7da; border: 2px solid #e74c3c; border-radius: 10px; padding: 25px; margin: 30px 0; text-align: center; } .rata-scaduta h3 { color: #e74c3c; font-size: 16pt; margin: 0 0 20px 0; text-transform: uppercase; } .rata-box { background-color: white; border-radius: 8px; padding: 20px; margin: 15px 0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .rata-numero { font-size: 14pt; font-weight: bold; color: #2c3e50; margin-bottom: 10px; } .rata-importo { font-size: 24pt; font-weight: bold; color: #e74c3c; margin: 15px 0; } .rata-scadenza { font-size: 12pt; color: #34495e; margin: 10px 0; } .giorni-ritardo { background-color: #e74c3c; color: white; padding: 8px 15px; border-radius: 20px; display: inline-block; font-weight: bold; margin-top: 10px; } .mora-info { background-color: #fff; border: 1px solid #e74c3c; padding: 15px; border-radius: 5px; margin-top: 15px; } .mora-info p { margin: 0; font-size: 12pt; color: #e74c3c; } .istruzioni-pagamento { background-color: #d4edda; border: 1px solid #c3e6cb; border-radius: 5px; padding: 20px; margin: 30px 0; } .istruzioni-pagamento h3 { color: #155724; font-size: 14pt; margin: 0 0 15px 0; } .note-legali { background-color: #f8f9fa; border-left: 4px solid #6c757d; padding: 20px; margin: 30px 0; } .note-legali h3 { color: #495057; font-size: 12pt; margin: 0 0 15px 0; } .contatti { background-color: #e3f2fd; border: 1px solid #2196f3; border-radius: 5px; padding: 20px; margin: 30px 0; } .contatti h3 { color: #1976d2; font-size: 14pt; margin: 0 0 15px 0; } .footer { border-top: 2px solid #bdc3c7; padding-top: 20px; margin-top: 40px; text-align: center; font-size: 9pt; color: #7f8c8d; } .footer p { margin: 5px 0; }'; } private function getTemplateRiepilogativo(): string { return ' Riepilogo Annuale

RIEPILOGO ANNUALE {{riepilogo.anno}}

{{condominio.nome}}

{{condominio.indirizzo}}

Proprietario

{{proprietario.nome}}

Interno: {{proprietario.interno}} - Millesimi: {{proprietario.millesimi}}

📊 RIEPILOGO GENERALE

Totale Dovuto
€ {{riepilogo.totale_dovuto}}
Totale Pagato
Saldo
€ {{riepilogo.saldo}}
Rate Pagate
{{riepilogo.rate_pagate}}
Rate Scadute
{{riepilogo.rate_scadute}}

📋 DETTAGLIO RATE

{{#each dettaglio_rate.lista_rate}} {{/each}}
Mese N. Rata Importo Scadenza Pagamento Stato
{{mese}} {{numero}} € {{importo}} {{scadenza}} {{data_pagamento}} {{status_text}}
{{#if dettaglio_rate.pagamenti}}

💳 PAGAMENTI EFFETTUATI

{{#each dettaglio_rate.pagamenti}} {{/each}}
Data Importo Modalità Riferimento
{{data}} € {{importo}} {{modalita}} {{riferimento}}
{{/if}} '; } private function getCssRiepilogativo(): string { return 'body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-size: 10pt; line-height: 1.4; margin: 0; padding: 15px; color: #2c3e50; } .header { text-align: center; margin-bottom: 30px; border-bottom: 3px solid #3498db; padding-bottom: 20px; } .header h1 { font-size: 24pt; color: #2c3e50; margin: 0 0 15px 0; text-transform: uppercase; letter-spacing: 1px; } .condominio h2 { font-size: 16pt; color: #3498db; margin: 10px 0 5px 0; } .proprietario-info { background: linear-gradient(135deg, #f8f9fa, #e9ecef); padding: 20px; border-radius: 8px; margin: 20px 0; border-left: 5px solid #3498db; } .proprietario-info h3 { margin: 0 0 10px 0; color: #2c3e50; font-size: 12pt; } .riepilogo-generale { margin: 30px 0; } .riepilogo-generale h3 { font-size: 14pt; color: #2c3e50; margin: 0 0 20px 0; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; margin: 20px 0; } .stat-box { background: white; border: 1px solid #e1e8ed; border-radius: 8px; padding: 15px; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.05); } .stat-label { font-size: 9pt; color: #7f8c8d; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px; } .stat-value { font-size: 16pt; font-weight: bold; color: #2c3e50; } .stat-value.paid { color: #27ae60; } .stat-value.positive { color: #27ae60; } .stat-value.negative { color: #e74c3c; } .dettaglio-rate, .pagamenti-effettuati { margin: 30px 0; } .dettaglio-rate h3, .pagamenti-effettuati h3 { font-size: 14pt; color: #2c3e50; margin: 0 0 15px 0; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; } table { width: 100%; border-collapse: collapse; background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 4px rgba(0,0,0,0.05); } thead th { background-color: #34495e; color: white; padding: 12px 8px; font-size: 9pt; font-weight: bold; text-transform: uppercase; letter-spacing: 0.5px; } tbody td { padding: 10px 8px; border-bottom: 1px solid #ecf0f1; font-size: 9pt; } tbody tr:hover { background-color: #f8f9fa; } tbody tr.pagata { background-color: #d5f4e6; } tbody tr.scaduta { background-color: #ffeaa7; } tbody tr.non-pagata { background-color: #fab1a0; } .status-badge { padding: 4px 8px; border-radius: 12px; font-size: 8pt; font-weight: bold; text-transform: uppercase; } .status-badge.pagata { background-color: #27ae60; color: white; } .status-badge.scaduta { background-color: #f39c12; color: white; } .status-badge.non-pagata { background-color: #e74c3c; color: white; } .footer { margin-top: 40px; padding-top: 20px; border-top: 2px solid #ecf0f1; text-align: center; font-size: 8pt; color: #7f8c8d; } .footer p { margin: 5px 0; } @media print { body { padding: 10px; } .stat-box { break-inside: avoid; } table { page-break-inside: auto; } tr { page-break-inside: avoid; } }'; } private function getTemplateModerno(): string { return ' Rata Condominiale - Design Moderno
{{#if condominio.logo_url}} Logo {{/if}}

{{condominio.nome}}

{{condominio.indirizzo}}

RATA CONDOMINIALE

👤 Destinatario

{{proprietario.nome}}

Interno {{proprietario.interno}}

📋 Dettagli

Rata N. {{rata.numero}}
Scadenza {{rata.scadenza}}
{{#if proprietario.millesimi}}
Millesimi {{proprietario.millesimi}}
{{/if}}
Importo da Pagare
€ {{rata.importo}}
Scadenza: {{rata.scadenza}}
{{#if rata.descrizione}}

📝 Descrizione

{{rata.descrizione}}

{{/if}}
'; } private function getCssModerno(): string { return 'body { font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; margin: 0; padding: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; color: #2d3748; } .container { max-width: 800px; margin: 0 auto; background: white; min-height: 100vh; box-shadow: 0 20px 60px rgba(0,0,0,0.1); } .header-modern { background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); color: white; padding: 30px; display: flex; justify-content: space-between; align-items: center; } .brand-section { display: flex; align-items: center; gap: 20px; } .logo-modern { width: 60px; height: 60px; border-radius: 50%; object-fit: cover; border: 3px solid rgba(255,255,255,0.3); } .brand-text h1 { font-size: 24pt; font-weight: 700; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.1); } .address { font-size: 11pt; opacity: 0.9; margin: 5px 0 0 0; } .type-badge { background: rgba(255,255,255,0.2); padding: 8px 16px; border-radius: 20px; font-size: 10pt; font-weight: 600; letter-spacing: 1px; backdrop-filter: blur(10px); } .content-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 30px; padding: 40px 30px; } .card { background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border: 1px solid #e2e8f0; margin-bottom: 20px; overflow: hidden; } .card-header { background: linear-gradient(135deg, #f7fafc, #edf2f7); padding: 15px 20px; border-bottom: 1px solid #e2e8f0; } .card-header h3 { margin: 0; font-size: 12pt; color: #4a5568; font-weight: 600; } .card-body { padding: 20px; } .recipient-name { font-size: 16pt; font-weight: 700; color: #2d3748; margin: 0 0 8px 0; } .recipient-detail { color: #718096; margin: 0; font-size: 11pt; } .info-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 1px solid #f7fafc; } .info-row:last-child { border-bottom: none; } .info-label { font-size: 10pt; color: #718096; font-weight: 500; } .info-value { font-size: 11pt; font-weight: 600; color: #2d3748; } .info-value.highlight { color: #e53e3e; font-weight: 700; } .amount-showcase { background: linear-gradient(135deg, #667eea, #764ba2); color: white; padding: 30px; border-radius: 16px; text-align: center; margin-bottom: 25px; position: relative; overflow: hidden; } .amount-showcase::before { content: ""; position: absolute; top: -50%; right: -50%; width: 100%; height: 100%; background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%); transform: rotate(45deg); } .amount-label { font-size: 11pt; opacity: 0.9; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 1px; font-weight: 500; } .amount-value { font-size: 36pt; font-weight: 800; margin: 10px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.1); } .amount-sublabel { font-size: 10pt; opacity: 0.8; } .description-box { background: #f7fafc; border-left: 4px solid #4facfe; padding: 20px; border-radius: 0 8px 8px 0; } .description-box h4 { margin: 0 0 12px 0; font-size: 11pt; color: #4a5568; font-weight: 600; } .description-box p { margin: 0; line-height: 1.6; color: #2d3748; font-size: 10pt; } .footer-modern { background: #f7fafc; padding: 20px 30px; display: flex; justify-content: space-between; align-items: center; border-top: 1px solid #e2e8f0; font-size: 9pt; color: #718096; } .footer-left p, .footer-right p { margin: 0; } @media print { body { background: white; } .container { box-shadow: none; } .content-grid { grid-template-columns: 1fr 1fr; gap: 20px; padding: 20px; } }'; } private function getTemplateMinimale(): string { return ' Rata - {{rata.numero}}

{{condominio.nome}}

RATA N. {{rata.numero}}

{{proprietario.nome}}
Interno: {{proprietario.interno}}
€ {{rata.importo}}
Scadenza: {{rata.scadenza}}
'; } private function getCssMinimale(): string { return 'body { font-family: Arial, sans-serif; font-size: 12pt; margin: 20px; color: #333; line-height: 1.4; } .header-minimal { text-align: center; border-bottom: 2px solid #333; padding-bottom: 15px; margin-bottom: 30px; } .header-minimal h1 { font-size: 18pt; margin: 0 0 10px 0; } .header-minimal h2 { font-size: 16pt; margin: 0; color: #666; } .content-minimal { display: flex; justify-content: space-between; align-items: center; margin: 40px 0; } .recipient { font-size: 14pt; } .amount-section { text-align: right; } .amount { font-size: 24pt; font-weight: bold; color: #e74c3c; margin-bottom: 5px; } .due-date { font-size: 11pt; color: #666; } .footer-minimal { text-align: center; font-size: 9pt; color: #999; border-top: 1px solid #ccc; padding-top: 15px; margin-top: 50px; }'; } }