@jjlmoya/utils-civic 1.6.0 → 1.7.0

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.
Files changed (35) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +2 -0
  4. package/src/tests/locale_completeness.test.ts +1 -1
  5. package/src/tests/tool_validation.test.ts +1 -1
  6. package/src/tool/public-budget-analyzer/bibliography.astro +15 -0
  7. package/src/tool/public-budget-analyzer/bibliography.ts +7 -0
  8. package/src/tool/public-budget-analyzer/component.astro +52 -0
  9. package/src/tool/public-budget-analyzer/controller.ts +84 -0
  10. package/src/tool/public-budget-analyzer/dom-views.ts +52 -0
  11. package/src/tool/public-budget-analyzer/entry.ts +27 -0
  12. package/src/tool/public-budget-analyzer/evaluator.ts +15 -0
  13. package/src/tool/public-budget-analyzer/i18n/de.ts +115 -0
  14. package/src/tool/public-budget-analyzer/i18n/en.ts +78 -0
  15. package/src/tool/public-budget-analyzer/i18n/es.ts +115 -0
  16. package/src/tool/public-budget-analyzer/i18n/fr.ts +115 -0
  17. package/src/tool/public-budget-analyzer/i18n/id.ts +115 -0
  18. package/src/tool/public-budget-analyzer/i18n/it.ts +115 -0
  19. package/src/tool/public-budget-analyzer/i18n/ja.ts +115 -0
  20. package/src/tool/public-budget-analyzer/i18n/ko.ts +115 -0
  21. package/src/tool/public-budget-analyzer/i18n/nl.ts +115 -0
  22. package/src/tool/public-budget-analyzer/i18n/pl.ts +115 -0
  23. package/src/tool/public-budget-analyzer/i18n/pt.ts +115 -0
  24. package/src/tool/public-budget-analyzer/i18n/ru.ts +115 -0
  25. package/src/tool/public-budget-analyzer/i18n/sv.ts +115 -0
  26. package/src/tool/public-budget-analyzer/i18n/tr.ts +115 -0
  27. package/src/tool/public-budget-analyzer/i18n/zh.ts +115 -0
  28. package/src/tool/public-budget-analyzer/index.ts +11 -0
  29. package/src/tool/public-budget-analyzer/logic.test.ts +81 -0
  30. package/src/tool/public-budget-analyzer/logic.ts +249 -0
  31. package/src/tool/public-budget-analyzer/public-budget-analyzer.css +461 -0
  32. package/src/tool/public-budget-analyzer/seo.astro +15 -0
  33. package/src/tool/public-budget-analyzer/storage.ts +28 -0
  34. package/src/tool/public-budget-analyzer/ui.ts +78 -0
  35. package/src/tools.ts +2 -0
