feat: insurance section — overview, documents, analysis, KVG premium comparison

- Insurance overview page (/insurance): current policies table with type,
  provider, premium, franchise, coverage, and document links
- Documents page: upload and manage insurance documents
- Analysis page: coverage gap analysis per insurance type
- Priminfo integration (/insurance/priminfo): KVG premium comparison by
  insurer, model (TAR/HMO/etc.), franchise level, and accident coverage
  via embedded Priminfo iframe (no public API available)
- Backend: Insurance, PraemienEntry, PraemienPolice models with migrations
- Sidebar: insurance nav group with flyout and dropdown
- i18n: all keys in DE/EN/FR/IT
This commit is contained in:
Daniel Krähenbühl
2026-05-25 22:05:37 +02:00
parent 1a7ef09805
commit c03d2a97ab
26 changed files with 2456 additions and 44 deletions
+129 -10
View File
@@ -136,16 +136,6 @@
"transactions": "Transazioni",
"deadlines": "Scadenze"
},
"sidebar": {
"dashboard": "Dashboard",
"budgets": "Budget",
"fixed_costs": "Costi fissi",
"expenses": "Spese",
"calendar": "Calendario",
"accounts": "Conti",
"revenue_accounts": "Conti entrate",
"transactions": "Transazioni"
},
"dashboard": {
"title": "Dashboard",
"subtitle": "Panoramica finanziaria",
@@ -400,5 +390,134 @@
"password_too_short": "La password deve contenere almeno 8 caratteri.",
"password_failed": "Aggiornamento password fallito."
}
},
"sidebar": {
"dashboard": "Dashboard",
"budgets": "Budget",
"fixed_costs": "Costi fissi",
"expenses": "Spese",
"calendar": "Calendario",
"accounts": "Conti",
"revenue_accounts": "Conti entrate",
"transactions": "Transazioni",
"insurance": "Assicurazioni",
"insurance_overview": "Panoramica",
"insurance_documents": "Documenti",
"insurance_analyse": "Analisi",
"insurance_priminfo": "Priminfo"
},
"insurance": {
"title": "Assicurazioni",
"subtitle": "La tua copertura assicurativa attuale — Situazione attuale",
"add": "Aggiungi assicurazione",
"create_title": "Nuova assicurazione",
"edit_title": "Modifica assicurazione",
"list_title": "Le tue assicurazioni",
"no_entries": "Nessuna assicurazione registrata.",
"loading": "Caricamento...",
"kpi_monthly": "Totale mensile",
"kpi_count": "Polizze",
"kpi_covered": "Tipi coperti",
"checklist_title": "Copertura minima raccomandata",
"checklist_hint": "Queste quattro assicurazioni sono il minimo raccomandato in Svizzera per ogni persona.",
"label_type": "Tipo di assicurazione",
"label_insurer": "Assicuratore",
"label_policy_number": "Numero polizza",
"label_premium": "Premio (CHF)",
"label_period": "Frequenza di pagamento",
"label_coverage": "Somma assicurata (CHF)",
"label_deductible": "Franchigia (CHF)",
"label_valid_from": "Valido dal",
"label_valid_until": "Valido fino al",
"label_notes": "Note",
"placeholder_insurer": "es. Helsana, AXA, CSS",
"placeholder_policy_number": "es. 12345678",
"month_short": "mese",
"types": {
"kvg": "Cassa malati (LAMal)",
"kk_zusatz": "Assicurazione complementare",
"nbu": "Infortuni (LAINF)",
"haftpflicht": "Responsabilità civile privata",
"hausrat": "Economia domestica",
"mfz": "RC veicoli",
"rechtsschutz": "Tutela legale",
"saule_3a": "Pilastro 3a",
"leben": "Assicurazione vita",
"reise": "Assicurazione viaggio",
"other": "Altro"
},
"period": {
"monthly": "Mensile",
"quarterly": "Trimestrale",
"semi_annual": "Semestrale",
"annual": "Annuale"
}
},
"insurance_docs": {
"title": "Documenti assicurativi",
"subtitle": "Carica le tue polizze e falle analizzare dall'IA",
"coming_soon_title": "Upload PDF & analisi IA — In arrivo",
"coming_soon_text": "Carica le tue polizze assicurative in PDF. L'IA (Claude) estrae automaticamente le informazioni più importanti."
},
"insurance_analyse": {
"title": "Analisi assicurativa",
"subtitle": "Obiettivo — Di quale copertura hai bisogno?",
"coming_soon_title": "Analisi della copertura — In arrivo",
"coming_soon_text": "Confronta la tua situazione attuale con le raccomandazioni svizzere e identifica le lacune.",
"tag_soll": "Situazione obiettivo",
"tag_gaps": "Lacune di copertura",
"tag_recommendations": "Raccomandazioni"
},
"priminfo": {
"title": "Priminfo — Calcolatore premi LAMal",
"subtitle": "Premi mensili medi per CAP, basati sui dati dell'UFSP",
"plz_label": "Inserisci il CAP",
"plz_placeholder": "es. 8001",
"plz_hint": "Codice postale svizzero a 4 cifre",
"search": "Cerca",
"region_label": "Regione tariffale",
"col_child": "Bambini",
"col_young": "Giovani adulti",
"col_adult": "Adulti",
"month": "mese",
"disclaimer": "Premi mensili medi {{ year }} (tutti gli assicuratori, tutti i modelli). Fonte: UFSP / Priminfo.",
"multi_ort_hint": "Questo CAP comprende più comuni o regioni.",
"error_not_found": "Nessun dato trovato per questo CAP.",
"no_results": "Nessun risultato.",
"cta_title": "Ulteriori dettagli su priminfo.admin.ch",
"cta_text": "Costi annuali, storico dei premi e assicurazioni complementari sul sito ufficiale dell'UFSP.",
"cta_btn": "Confronta su Priminfo",
"info_title": "Cosa mostra questo calcolatore?",
"info_1": "I premi sono medie cantonali calcolate su tutti gli assicuratori e tutti i modelli assicurativi (standard, medico di famiglia, HMO, telemedicina).",
"info_2": "La regione tariffale (1, 2 o 3) determina il livello dei premi all'interno di un cantone — la regione 1 è generalmente la più cara.",
"info_3": "Per un confronto preciso per assicuratore e franchigia, consigliamo il calcolatore ufficiale su priminfo.admin.ch.",
"source": "Fonte: UFSP — ",
"vergleich_card_title": "Confronta assicuratori",
"vergleich_card_subtitle": "Premi dettagliati per assicuratore, modello e franchigia",
"geburtsjahr_label": "Anno di nascita",
"geburtsjahr_placeholder": "es. 1990",
"modell_label": "Modello assicurativo",
"modell_base": "Standard",
"modell_ham": "Medico di base",
"modell_hmo": "HMO",
"modell_div": "Altri modelli",
"franchise_label": "Franchigia",
"unfall_label": "Copertura infortuni",
"unfall_ohn": "Senza infortuni",
"unfall_mit": "Con infortuni",
"unfall_note": "I dipendenti possono escludere la copertura infortuni se il datore di lavoro ha stipulato un'assicurazione AINF.",
"vergleich_btn": "Confronta assicuratori",
"col_rank": "#",
"col_insurer": "Assicuratore",
"col_model": "Modello",
"col_franchise": "Franchigia",
"col_premium": "Premio/mese",
"cheapest_badge": "Più economico",
"vergleich_data_year": "Premi {{ year }}",
"vergleich_no_results": "Nessun assicuratore trovato per questa combinazione. Provare un altro modello o franchigia.",
"vergleich_hint": "Assicuratori ordinati per premio crescente.",
"age_child": "Bambino (≤ 18 anni)",
"age_young": "Giovane adulto (1925 anni)",
"age_adult": "Adulto (≥ 26 anni)"
}
}