mantenimento-app 2.1.0 β 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app.js +42 -30
- package/frontend/public/app.js +42 -30
- package/frontend/public/index.html +1 -1
- package/package.json +1 -1
package/app.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
const defaultExpenseItems = [
|
|
2
|
-
{ label: "Affitto", help: "Canone mensile di locazione dell'abitazione." },
|
|
3
|
-
{ label: "Mutuo casa", help: "Rata mensile del mutuo abitazione." },
|
|
4
|
-
{ label: "Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
|
|
5
|
-
{ label: "Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
|
|
6
|
-
{ label: "Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
|
|
7
|
-
{ label: "Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
|
|
8
|
-
{ label: "Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
|
|
9
|
-
{ label: "Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
|
|
10
|
-
{ label: "Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
|
|
11
|
-
{ label: "Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
|
|
12
|
-
{ label: "Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
|
|
13
|
-
{ label: "Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
|
|
2
|
+
{ label: "π Affitto", help: "Canone mensile di locazione dell'abitazione." },
|
|
3
|
+
{ label: "π¦ Mutuo casa", help: "Rata mensile del mutuo abitazione." },
|
|
4
|
+
{ label: "π‘ Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
|
|
5
|
+
{ label: "π‘ Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
|
|
6
|
+
{ label: "π Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
|
|
7
|
+
{ label: "π Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
|
|
8
|
+
{ label: "π³ Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
|
|
9
|
+
{ label: "π Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
|
|
10
|
+
{ label: "π’ Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
|
|
11
|
+
{ label: "π Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
|
|
12
|
+
{ label: "π©Ί Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
|
|
13
|
+
{ label: "β½ Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
|
|
14
14
|
];
|
|
15
15
|
const suggestedExpenseCatalog = [
|
|
16
|
-
{ label: "Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
|
|
17
|
-
{ label: "Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
|
|
18
|
-
{ label: "Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
|
|
19
|
-
{ label: "Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
|
|
20
|
-
{ label: "Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
|
|
21
|
-
{ label: "Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
|
|
22
|
-
{ label: "Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
|
|
23
|
-
{ label: "Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
|
|
16
|
+
{ label: "π Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
|
|
17
|
+
{ label: "π Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
|
|
18
|
+
{ label: "βοΈ Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
|
|
19
|
+
{ label: "βοΈ Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
|
|
20
|
+
{ label: "π¬ Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
|
|
21
|
+
{ label: "π¨ Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
|
|
22
|
+
{ label: "π» Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
|
|
23
|
+
{ label: "π§₯ Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
|
|
24
24
|
];
|
|
25
25
|
let expenseItems = defaultExpenseItems.map((item) => ({ ...item }));
|
|
26
26
|
let scenarioLab = [];
|
|
@@ -328,10 +328,10 @@ const defaultExpenseItems = [
|
|
|
328
328
|
scenarioColFabb: "Fabbis. figli",
|
|
329
329
|
scenarioDeltaLabel: "\u0394 vs A",
|
|
330
330
|
spiegTitle: "π‘ PerchΓ© questo risultato?",
|
|
331
|
-
spiegRedditiLabel: "
|
|
332
|
-
spiegSpeseLabel: "
|
|
333
|
-
spiegPermLabel: "
|
|
334
|
-
spiegResultLabel: "
|
|
331
|
+
spiegRedditiLabel: "Redditi (peso contributivo)",
|
|
332
|
+
spiegSpeseLabel: "Spese β fabbisogno figli",
|
|
333
|
+
spiegPermLabel: "Permanenza β quota diretta",
|
|
334
|
+
spiegResultLabel: "Come si forma l'assegno",
|
|
335
335
|
spiegTooltipTrigger: "Dettaglio calcolo",
|
|
336
336
|
spiegDetailIncome: "Si parte dal netto disponibile di ciascun coniuge. Il peso contributivo e dato da netto coniuge / somma dei netti positivi.",
|
|
337
337
|
spiegDetailExpense: "Il fabbisogno figli viene stimato come 35% del totale spese inserite (ordinarie + eventuali straordinarie mensilizzate).",
|
|
@@ -621,10 +621,10 @@ const defaultExpenseItems = [
|
|
|
621
621
|
scenarioColFabb: "Children needs",
|
|
622
622
|
scenarioDeltaLabel: "\u0394 vs A",
|
|
623
623
|
spiegTitle: "π‘ Why this result?",
|
|
624
|
-
spiegRedditiLabel: "
|
|
625
|
-
spiegSpeseLabel: "
|
|
626
|
-
spiegPermLabel: "
|
|
627
|
-
spiegResultLabel: "
|
|
624
|
+
spiegRedditiLabel: "Income (contribution weight)",
|
|
625
|
+
spiegSpeseLabel: "Expenses β children needs",
|
|
626
|
+
spiegPermLabel: "Permanence β direct share",
|
|
627
|
+
spiegResultLabel: "How the support is formed",
|
|
628
628
|
spiegTooltipTrigger: "Calculation details",
|
|
629
629
|
spiegDetailIncome: "The model starts from each spouse's available net. Contribution weight is spouse net / sum of positive nets.",
|
|
630
630
|
spiegDetailExpense: "Children needs are estimated as 35% of total entered expenses (regular + any extraordinary annual costs converted to monthly).",
|
|
@@ -1185,8 +1185,20 @@ const defaultExpenseItems = [
|
|
|
1185
1185
|
function normalizeExpenseItem(item, fallbackIdx = 0) {
|
|
1186
1186
|
const rawLabel = String(item && item.label ? item.label : "").trim();
|
|
1187
1187
|
const rawHelp = String(item && item.help ? item.help : "").trim();
|
|
1188
|
-
|
|
1189
|
-
const
|
|
1188
|
+
// Strip leading non-letter characters (emoji, spaces) for default-item matching.
|
|
1189
|
+
const stripLeading = (s) => s.replace(/^[^A-Za-z\u00C0-\u024F]+/, "").trim();
|
|
1190
|
+
const strippedRaw = stripLeading(rawLabel);
|
|
1191
|
+
// If the saved label matches a default item (with or without emoji prefix), use
|
|
1192
|
+
// the current default label (so emoji survive save/load round-trips).
|
|
1193
|
+
const defaultMatch = strippedRaw
|
|
1194
|
+
? defaultExpenseItems.find((d) => stripLeading(d.label) === strippedRaw)
|
|
1195
|
+
: null;
|
|
1196
|
+
const label = defaultMatch
|
|
1197
|
+
? defaultMatch.label
|
|
1198
|
+
: (rawLabel || `Voce personalizzata ${fallbackIdx + 1}`);
|
|
1199
|
+
const help = defaultMatch
|
|
1200
|
+
? defaultMatch.help
|
|
1201
|
+
: (rawHelp || `Voce aggiunta manualmente: ${label}.`);
|
|
1190
1202
|
return { label, help };
|
|
1191
1203
|
}
|
|
1192
1204
|
|
package/frontend/public/app.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
const defaultExpenseItems = [
|
|
2
|
-
{ label: "Affitto", help: "Canone mensile di locazione dell'abitazione." },
|
|
3
|
-
{ label: "Mutuo casa", help: "Rata mensile del mutuo abitazione." },
|
|
4
|
-
{ label: "Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
|
|
5
|
-
{ label: "Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
|
|
6
|
-
{ label: "Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
|
|
7
|
-
{ label: "Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
|
|
8
|
-
{ label: "Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
|
|
9
|
-
{ label: "Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
|
|
10
|
-
{ label: "Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
|
|
11
|
-
{ label: "Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
|
|
12
|
-
{ label: "Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
|
|
13
|
-
{ label: "Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
|
|
2
|
+
{ label: "π Affitto", help: "Canone mensile di locazione dell'abitazione." },
|
|
3
|
+
{ label: "π¦ Mutuo casa", help: "Rata mensile del mutuo abitazione." },
|
|
4
|
+
{ label: "π‘ Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
|
|
5
|
+
{ label: "π‘ Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
|
|
6
|
+
{ label: "π Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
|
|
7
|
+
{ label: "π Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
|
|
8
|
+
{ label: "π³ Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
|
|
9
|
+
{ label: "π Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
|
|
10
|
+
{ label: "π’ Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
|
|
11
|
+
{ label: "π Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
|
|
12
|
+
{ label: "π©Ί Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
|
|
13
|
+
{ label: "β½ Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
|
|
14
14
|
];
|
|
15
15
|
const suggestedExpenseCatalog = [
|
|
16
|
-
{ label: "Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
|
|
17
|
-
{ label: "Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
|
|
18
|
-
{ label: "Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
|
|
19
|
-
{ label: "Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
|
|
20
|
-
{ label: "Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
|
|
21
|
-
{ label: "Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
|
|
22
|
-
{ label: "Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
|
|
23
|
-
{ label: "Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
|
|
16
|
+
{ label: "π Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
|
|
17
|
+
{ label: "π Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
|
|
18
|
+
{ label: "βοΈ Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
|
|
19
|
+
{ label: "βοΈ Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
|
|
20
|
+
{ label: "π¬ Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
|
|
21
|
+
{ label: "π¨ Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
|
|
22
|
+
{ label: "π» Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
|
|
23
|
+
{ label: "π§₯ Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
|
|
24
24
|
];
|
|
25
25
|
let expenseItems = defaultExpenseItems.map((item) => ({ ...item }));
|
|
26
26
|
let scenarioLab = [];
|
|
@@ -328,10 +328,10 @@ const defaultExpenseItems = [
|
|
|
328
328
|
scenarioColFabb: "Fabbis. figli",
|
|
329
329
|
scenarioDeltaLabel: "\u0394 vs A",
|
|
330
330
|
spiegTitle: "π‘ PerchΓ© questo risultato?",
|
|
331
|
-
spiegRedditiLabel: "
|
|
332
|
-
spiegSpeseLabel: "
|
|
333
|
-
spiegPermLabel: "
|
|
334
|
-
spiegResultLabel: "
|
|
331
|
+
spiegRedditiLabel: "Redditi (peso contributivo)",
|
|
332
|
+
spiegSpeseLabel: "Spese β fabbisogno figli",
|
|
333
|
+
spiegPermLabel: "Permanenza β quota diretta",
|
|
334
|
+
spiegResultLabel: "Come si forma l'assegno",
|
|
335
335
|
spiegTooltipTrigger: "Dettaglio calcolo",
|
|
336
336
|
spiegDetailIncome: "Si parte dal netto disponibile di ciascun coniuge. Il peso contributivo e dato da netto coniuge / somma dei netti positivi.",
|
|
337
337
|
spiegDetailExpense: "Il fabbisogno figli viene stimato come 35% del totale spese inserite (ordinarie + eventuali straordinarie mensilizzate).",
|
|
@@ -621,10 +621,10 @@ const defaultExpenseItems = [
|
|
|
621
621
|
scenarioColFabb: "Children needs",
|
|
622
622
|
scenarioDeltaLabel: "\u0394 vs A",
|
|
623
623
|
spiegTitle: "π‘ Why this result?",
|
|
624
|
-
spiegRedditiLabel: "
|
|
625
|
-
spiegSpeseLabel: "
|
|
626
|
-
spiegPermLabel: "
|
|
627
|
-
spiegResultLabel: "
|
|
624
|
+
spiegRedditiLabel: "Income (contribution weight)",
|
|
625
|
+
spiegSpeseLabel: "Expenses β children needs",
|
|
626
|
+
spiegPermLabel: "Permanence β direct share",
|
|
627
|
+
spiegResultLabel: "How the support is formed",
|
|
628
628
|
spiegTooltipTrigger: "Calculation details",
|
|
629
629
|
spiegDetailIncome: "The model starts from each spouse's available net. Contribution weight is spouse net / sum of positive nets.",
|
|
630
630
|
spiegDetailExpense: "Children needs are estimated as 35% of total entered expenses (regular + any extraordinary annual costs converted to monthly).",
|
|
@@ -1185,8 +1185,20 @@ const defaultExpenseItems = [
|
|
|
1185
1185
|
function normalizeExpenseItem(item, fallbackIdx = 0) {
|
|
1186
1186
|
const rawLabel = String(item && item.label ? item.label : "").trim();
|
|
1187
1187
|
const rawHelp = String(item && item.help ? item.help : "").trim();
|
|
1188
|
-
|
|
1189
|
-
const
|
|
1188
|
+
// Strip leading non-letter characters (emoji, spaces) for default-item matching.
|
|
1189
|
+
const stripLeading = (s) => s.replace(/^[^A-Za-z\u00C0-\u024F]+/, "").trim();
|
|
1190
|
+
const strippedRaw = stripLeading(rawLabel);
|
|
1191
|
+
// If the saved label matches a default item (with or without emoji prefix), use
|
|
1192
|
+
// the current default label (so emoji survive save/load round-trips).
|
|
1193
|
+
const defaultMatch = strippedRaw
|
|
1194
|
+
? defaultExpenseItems.find((d) => stripLeading(d.label) === strippedRaw)
|
|
1195
|
+
: null;
|
|
1196
|
+
const label = defaultMatch
|
|
1197
|
+
? defaultMatch.label
|
|
1198
|
+
: (rawLabel || `Voce personalizzata ${fallbackIdx + 1}`);
|
|
1199
|
+
const help = defaultMatch
|
|
1200
|
+
? defaultMatch.help
|
|
1201
|
+
: (rawHelp || `Voce aggiunta manualmente: ${label}.`);
|
|
1190
1202
|
return { label, help };
|
|
1191
1203
|
}
|
|
1192
1204
|
|