@@ -0,0 +1,115 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { PublicBudgetLocaleContent } from '../entry';
4
+ import type { PublicBudgetUI } from '../ui';
5
+
6
+ const ui: PublicBudgetUI = {
7
+ uploadLabel: 'Suelta aquí un CSV o JSON de presupuesto',
8
+ uploadHelp: 'Campos obligatorios: categoría e importe. Opcionales: población, periodo, priorAmount, moneda y categoría padre.',
9
+ loadExample: 'Cargar presupuesto de ejemplo',
10
+ supportedFormat: 'CSV o JSON, procesado solo en este navegador',
11
+ tableHeading: 'Filas de origen y totales por categoría',
12
+ categoryLabel: 'Categoría',
13
+ amountLabel: 'Importe',
14
+ populationLabel: 'Población',
15
+ sourceRowsLabel: 'Filas de origen',
16
+ analyzeEmpty: 'Elige un archivo o carga el ejemplo para revisar un presupuesto.',
17
+ resultHeading: 'Paisaje presupuestario',
18
+ totalLabel: 'Gasto total',
19
+ perCapitaLabel: 'Gasto por habitante',
20
+ variationLabel: 'Cambio frente al periodo anterior',
21
+ topCategoryLabel: 'Categoría mayoritaria',
22
+ shareLabel: 'Parte del total',
23
+ sourceLabel: 'Filas de origen',
24
+ noData: 'Todavía no hay filas presupuestarias válidas disponibles.',
25
+ warningsHeading: 'Advertencias que revisar',
26
+ errorsHeading: 'Filas no incluidas',
27
+ methodHeading: 'Método aplicado',
28
+ methodText: 'La herramienta valida los campos obligatorios, conserva cada fila de origen, agrupa las rutas exactas de categoría y calcula los totales a partir de importes normalizados. La parte de cada categoría es su importe dividido por el total cuando este es positivo. El gasto por habitante divide el total por el primer denominador de población positivo y consistente. El cambio del periodo es la diferencia dividida por el importe anterior absoluto.',
29
+ limitsHeading: 'Lo que esta herramienta no hace',
30
+ limitsText: 'No demuestra que un presupuesto sea completo, comparable, legal, eficiente, justo, imparcial o esté bien clasificado. No audita la fuente, no evalúa la calidad de una política, no convierte monedas ni identifica si una fila es una autorización, obligación, pago o previsión.',
31
+ edgeCasesHeading: 'Casos límite y advertencias de datos',
32
+ edgeCasesText: 'Las monedas mezcladas, poblaciones cambiantes, categorías duplicadas, ajustes negativos, filas padre junto a filas hijas, formatos numéricos locales y los importes anteriores iguales a cero requieren revisión humana. El navegador conserva el número de fila original para rastrear cada agregado hasta su entrada.',
33
+ downloadCsv: 'Descargar tabla revisada',
34
+ printAction: 'Imprimir análisis',
35
+ rowsLabel: 'filas válidas',
36
+ categoriesLabel: 'categorías',
37
+ positiveTotalLabel: 'importes positivos visualizados',
38
+ previousTotalLabel: 'Total anterior',
39
+ invalidFile: 'El archivo no se ha podido entender como una tabla CSV o JSON no vacía.',
40
+ fileReadError: 'El archivo no se ha podido leer en este navegador.',
41
+ exampleName: 'Ejemplo de presupuesto municipal',
42
+ noPreviousData: 'No se ha indicado un importe anterior comparable.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: 'Analizador de presupuesto público',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: 'Revisa localmente gastos públicos, partes por categoría, importes por habitante y cambios entre periodos.',
51
+ url: 'https://gamebob.dev/es/analizador-presupuesto-publico-gasto',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: '¿Qué columnas necesita el analizador?', acceptedAnswer: { '@type': 'Answer', text: 'Cada fila necesita una categoría y un importe numérico. Población, periodo, priorAmount, moneda y categoría padre son opcionales.' } },
59
+ { '@type': 'Question', name: '¿Cómo se calcula el gasto por habitante?', acceptedAnswer: { '@type': 'Answer', text: 'El importe total se divide por el primer valor de población positivo y consistente. Si los denominadores cambian, la herramienta mantiene el cálculo y muestra una advertencia.' } },
60
+ { '@type': 'Question', name: '¿Qué ocurre con las categorías duplicadas?', acceptedAnswer: { '@type': 'Answer', text: 'Las filas con la misma ruta de categoría se suman y conservan visibles sus números de fila de origen. Así se puede distinguir una división real de una doble contabilización.' } },
61
+ { '@type': 'Question', name: '¿Puede demostrar que un presupuesto es bueno o justo?', acceptedAnswer: { '@type': 'Answer', text: 'No. Describe los números recibidos, pero no establece su integridad, legalidad, eficiencia, justicia, clasificación ni sus resultados.' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: 'Analizar una tabla de presupuesto público',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'Preparar una tabla', text: 'Crea una tabla CSV o JSON con una categoría y un importe por fila. Mantén la misma moneda y base contable.' },
70
+ { '@type': 'HowToStep', name: 'Añadir contexto', text: 'Añade población, periodo, priorAmount, moneda o categoría padre solo cuando su significado sea consistente.' },
71
+ { '@type': 'HowToStep', name: 'Cargar el archivo', text: 'Suelta el archivo en el analizador o carga el ejemplo para ver la estructura esperada y la validación local.' },
72
+ { '@type': 'HowToStep', name: 'Leer el paisaje', text: 'Usa las barras proporcionales para la composición y la tabla accesible para importes, cambios y filas de origen exactos.' },
73
+ { '@type': 'HowToStep', name: 'Revisar advertencias', text: 'Aclara monedas mezcladas, rutas duplicadas, ajustes negativos, denominadores cero y filas padre antes de concluir.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'analizador-presupuesto-publico-gasto',
79
+ title: 'Analizador de presupuesto público',
80
+ description: 'Revisa localmente una tabla de presupuesto público para ver gasto total, partes por categoría, gasto por habitante, cambios y las filas de origen detrás de cada agregado.',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: 'Convierte una tabla de presupuesto público en una vista auditable', level: 2 },
84
+ { type: 'paragraph', html: 'Los archivos de presupuesto público suelen mezclar etiquetas de categoría, periodos contables, denominadores de población y ajustes en una tabla difícil de leer de un vistazo. Este analizador conserva las filas de origen, valida los campos necesarios y convierte los mismos datos normalizados en totales, proporciones, gasto por habitante y cambios entre periodos.' },
85
+ { type: 'paragraph', html: 'El resultado es descriptivo, no un juicio político. Una categoría grande puede reflejar una competencia legal, una inversión excepcional, una transferencia o un límite contable distinto. La herramienta hace visibles esos patrones para que puedas volver a la fuente con una pregunta mejor definida.' },
86
+ { type: 'title', text: 'Qué significan los cálculos', level: 2 },
87
+ { type: 'paragraph', html: 'El total suma todos los importes numéricos válidos, incluidos los ajustes negativos. La parte de una categoría es su importe agrupado dividido por el total cuando este es positivo. Los importes positivos reciben barras proporcionales; los negativos permanecen en la tabla y se señalan porque representar su área como positiva cambiaría su significado.' },
88
+ { type: 'table', headers: ['Resultado', 'Cálculo', 'Pregunta de revisión'], rows: [['Gasto total', 'Suma de importes normalizados', '¿Todas las filas usan la misma base contable?'], ['Parte de categoría', 'Importe de categoría dividido por el total positivo', '¿Las categorías son excluyentes o una categoría padre contiene a sus hijas?'], ['Gasto por habitante', 'Total dividido por un denominador de población positivo', '¿La población describe el mismo lugar y periodo?'], ['Cambio del periodo', 'Importe actual menos anterior dividido por el valor anterior absoluto', '¿Los periodos son comparables y se evita una base cero?']] },
89
+ { type: 'title', text: 'Preparar datos comparables', level: 2 },
90
+ { type: 'paragraph', html: 'Usa una sola moneda y una definición explícita del importe en cada fila. Una autorización presupuestaria, una obligación, un pago y una previsión pueden ser cifras válidas y responder a preguntas distintas. Anota ese significado junto a la fuente porque el analizador no lo deduce del nombre de una columna.' },
91
+ { type: 'list', items: ['Usa una fila por categoría o indica una categoría padre para crear una jerarquía deliberada.', 'Mantén coherentes los valores de población y no mezcles residentes, electores, hogares o usuarios del servicio.', 'Incluye priorAmount solo cuando el periodo anterior use las mismas categorías y base contable.', 'Comprueba las rutas duplicadas y las filas padre para evitar dobles conteos accidentales.', 'Conserva la tabla revisada junto con el archivo original y las hipótesis usadas.'] },
92
+ { type: 'tip', title: 'Una proporción no es una prioridad', html: 'La categoría con mayor importe no es automáticamente la más importante, derrochadora o exitosa. Usa la vista para localizar escala y cambios, y lee después las notas de la fuente y los resultados del servicio.' },
93
+ { type: 'title', text: 'Leer las advertencias antes de concluir', level: 2 },
94
+ { type: 'paragraph', html: 'Las rutas duplicadas se agrupan para que el agregado no quede infravalorado sin avisar, pero la lista de filas de origen permite comprobar si la agrupación era intencionada. Las monedas mezcladas nunca se convierten. Una población cero elimina el gasto por habitante y un importe anterior cero elimina el porcentaje de cambio porque dividir entre cero no tiene una interpretación útil.' },
95
+ { type: 'paragraph', html: 'Las categorías anidadas requieren especial cuidado. Si una tabla contiene Educación y Educación > Escuelas como importes, sumarlas puede contar dos veces el mismo gasto. La herramienta avisa de las rutas anidadas, pero solo la metodología de la fuente puede decir si la categoría padre es un subtotal o una partida independiente.' },
96
+ { type: 'title', text: 'Qué hacer después del primer análisis', level: 2 },
97
+ { type: 'paragraph', html: 'Usa los números de fila para volver al archivo oficial y documentar cada corrección o interpretación. Compara datos equivalentes entre periodos, conserva los ajustes negativos como ajustes y vuelve a ejecutar el análisis después de eliminar subtotales cuando la fuente confirme que ya están incluidos.' },
98
+ { type: 'tip', title: 'Mantén visible el límite de los datos', html: 'Esto es un análisis descriptivo local. No verifica que el archivo esté completo, no clasifica el gasto según una norma oficial, no reconcilia monedas ni demuestra una relación causal entre gasto y resultados.' },
99
+ ],
100
+ faq: [
101
+ { question: '¿Qué columnas necesita el analizador?', answer: 'Cada fila necesita categoría e importe numérico. Población, periodo, priorAmount, moneda y categoría padre son opcionales.' },
102
+ { question: '¿Cómo se calcula el gasto por habitante?', answer: 'El total se divide por el primer valor de población positivo y consistente. Los denominadores distintos generan una advertencia.' },
103
+ { question: '¿Qué ocurre con las categorías duplicadas?', answer: 'Las mismas rutas de categoría se suman y sus filas de origen quedan visibles para revisarlas.' },
104
+ { question: '¿Puede demostrar que un presupuesto es bueno o justo?', answer: 'No. Describe los números suministrados y no puede establecer integridad, legalidad, eficiencia, justicia ni resultados.' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'Preparar una tabla', text: 'Crea una tabla CSV o JSON con categoría e importe por fila, usando la misma moneda y base contable.' },
109
+ { name: 'Añadir contexto', text: 'Añade población, periodo, priorAmount, moneda o categoría padre solo cuando mantengan un significado consistente.' },
110
+ { name: 'Cargar el archivo', text: 'Suelta el archivo o carga el ejemplo para ver la estructura esperada.' },
111
+ { name: 'Leer el paisaje', text: 'Usa las barras proporcionales para la composición y la tabla para valores, cambios y filas de origen.' },
112
+ { name: 'Revisar advertencias', text: 'Aclara monedas mezcladas, duplicados, ajustes negativos, denominadores cero y filas padre antes de concluir.' },
113
+ ],
114
+ schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
115
+ };
@@ -0,0 +1,115 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { PublicBudgetLocaleContent } from '../entry';
4
+ import type { PublicBudgetUI } from '../ui';
5
+
6
+ const ui: PublicBudgetUI = {
7
+ uploadLabel: 'Déposez ici un CSV ou JSON budgétaire',
8
+ uploadHelp: 'Champs requis: catégorie et montant. Facultatifs: population, période, priorAmount, devise et catégorie parente.',
9
+ loadExample: "Charger l'exemple de budget",
10
+ supportedFormat: 'CSV ou JSON, traité uniquement dans ce navigateur',
11
+ tableHeading: 'Lignes sources et totaux par catégorie',
12
+ categoryLabel: 'Catégorie',
13
+ amountLabel: 'Montant',
14
+ populationLabel: 'Population',
15
+ sourceRowsLabel: 'Lignes sources',
16
+ analyzeEmpty: "Choisissez un fichier ou chargez l'exemple pour examiner un budget.",
17
+ resultHeading: 'Paysage budgétaire',
18
+ totalLabel: 'Dépenses totales',
19
+ perCapitaLabel: 'Dépenses par personne',
20
+ variationLabel: 'Évolution par rapport à la période précédente',
21
+ topCategoryLabel: 'Catégorie principale',
22
+ shareLabel: 'Part du total',
23
+ sourceLabel: 'Lignes sources',
24
+ noData: "Aucune ligne budgétaire valide n'est encore disponible.",
25
+ warningsHeading: 'Avertissements à vérifier',
26
+ errorsHeading: 'Lignes non incluses',
27
+ methodHeading: 'Méthode appliquée',
28
+ methodText: "L'outil vérifie les champs requis, conserve chaque ligne source, regroupe les chemins de catégorie identiques et calcule les totaux à partir des montants normalisés. La part d'une catégorie correspond à son montant divisé par le total lorsque celui-ci est positif. La dépense par personne divise le total par le premier dénominateur de population positif et cohérent. L'évolution correspond à la différence divisée par la valeur absolue du montant précédent.",
29
+ limitsHeading: 'Ce que cet outil ne fait pas',
30
+ limitsText: "Il ne prouve pas qu'un budget est complet, comparable, légal, efficace, équitable, impartial ou correctement classé. Il n'audite pas la source, n'évalue pas une politique, ne convertit pas les devises et ne détermine pas si une ligne est une autorisation, une obligation, un paiement ou une prévision.",
31
+ edgeCasesHeading: 'Cas limites et alertes de données',
32
+ edgeCasesText: "Les devises mélangées, populations variables, catégories dupliquées, ajustements négatifs, lignes parentes avec leurs enfants, formats numériques locaux et montants précédents nuls demandent une vérification humaine. Le navigateur conserve le numéro de ligne original pour relier chaque agrégat à son entrée.",
33
+ downloadCsv: 'Télécharger la table vérifiée',
34
+ printAction: "Imprimer l'analyse",
35
+ rowsLabel: 'lignes valides',
36
+ categoriesLabel: 'catégories',
37
+ positiveTotalLabel: 'montants positifs visualisés',
38
+ previousTotalLabel: 'Total précédent',
39
+ invalidFile: "Le fichier n'a pas pu être compris comme une table CSV ou JSON non vide.",
40
+ fileReadError: "Le fichier n'a pas pu être lu dans ce navigateur.",
41
+ exampleName: 'Exemple de budget communal',
42
+ noPreviousData: 'Aucun montant comparable de la période précédente.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: "Analyseur de budget public",
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: 'Examinez localement les dépenses publiques, les parts par catégorie, les montants par personne et les évolutions.',
51
+ url: 'https://gamebob.dev/fr/analyse-budget-public-depenses',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: "Quelles colonnes l'analyseur nécessite-t-il?", acceptedAnswer: { '@type': 'Answer', text: 'Chaque ligne nécessite une catégorie et un montant numérique. La population, la période, priorAmount, la devise et la catégorie parente sont facultatifs.' } },
59
+ { '@type': 'Question', name: 'Comment les dépenses par personne sont-elles calculées?', acceptedAnswer: { '@type': 'Answer', text: 'Le montant total est divisé par la première valeur de population positive et cohérente. Des dénominateurs différents sont conservés et signalés.' } },
60
+ { '@type': 'Question', name: 'Que deviennent les catégories en double?', acceptedAnswer: { '@type': 'Answer', text: 'Les lignes ayant le même chemin de catégorie sont additionnées et leurs numéros de lignes sources restent visibles pour distinguer un découpage réel d un double comptage.' } },
61
+ { '@type': 'Question', name: 'L analyse peut-elle prouver qu un budget est bon ou juste?', acceptedAnswer: { '@type': 'Answer', text: "Non. Elle décrit les nombres fournis et ne peut pas établir leur exhaustivité, leur légalité, leur efficacité, leur équité, leur classement ou leurs résultats." } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: 'Analyser un tableau de budget public',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'Préparer un tableau', text: 'Créez un tableau CSV ou JSON avec une catégorie et un montant par ligne. Gardez la même devise et la même base comptable.' },
70
+ { '@type': 'HowToStep', name: 'Ajouter le contexte', text: 'Ajoutez population, période, priorAmount, devise ou catégorie parente seulement si leur sens reste cohérent.' },
71
+ { '@type': 'HowToStep', name: 'Charger le fichier', text: "Déposez le fichier dans l'analyseur ou chargez l'exemple pour voir la structure attendue et le résultat de la validation locale." },
72
+ { '@type': 'HowToStep', name: 'Lire le paysage', text: 'Utilisez les barres proportionnelles pour la composition, puis le tableau accessible pour les montants, évolutions et lignes sources exacts.' },
73
+ { '@type': 'HowToStep', name: 'Examiner les alertes', text: 'Clarifiez les devises mélangées, chemins en double, ajustements négatifs, dénominateurs nuls et lignes parentes avant de conclure.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'analyse-budget-public-depenses',
79
+ title: "Analyseur de budget public",
80
+ description: "Examinez localement un tableau de budget public pour voir les dépenses totales, les parts par catégorie, les dépenses par personne, les évolutions et les lignes sources derrière chaque agrégat.",
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: 'Transformer un tableau de budget public en vue vérifiable', level: 2 },
84
+ { type: 'paragraph', html: "Les fichiers de budget public mélangent souvent libellés de catégories, périodes comptables, dénominateurs de population et ajustements dans un tableau difficile à lire rapidement. Cet analyseur conserve les lignes sources, vérifie les champs requis et transforme les mêmes données normalisées en totaux, proportions, dépenses par personne et évolutions." },
85
+ { type: 'paragraph', html: "Le résultat est descriptif et ne constitue pas un jugement politique. Une catégorie importante peut refléter une compétence légale, un investissement ponctuel, un transfert ou une autre limite comptable. La vue rend ces motifs visibles afin de permettre une question plus précise dans le document source." },
86
+ { type: 'title', text: 'Comprendre les calculs', level: 2 },
87
+ { type: 'paragraph', html: "Le total additionne tous les montants numériques valides, y compris les ajustements négatifs. La part d'une catégorie est son montant regroupé divisé par le total lorsque celui-ci est positif. Les montants positifs reçoivent des barres proportionnelles; les montants négatifs restent dans le tableau et sont signalés, car une surface positive changerait leur sens." },
88
+ { type: 'table', headers: ['Résultat', 'Calcul', 'Question de vérification'], rows: [['Dépenses totales', 'Somme des montants normalisés', 'Toutes les lignes ont-elles la même base comptable?'], ['Part de catégorie', 'Montant de la catégorie divisé par le total positif', 'Les catégories sont-elles exclusives ou les parents recouvrent-ils les enfants?'], ['Dépenses par personne', 'Total divisé par un dénominateur de population positif', 'La population décrit-elle le même lieu et la même période?'], ['Évolution', 'Montant actuel moins montant précédent divisé par la valeur absolue du précédent', 'Les périodes sont-elles comparables et la base zéro est-elle évitée?']] },
89
+ { type: 'title', text: 'Préparer des données comparables', level: 2 },
90
+ { type: 'paragraph', html: "Utilisez une seule devise et une définition explicite du montant pour chaque ligne. Une autorisation budgétaire, une obligation, un paiement et une prévision peuvent être des chiffres valides tout en répondant à des questions différentes. Notez ce sens près de la source, car l'analyseur ne le déduit pas du nom de colonne." },
91
+ { type: 'list', items: ['Utilisez une ligne par catégorie ou indiquez une catégorie parente pour une hiérarchie volontaire.', 'Gardez les valeurs de population cohérentes et ne mélangez pas habitants, électeurs, ménages ou usagers.', 'Ajoutez priorAmount seulement si la période précédente utilise les mêmes catégories et la même base.', 'Vérifiez les chemins en double et les lignes parentes pour éviter un double comptage accidentel.', 'Conservez la table vérifiée avec la source et les hypothèses qui ont servi à la lire.'] },
92
+ { type: 'tip', title: "Une proportion n'est pas une note de priorité", html: "La catégorie au montant le plus élevé n'est pas automatiquement la plus importante, la plus gaspilleuse ou la plus efficace. Utilisez la vue pour repérer l'échelle et les évolutions, puis lisez les notes de source et les résultats du service." },
93
+ { type: 'title', text: 'Lire les alertes avant de conclure', level: 2 },
94
+ { type: 'paragraph', html: "Les chemins en double sont regroupés afin que l'agrégat ne soit pas sous-estimé en silence, mais la liste des lignes sources permet de vérifier si ce regroupement est intentionnel. Les devises mélangées ne sont jamais converties. Une population nulle supprime le résultat par personne et un montant précédent nul supprime le pourcentage d'évolution, car une division par zéro n'a pas de sens." },
95
+ { type: 'paragraph', html: "Les catégories imbriquées exigent une attention particulière. Si un tableau contient à la fois Éducation et Éducation > Écoles comme montants, les additionner peut compter deux fois la même dépense. L'outil signale les chemins imbriqués, mais seule la méthode de la source peut dire si la ligne parente est un sous-total ou une ligne indépendante." },
96
+ { type: 'title', text: 'Agir après le premier passage', level: 2 },
97
+ { type: 'paragraph', html: "Utilisez les numéros de lignes pour revenir au fichier officiel et documenter chaque correction ou interprétation. Comparez des périodes réellement comparables, conservez les ajustements négatifs comme ajustements et relancez l'analyse après avoir retiré les sous-totaux lorsque la source confirme qu'ils sont déjà inclus." },
98
+ { type: 'tip', title: 'Garder la limite des données visible', html: "Il s'agit d'une analyse descriptive locale. Elle ne vérifie pas que le fichier est complet, ne classe pas les dépenses selon une norme officielle, ne rapproche pas les devises et ne prouve pas un lien de causalité entre dépenses et résultats." },
99
+ ],
100
+ faq: [
101
+ { question: "Quelles colonnes l'analyseur nécessite-t-il?", answer: 'Chaque ligne nécessite une catégorie et un montant numérique. Population, période, priorAmount, devise et catégorie parente sont facultatifs.' },
102
+ { question: 'Comment les dépenses par personne sont-elles calculées?', answer: 'Le total est divisé par la première valeur de population positive et cohérente. Des dénominateurs différents produisent une alerte.' },
103
+ { question: 'Que deviennent les catégories en double?', answer: 'Les mêmes chemins de catégorie sont additionnés et leurs lignes sources restent visibles pour la vérification.' },
104
+ { question: "L'analyse peut-elle prouver qu'un budget est bon ou juste?", answer: "Non. Elle décrit les chiffres fournis et ne peut pas établir leur exhaustivité, légalité, efficacité, équité ou leurs résultats." },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'Préparer un tableau', text: 'Créez une table CSV ou JSON avec catégorie et montant par ligne, dans la même devise et base comptable.' },
109
+ { name: 'Ajouter le contexte', text: 'Ajoutez population, période, priorAmount, devise ou catégorie parente seulement si leur sens est cohérent.' },
110
+ { name: 'Charger le fichier', text: "Déposez le fichier ou chargez l'exemple pour voir la structure attendue." },
111
+ { name: 'Lire le paysage', text: 'Utilisez les barres proportionnelles pour la composition et le tableau pour les valeurs, évolutions et lignes sources.' },
112
+ { name: 'Examiner les alertes', text: 'Clarifiez devises mélangées, doublons, ajustements négatifs, dénominateurs nuls et lignes parentes avant de conclure.' },
113
+ ],
114
+ schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
115
+ };
@@ -0,0 +1,115 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { PublicBudgetLocaleContent } from '../entry';
4
+ import type { PublicBudgetUI } from '../ui';
5
+
6
+ const ui: PublicBudgetUI = {
7
+ uploadLabel: 'Letakkan CSV atau JSON anggaran di sini',
8
+ uploadHelp: 'Kolom wajib: kategori dan jumlah. Opsional: populasi, periode, priorAmount, mata uang, dan kategori induk.',
9
+ loadExample: 'Muat contoh anggaran',
10
+ supportedFormat: 'CSV atau JSON, diproses hanya di browser ini',
11
+ tableHeading: 'Baris sumber dan total kategori',
12
+ categoryLabel: 'Kategori',
13
+ amountLabel: 'Jumlah',
14
+ populationLabel: 'Populasi',
15
+ sourceRowsLabel: 'Baris sumber',
16
+ analyzeEmpty: 'Pilih berkas atau muat contoh untuk memeriksa anggaran.',
17
+ resultHeading: 'Lanskap anggaran',
18
+ totalLabel: 'Total belanja',
19
+ perCapitaLabel: 'Belanja per orang',
20
+ variationLabel: 'Perubahan dari periode sebelumnya',
21
+ topCategoryLabel: 'Kategori terbesar',
22
+ shareLabel: 'Bagian dari total',
23
+ sourceLabel: 'Baris sumber',
24
+ noData: 'Belum ada baris anggaran yang valid.',
25
+ warningsHeading: 'Peringatan untuk ditinjau',
26
+ errorsHeading: 'Baris yang tidak disertakan',
27
+ methodHeading: 'Metode yang digunakan',
28
+ methodText: 'Alat ini memeriksa kolom wajib, mempertahankan setiap baris sumber, mengelompokkan jalur kategori yang sama, dan menghitung total dari jumlah yang dinormalisasi. Bagian kategori adalah jumlah kategori dibagi total ketika totalnya positif. Belanja per orang membagi total dengan nilai populasi positif pertama yang konsisten. Perubahan periode adalah selisih dibagi nilai absolut jumlah sebelumnya.',
29
+ limitsHeading: 'Yang tidak dilakukan alat ini',
30
+ limitsText: 'Alat ini tidak membuktikan bahwa anggaran lengkap, dapat dibandingkan, sah, efisien, adil, tidak bias, atau diklasifikasikan dengan benar. Alat ini tidak mengaudit sumber, menilai mutu kebijakan, mengonversi mata uang, atau menentukan apakah baris merupakan alokasi, kewajiban, pembayaran, atau prakiraan.',
31
+ edgeCasesHeading: 'Kasus khusus dan peringatan data',
32
+ edgeCasesText: 'Mata uang campuran, populasi yang berubah, kategori ganda, penyesuaian negatif, baris induk bersama baris anak, format angka lokal, dan jumlah periode sebelumnya yang nol memerlukan pemeriksaan manusia. Browser menyimpan nomor baris asli agar setiap agregat dapat ditelusuri ke inputnya.',
33
+ downloadCsv: 'Unduh tabel yang ditinjau',
34
+ printAction: 'Cetak analisis',
35
+ rowsLabel: 'baris valid',
36
+ categoriesLabel: 'kategori',
37
+ positiveTotalLabel: 'jumlah positif yang divisualisasikan',
38
+ previousTotalLabel: 'Total sebelumnya',
39
+ invalidFile: 'Berkas tidak dapat dipahami sebagai tabel CSV atau JSON yang tidak kosong.',
40
+ fileReadError: 'Berkas tidak dapat dibaca di browser ini.',
41
+ exampleName: 'Contoh anggaran kota',
42
+ noPreviousData: 'Jumlah periode sebelumnya yang dapat dibandingkan tidak diberikan.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: 'Penganalisis anggaran publik',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: 'Periksa belanja publik, bagian kategori, jumlah per orang, dan perubahan antarperiode secara lokal.',
51
+ url: 'https://gamebob.dev/id/analisis-anggaran-publik-pengeluaran',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: 'Kolom apa yang diperlukan?', acceptedAnswer: { '@type': 'Answer', text: 'Setiap baris memerlukan kategori dan jumlah numerik. Populasi, periode, priorAmount, mata uang, dan kategori induk bersifat opsional.' } },
59
+ { '@type': 'Question', name: 'Bagaimana belanja per orang dihitung?', acceptedAnswer: { '@type': 'Answer', text: 'Jumlah total dibagi dengan nilai populasi positif pertama yang konsisten. Penyebut yang berbeda tetap terlihat dan menimbulkan peringatan.' } },
60
+ { '@type': 'Question', name: 'Apa yang terjadi pada kategori ganda?', acceptedAnswer: { '@type': 'Answer', text: 'Baris dengan jalur kategori yang sama dijumlahkan dan nomor baris sumbernya tetap terlihat untuk membedakan pembagian nyata dari penghitungan ganda.' } },
61
+ { '@type': 'Question', name: 'Apakah alat ini membuktikan anggaran baik atau adil?', acceptedAnswer: { '@type': 'Answer', text: 'Tidak. Alat ini menggambarkan angka yang diberikan dan tidak menetapkan kelengkapan, legalitas, efisiensi, keadilan, klasifikasi, atau hasilnya.' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: 'Menganalisis tabel anggaran publik',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'Siapkan tabel', text: 'Buat tabel CSV atau JSON dengan satu kategori dan jumlah per baris. Gunakan mata uang dan dasar akuntansi yang sama.' },
70
+ { '@type': 'HowToStep', name: 'Tambahkan konteks', text: 'Tambahkan populasi, periode, priorAmount, mata uang, atau kategori induk hanya jika maknanya konsisten.' },
71
+ { '@type': 'HowToStep', name: 'Muat berkas', text: 'Letakkan berkas di alat atau muat contoh untuk melihat bentuk data dan hasil validasi lokal.' },
72
+ { '@type': 'HowToStep', name: 'Baca lanskap', text: 'Gunakan batang proporsional untuk komposisi dan tabel yang dapat diakses untuk jumlah, perubahan, dan baris sumber.' },
73
+ { '@type': 'HowToStep', name: 'Tinjau peringatan', text: 'Periksa mata uang campuran, jalur ganda, penyesuaian negatif, penyebut nol, dan baris induk sebelum mengambil kesimpulan.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'analisis-anggaran-publik-pengeluaran',
79
+ title: 'Penganalisis anggaran publik',
80
+ description: 'Periksa tabel anggaran publik secara lokal untuk melihat total belanja, bagian kategori, belanja per orang, perubahan, dan baris sumber di balik setiap agregat.',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: 'Ubah tabel anggaran publik menjadi tampilan yang dapat diaudit', level: 2 },
84
+ { type: 'paragraph', html: 'Berkas anggaran publik sering mencampur label kategori, periode akuntansi, penyebut populasi, dan penyesuaian dalam tabel yang sulit dibaca sekilas. Alat ini mempertahankan baris sumber, memeriksa kolom wajib, lalu mengubah data yang sama menjadi total, proporsi kategori, belanja per orang, dan perubahan periode.' },
85
+ { type: 'paragraph', html: 'Hasilnya bersifat deskriptif, bukan penilaian politik. Kategori besar dapat mencerminkan tanggung jawab hukum, investasi satu kali, transfer, atau batas akuntansi yang berbeda. Tampilan ini membuat pola tersebut terlihat agar sumber dapat diperiksa dengan pertanyaan yang lebih tepat.' },
86
+ { type: 'title', text: 'Arti perhitungannya', level: 2 },
87
+ { type: 'paragraph', html: 'Total adalah jumlah semua angka yang valid, termasuk penyesuaian negatif. Bagian kategori adalah jumlah kategori yang dikelompokkan dibagi total ketika totalnya positif. Jumlah positif diberi batang proporsional, sedangkan jumlah negatif tetap berada di tabel karena area positif akan mengubah maknanya.' },
88
+ { type: 'table', headers: ['Hasil', 'Perhitungan', 'Pertanyaan pemeriksaan'], rows: [['Total belanja', 'Jumlah nilai yang dinormalisasi', 'Apakah semua baris memakai dasar akuntansi yang sama?'], ['Bagian kategori', 'Jumlah kategori dibagi total positif', 'Apakah kategori saling terpisah atau induk tumpang tindih dengan anak?'], ['Belanja per orang', 'Total dibagi penyebut populasi positif', 'Apakah populasi menggambarkan tempat dan periode yang sama?'], ['Perubahan periode', 'Jumlah kini dikurangi sebelumnya dibagi nilai absolut sebelumnya', 'Apakah periode dapat dibandingkan dan dasar nol dihindari?']] },
89
+ { type: 'title', text: 'Siapkan data yang dapat dibandingkan', level: 2 },
90
+ { type: 'paragraph', html: 'Gunakan satu mata uang dan makna jumlah yang jelas untuk setiap baris. Alokasi anggaran, kewajiban, pembayaran, dan prakiraan dapat menjadi angka yang valid tetapi menjawab pertanyaan berbeda. Catat makna itu di dekat sumber karena alat tidak dapat menebaknya dari nama kolom.' },
91
+ { type: 'list', items: ['Gunakan satu baris untuk setiap kategori atau berikan kategori induk untuk hierarki yang disengaja.', 'Jaga nilai populasi tetap konsisten dan jangan mencampur penduduk, pemilih, rumah tangga, atau pengguna layanan.', 'Sertakan priorAmount hanya jika periode sebelumnya memakai kategori dan dasar yang sama.', 'Periksa jalur kategori ganda dan baris induk untuk menghindari penghitungan ganda.', 'Simpan tabel yang ditinjau bersama sumber asli dan asumsi yang digunakan.'] },
92
+ { type: 'tip', title: 'Proporsi bukan skor prioritas', html: 'Kategori dengan jumlah terbesar tidak otomatis paling penting, paling boros, atau paling berhasil. Gunakan tampilan untuk menemukan skala dan perubahan, lalu baca catatan sumber dan hasil layanan.' },
93
+ { type: 'title', text: 'Baca peringatan sebelum mengambil kesimpulan', level: 2 },
94
+ { type: 'paragraph', html: 'Jalur ganda dikelompokkan agar agregat tidak diam diam terlalu rendah, tetapi daftar baris sumber menunjukkan apakah pengelompokan itu disengaja. Mata uang campuran tidak pernah dikonversi. Populasi nol menghapus hasil per orang dan jumlah sebelumnya nol menghapus persentase perubahan karena pembagian dengan nol tidak memiliki arti yang dapat diandalkan.' },
95
+ { type: 'paragraph', html: 'Kategori bertingkat memerlukan perhatian khusus. Jika tabel berisi Pendidikan dan Pendidikan > Sekolah sebagai jumlah, menjumlahkannya dapat menghitung belanja yang sama dua kali. Alat memberi peringatan tentang jalur bertingkat, tetapi hanya metode sumber yang dapat menjelaskan apakah baris induk adalah subtotal atau pos mandiri.' },
96
+ { type: 'title', text: 'Tindakan setelah analisis pertama', level: 2 },
97
+ { type: 'paragraph', html: 'Gunakan nomor baris untuk kembali ke berkas resmi dan mencatat setiap koreksi atau tafsiran. Bandingkan periode yang setara, pertahankan penyesuaian negatif sebagai penyesuaian, dan jalankan kembali analisis setelah menghapus subtotal jika sumber memastikan subtotal tersebut sudah termasuk.' },
98
+ { type: 'tip', title: 'Pertahankan batas data tetap terlihat', html: 'Ini adalah analisis deskriptif lokal. Alat tidak memeriksa kelengkapan berkas, tidak mengklasifikasikan belanja menurut standar resmi, tidak menyelaraskan mata uang, dan tidak membuktikan hubungan sebab akibat antara belanja dan hasil.' },
99
+ ],
100
+ faq: [
101
+ { question: 'Kolom apa yang diperlukan?', answer: 'Setiap baris memerlukan kategori dan jumlah numerik. Populasi, periode, priorAmount, mata uang, dan kategori induk bersifat opsional.' },
102
+ { question: 'Bagaimana belanja per orang dihitung?', answer: 'Total dibagi dengan nilai populasi positif pertama yang konsisten. Penyebut yang berbeda menghasilkan peringatan.' },
103
+ { question: 'Apa yang terjadi pada kategori ganda?', answer: 'Jalur kategori yang sama dijumlahkan dan baris sumbernya tetap terlihat untuk ditinjau.' },
104
+ { question: 'Apakah alat ini membuktikan anggaran baik atau adil?', answer: 'Tidak. Alat ini menggambarkan angka dan tidak dapat menetapkan kelengkapan, legalitas, efisiensi, keadilan, atau hasil.' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'Siapkan tabel', text: 'Buat tabel CSV atau JSON dengan kategori dan jumlah per baris menggunakan mata uang dan dasar akuntansi yang sama.' },
109
+ { name: 'Tambahkan konteks', text: 'Tambahkan populasi, periode, priorAmount, mata uang, atau kategori induk hanya jika maknanya konsisten.' },
110
+ { name: 'Muat berkas', text: 'Letakkan berkas atau muat contoh untuk melihat bentuk data yang diharapkan.' },
111
+ { name: 'Baca lanskap', text: 'Gunakan batang proporsional untuk komposisi dan tabel untuk nilai, perubahan, serta baris sumber.' },
112
+ { name: 'Tinjau peringatan', text: 'Periksa mata uang campuran, duplikat, penyesuaian negatif, penyebut nol, dan baris induk sebelum menyimpulkan.' },
113
+ ],
114
+ schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
115
+ };
@@ -0,0 +1,115 @@
1
+ import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { PublicBudgetLocaleContent } from '../entry';
4
+ import type { PublicBudgetUI } from '../ui';
5
+
6
+ const ui: PublicBudgetUI = {
7
+ uploadLabel: 'Trascina qui un CSV o JSON di bilancio',
8
+ uploadHelp: 'Campi obbligatori: categoria e importo. Facoltativi: popolazione, periodo, priorAmount, valuta e categoria padre.',
9
+ loadExample: 'Carica il bilancio di esempio',
10
+ supportedFormat: 'CSV o JSON, elaborato solo in questo browser',
11
+ tableHeading: 'Righe fonte e totali per categoria',
12
+ categoryLabel: 'Categoria',
13
+ amountLabel: 'Importo',
14
+ populationLabel: 'Popolazione',
15
+ sourceRowsLabel: 'Righe fonte',
16
+ analyzeEmpty: 'Scegli un file o carica l esempio per esaminare un bilancio.',
17
+ resultHeading: 'Paesaggio del bilancio',
18
+ totalLabel: 'Spesa totale',
19
+ perCapitaLabel: 'Spesa per persona',
20
+ variationLabel: 'Variazione rispetto al periodo precedente',
21
+ topCategoryLabel: 'Categoria principale',
22
+ shareLabel: 'Quota del totale',
23
+ sourceLabel: 'Righe fonte',
24
+ noData: 'Non ci sono ancora righe di bilancio valide.',
25
+ warningsHeading: 'Avvisi da controllare',
26
+ errorsHeading: 'Righe non incluse',
27
+ methodHeading: 'Metodo applicato',
28
+ methodText: 'Lo strumento verifica i campi obbligatori, conserva ogni riga fonte, raggruppa i percorsi di categoria identici e calcola i totali dagli importi normalizzati. La quota di una categoria è il suo importo diviso per il totale quando il totale è positivo. La spesa per persona divide il totale per il primo denominatore di popolazione positivo e coerente. La variazione del periodo è la differenza divisa per il valore assoluto dell importo precedente.',
29
+ limitsHeading: 'Cosa non fa questo strumento',
30
+ limitsText: 'Non dimostra che un bilancio sia completo, comparabile, legale, efficiente, equo, imparziale o classificato correttamente. Non controlla la fonte, non valuta la qualità di una politica, non converte le valute e non stabilisce se una riga sia uno stanziamento, un impegno, un pagamento o una previsione.',
31
+ edgeCasesHeading: 'Casi limite e avvisi sui dati',
32
+ edgeCasesText: 'Valute miste, popolazioni variabili, categorie duplicate, rettifiche negative, righe padre insieme alle figlie, formati numerici locali e importi precedenti pari a zero richiedono una verifica umana. Il browser conserva il numero della riga originale per collegare ogni aggregato al dato inserito.',
33
+ downloadCsv: 'Scarica la tabella verificata',
34
+ printAction: 'Stampa l analisi',
35
+ rowsLabel: 'righe valide',
36
+ categoriesLabel: 'categorie',
37
+ positiveTotalLabel: 'importi positivi visualizzati',
38
+ previousTotalLabel: 'Totale precedente',
39
+ invalidFile: 'Il file non è stato riconosciuto come una tabella CSV o JSON non vuota.',
40
+ fileReadError: 'Il file non può essere letto in questo browser.',
41
+ exampleName: 'Esempio di bilancio comunale',
42
+ noPreviousData: 'Non è stato fornito un importo precedente comparabile.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: 'Analizzatore di bilancio pubblico',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: 'Esamina localmente la spesa pubblica, le quote per categoria, gli importi per persona e le variazioni tra periodi.',
51
+ url: 'https://gamebob.dev/it/analizzatore-bilancio-pubblico-spesa',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: 'Quali colonne servono all analizzatore?', acceptedAnswer: { '@type': 'Answer', text: 'Ogni riga richiede una categoria e un importo numerico. Popolazione, periodo, priorAmount, valuta e categoria padre sono facoltativi.' } },
59
+ { '@type': 'Question', name: 'Come si calcola la spesa per persona?', acceptedAnswer: { '@type': 'Answer', text: 'L importo totale viene diviso per il primo valore di popolazione positivo e coerente. Denominatori diversi restano visibili e producono un avviso.' } },
60
+ { '@type': 'Question', name: 'Cosa succede alle categorie duplicate?', acceptedAnswer: { '@type': 'Answer', text: 'Le righe con lo stesso percorso di categoria vengono sommate e i numeri delle righe fonte restano visibili per distinguere una divisione reale da un doppio conteggio.' } },
61
+ { '@type': 'Question', name: 'Può dimostrare che un bilancio è buono o equo?', acceptedAnswer: { '@type': 'Answer', text: 'No. Descrive i numeri forniti e non stabilisce completezza, legalità, efficienza, equità, classificazione o risultati.' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: 'Analizzare una tabella di bilancio pubblico',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'Prepara una tabella', text: 'Crea una tabella CSV o JSON con una categoria e un importo per riga. Mantieni la stessa valuta e base contabile.' },
70
+ { '@type': 'HowToStep', name: 'Aggiungi il contesto', text: 'Aggiungi popolazione, periodo, priorAmount, valuta o categoria padre solo quando il loro significato è coerente.' },
71
+ { '@type': 'HowToStep', name: 'Carica il file', text: 'Trascina il file nell analizzatore o carica l esempio per vedere la struttura prevista e la validazione locale.' },
72
+ { '@type': 'HowToStep', name: 'Leggi il paesaggio', text: 'Usa le barre proporzionali per la composizione e la tabella accessibile per importi, variazioni e righe fonte esatti.' },
73
+ { '@type': 'HowToStep', name: 'Controlla gli avvisi', text: 'Chiarisci valute miste, percorsi duplicati, rettifiche negative, denominatori nulli e righe padre prima di concludere.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'analizzatore-bilancio-pubblico-spesa',
79
+ title: 'Analizzatore di bilancio pubblico',
80
+ description: 'Esamina localmente una tabella di bilancio pubblico per vedere spesa totale, quote per categoria, spesa per persona, variazioni e righe fonte dietro ogni aggregato.',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: 'Trasforma una tabella di bilancio pubblico in una vista verificabile', level: 2 },
84
+ { type: 'paragraph', html: 'I file di bilancio pubblico spesso mescolano etichette di categoria, periodi contabili, denominatori della popolazione e rettifiche in una tabella difficile da leggere rapidamente. Questo analizzatore conserva le righe fonte, verifica i campi richiesti e trasforma gli stessi dati normalizzati in totali, proporzioni, spesa per persona e variazioni tra periodi.' },
85
+ { type: 'paragraph', html: 'Il risultato è descrittivo e non esprime un giudizio politico. Una categoria grande può riflettere una responsabilità prevista dalla legge, un investimento una tantum, un trasferimento o un diverso confine contabile. La vista rende visibili questi schemi così chi esamina la fonte può porre una domanda più precisa.' },
86
+ { type: 'title', text: 'Cosa significano i calcoli', level: 2 },
87
+ { type: 'paragraph', html: 'Il totale è la somma degli importi numerici validi, comprese le rettifiche negative. La quota di una categoria è il suo importo raggruppato diviso per il totale quando il totale è positivo. Gli importi positivi ricevono barre proporzionali; gli importi negativi restano nella tabella e vengono segnalati perché una superficie positiva ne cambierebbe il significato.' },
88
+ { type: 'table', headers: ['Risultato', 'Calcolo', 'Domanda di verifica'], rows: [['Spesa totale', 'Somma degli importi normalizzati', 'Tutte le righe hanno la stessa base contabile?'], ['Quota di categoria', 'Importo della categoria diviso per il totale positivo', 'Le categorie sono esclusive o i padri si sovrappongono alle figlie?'], ['Spesa per persona', 'Totale diviso per un denominatore positivo di popolazione', 'La popolazione descrive lo stesso luogo e periodo?'], ['Variazione', 'Importo attuale meno precedente diviso per il valore assoluto del precedente', 'I periodi sono comparabili e si evita una base pari a zero?']] },
89
+ { type: 'title', text: 'Preparare dati confrontabili', level: 2 },
90
+ { type: 'paragraph', html: 'Usa una sola valuta e un significato esplicito dell importo per ogni riga. Uno stanziamento, un impegno, un pagamento e una previsione possono essere numeri validi ma rispondere a domande diverse. Registra questo significato accanto alla fonte perché l analizzatore non lo deduce dal nome della colonna.' },
91
+ { type: 'list', items: ['Usa una riga per categoria oppure indica una categoria padre per una gerarchia intenzionale.', 'Mantieni coerenti i valori della popolazione e non mescolare residenti, elettori, famiglie o utenti del servizio.', 'Includi priorAmount solo quando il periodo precedente usa le stesse categorie e la stessa base.', 'Controlla i percorsi duplicati e le righe padre per evitare doppi conteggi accidentali.', 'Conserva la tabella verificata con la fonte originale e le ipotesi utilizzate.'] },
92
+ { type: 'tip', title: 'Una proporzione non è un punteggio di priorità', html: 'La categoria con l importo maggiore non è automaticamente la più importante, sprecona o efficace. Usa la vista per individuare scala e cambiamenti, poi leggi le note della fonte e i risultati del servizio.' },
93
+ { type: 'title', text: 'Leggere gli avvisi prima di concludere', level: 2 },
94
+ { type: 'paragraph', html: 'I percorsi duplicati vengono raggruppati affinché l aggregato non sia ridotto senza avviso, ma l elenco delle righe fonte permette di controllare se il raggruppamento è intenzionale. Le valute miste non vengono mai convertite. Una popolazione nulla rimuove il risultato per persona e un importo precedente nullo rimuove la variazione percentuale, perché la divisione per zero non ha un interpretazione utile.' },
95
+ { type: 'paragraph', html: 'Le categorie annidate richiedono particolare attenzione. Se una tabella contiene sia Istruzione sia Istruzione > Scuole come importi, sommarle può contare due volte la stessa spesa. Lo strumento avvisa dei percorsi annidati, ma solo la metodologia della fonte può stabilire se la riga padre è un subtotale oppure una voce indipendente.' },
96
+ { type: 'title', text: 'Cosa fare dopo la prima analisi', level: 2 },
97
+ { type: 'paragraph', html: 'Usa i numeri delle righe per tornare al file ufficiale e documentare ogni correzione o interpretazione. Confronta periodi equivalenti, conserva le rettifiche negative come rettifiche e ripeti l analisi dopo aver rimosso i subtotali quando la fonte conferma che sono già inclusi.' },
98
+ { type: 'tip', title: 'Mantieni visibile il confine dei dati', html: 'Questa è un analisi descrittiva locale. Non verifica che il file sia completo, non classifica la spesa secondo uno standard ufficiale, non riconcilia le valute e non dimostra un rapporto causale tra spesa e risultati.' },
99
+ ],
100
+ faq: [
101
+ { question: 'Quali colonne servono all analizzatore?', answer: 'Ogni riga richiede categoria e importo numerico. Popolazione, periodo, priorAmount, valuta e categoria padre sono facoltativi.' },
102
+ { question: 'Come si calcola la spesa per persona?', answer: 'Il totale viene diviso per il primo valore di popolazione positivo e coerente. Denominatori diversi producono un avviso.' },
103
+ { question: 'Cosa succede alle categorie duplicate?', answer: 'Gli stessi percorsi di categoria vengono sommati e le righe fonte restano visibili per la verifica.' },
104
+ { question: 'Può dimostrare che un bilancio è buono o equo?', answer: 'No. Descrive i numeri forniti e non può stabilire completezza, legalità, efficienza, equità o risultati.' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'Preparare una tabella', text: 'Crea una tabella CSV o JSON con categoria e importo per riga, usando la stessa valuta e base contabile.' },
109
+ { name: 'Aggiungere il contesto', text: 'Aggiungi popolazione, periodo, priorAmount, valuta o categoria padre solo quando il significato è coerente.' },
110
+ { name: 'Caricare il file', text: 'Trascina il file o carica l esempio per vedere la struttura prevista.' },
111
+ { name: 'Leggere il paesaggio', text: 'Usa le barre proporzionali per la composizione e la tabella per valori, variazioni e righe fonte.' },
112
+ { name: 'Controllare gli avvisi', text: 'Chiarisci valute miste, duplicati, rettifiche negative, denominatori nulli e righe padre prima di concludere.' },
113
+ ],
114
+ schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
115
+ };