@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: '予算の CSV または JSON をここにドロップ',
8
+ uploadHelp: '必須項目: カテゴリと金額。任意項目: 人口、期間、priorAmount、通貨、親カテゴリ。',
9
+ loadExample: 'サンプル予算を読み込む',
10
+ supportedFormat: 'CSV または JSON、このブラウザ内だけで処理',
11
+ tableHeading: '元データの行とカテゴリ合計',
12
+ categoryLabel: 'カテゴリ',
13
+ amountLabel: '金額',
14
+ populationLabel: '人口',
15
+ sourceRowsLabel: '元データの行',
16
+ analyzeEmpty: 'ファイルを選ぶかサンプルを読み込んで予算を確認してください。',
17
+ resultHeading: '予算の風景',
18
+ totalLabel: '支出合計',
19
+ perCapitaLabel: '一人あたりの支出',
20
+ variationLabel: '前の期間からの変化',
21
+ topCategoryLabel: '最大のカテゴリ',
22
+ shareLabel: '合計に占める割合',
23
+ sourceLabel: '元データの行',
24
+ noData: '有効な予算行はまだありません。',
25
+ warningsHeading: '確認が必要な警告',
26
+ errorsHeading: '含まれなかった行',
27
+ methodHeading: '適用した方法',
28
+ methodText: '必須項目を検証し、元データの各行を保持し、同じカテゴリパスをまとめ、正規化した金額から合計を計算します。カテゴリの割合は、合計が正の場合にカテゴリ金額を合計で割ったものです。一人あたりの支出は、最初に見つかった一貫した正の人口を分母にします。期間の変化は、現在と前の金額の差を前の金額の絶対値で割ります。',
29
+ limitsHeading: 'このツールで分からないこと',
30
+ limitsText: '予算が完全、比較可能、合法、効率的、公平、中立、正しく分類されていることは証明しません。元資料を監査せず、政策の質を評価せず、通貨を換算せず、行が予算配分、債務、支払い、予測のどれかも判定しません。',
31
+ edgeCasesHeading: '特殊なデータと警告',
32
+ edgeCasesText: '複数の通貨、異なる人口、重複カテゴリ、負の調整、親行と子行の併記、地域ごとの数値形式、前期間の金額がゼロの場合は人による確認が必要です。元の行番号を保持するため、各集計を入力データまで追跡できます。',
33
+ downloadCsv: '確認済みテーブルをダウンロード',
34
+ printAction: '分析を印刷',
35
+ rowsLabel: '有効な行',
36
+ categoriesLabel: 'カテゴリ',
37
+ positiveTotalLabel: '可視化した正の金額',
38
+ previousTotalLabel: '前の合計',
39
+ invalidFile: '空でない CSV または JSON テーブルとして読み取れませんでした。',
40
+ fileReadError: 'このブラウザでファイルを読み取れませんでした。',
41
+ exampleName: '自治体予算のサンプル',
42
+ noPreviousData: '比較できる前期間の金額がありません。',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: '公共予算分析ツール',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: '公共支出、カテゴリ割合、一人あたりの金額、期間ごとの変化をローカルで確認します。',
51
+ url: 'https://gamebob.dev/ja/koukyou-yosan-shishutsu-bunseki',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: 'どの列が必要ですか', acceptedAnswer: { '@type': 'Answer', text: '各行にカテゴリと数値の金額が必要です。人口、期間、priorAmount、通貨、親カテゴリは任意です。' } },
59
+ { '@type': 'Question', name: '一人あたりの支出はどう計算しますか', acceptedAnswer: { '@type': 'Answer', text: '合計金額を、最初に見つかった一貫した正の人口で割ります。分母が異なる場合は警告を表示します。' } },
60
+ { '@type': 'Question', name: '重複するカテゴリはどうなりますか', acceptedAnswer: { '@type': 'Answer', text: '同じカテゴリパスの行を合算し、元の行番号を表示します。実際の分割と二重計上を確認できます。' } },
61
+ { '@type': 'Question', name: '予算が良いか公平かを証明できますか', acceptedAnswer: { '@type': 'Answer', text: 'いいえ。入力された数値を説明するだけで、完全性、合法性、効率、公平性、分類、成果は判定しません。' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: '公共予算テーブルを分析する',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'テーブルを準備する', text: '各行にカテゴリと金額を持つ CSV または JSON を作ります。通貨と会計上の基準をそろえます。' },
70
+ { '@type': 'HowToStep', name: '文脈を加える', text: '人口、期間、priorAmount、通貨、親カテゴリは意味が一貫するときだけ加えます。' },
71
+ { '@type': 'HowToStep', name: 'ファイルを読み込む', text: 'ファイルをドロップするかサンプルを読み込み、期待される形式とローカル検証を確認します。' },
72
+ { '@type': 'HowToStep', name: '風景を読む', text: '構成は比例バーで確認し、正確な金額、変化、元データの行はアクセシブルな表で確認します。' },
73
+ { '@type': 'HowToStep', name: '警告を確認する', text: '結論を出す前に、通貨の混在、重複パス、負の調整、ゼロの分母、親行を確認します。' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'public-budget-analyzer',
79
+ title: '公共予算分析ツール',
80
+ description: '公共予算テーブルをローカルで確認し、支出合計、カテゴリ割合、一人あたりの支出、変化、各集計の元データ行を表示します。',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: '公共予算テーブルを検証できるビューに変える', level: 2 },
84
+ { type: 'paragraph', html: '公共予算のファイルには、カテゴリ名、会計期間、人口の分母、調整額が一つの読みづらい表に混在していることがあります。このツールは元データの行を残し、必須項目を確認し、同じ正規化データから合計、割合、一人あたりの支出、期間の変化を作ります。' },
85
+ { type: 'paragraph', html: '結果は数値の説明であり、政策への評価ではありません。大きなカテゴリは法定の責任、一度だけの投資、移転、異なる会計範囲を表すことがあります。このビューはその違いを見えるようにし、元資料へ戻るための問いを具体的にします。' },
86
+ { type: 'title', text: '計算結果の意味', level: 2 },
87
+ { type: 'paragraph', html: '合計は負の調整を含む有効な数値の合算です。合計が正の場合、カテゴリ割合はカテゴリの集計額を合計で割った値です。正の金額は比例バーで表示し、負の金額は表に残します。正の面積で表示すると意味が変わるためです。' },
88
+ { type: 'table', headers: ['出力', '計算', '確認する質問'], rows: [['支出合計', '正規化した金額の合計', 'すべての行は同じ会計基準ですか'], ['カテゴリ割合', 'カテゴリ金額を正の合計で割る', 'カテゴリは排他的ですか。親と子が重なっていませんか'], ['一人あたりの支出', '合計を正の人口分母で割る', '人口は同じ場所と期間を表していますか'], ['期間の変化', '現在額から前額を引き絶対値の前額で割る', '期間は比較可能で、ゼロの基準を避けていますか']] },
89
+ { type: 'title', text: '比較できるデータを準備する', level: 2 },
90
+ { type: 'paragraph', html: 'すべての行で一つの通貨を使い、金額の意味を明確にします。予算の承認額、債務、支払い、予測は有効な数値でも、答える問いが異なります。列名だけではその意味を判断できないため、元資料の横に記録してください。' },
91
+ { type: 'list', items: ['カテゴリごとに一行を使うか、意図した階層のために親カテゴリを指定します。', '人口の値をそろえ、住民、選挙人、世帯、サービス利用者を混ぜません。', 'priorAmount は前期間が同じカテゴリと基準を使う場合だけ追加します。', '重複パスと親行を確認し、偶発的な二重計上を避けます。', '確認済みテーブルを元資料と解釈の前提とともに保存します。'] },
92
+ { type: 'tip', title: '割合は優先順位ではありません', html: '金額が最大のカテゴリが、最も重要、浪費的、成功しているとは限りません。規模と変化を見つけるために使い、その後で元資料の注記とサービスの成果を確認してください。' },
93
+ { type: 'title', text: '結論の前に警告を読む', level: 2 },
94
+ { type: 'paragraph', html: '重複パスは集計を小さく見せないようにまとめますが、元データの行一覧で意図したグループ化か確認できます。通貨は変換しません。人口がゼロなら一人あたりの結果を、前期間の金額がゼロなら変化率を表示しません。ゼロ除算には意味のある解釈がないためです。' },
95
+ { type: 'paragraph', html: '階層化されたカテゴリには注意が必要です。教育と教育 > 学校の両方が金額として存在する場合、足し合わせると同じ支出を二度数える可能性があります。親行が小計か独立した項目かは元資料の方法を確認してください。' },
96
+ { type: 'title', text: '最初の分析の後にすること', level: 2 },
97
+ { type: 'paragraph', html: '行番号を使って公式ファイルに戻り、修正や解釈を記録します。同じ意味の期間だけを比べ、負の調整は調整として残し、元資料が小計を含むと示す場合は小計を除いて再分析します。' },
98
+ { type: 'tip', title: 'データの限界を見えるようにする', html: 'これはローカルで行う説明的な分析です。ファイルの完全性、公式分類、通貨の整合、支出と成果の因果関係を検証するものではありません。' },
99
+ ],
100
+ faq: [
101
+ { question: 'どの列が必要ですか', answer: '各行にカテゴリと数値の金額が必要です。人口、期間、priorAmount、通貨、親カテゴリは任意です。' },
102
+ { question: '一人あたりの支出はどう計算しますか', answer: '合計を最初の一貫した正の人口で割ります。分母が異なると警告が出ます。' },
103
+ { question: '重複するカテゴリはどうなりますか', answer: '同じカテゴリパスを合算し、元の行を確認できるようにします。' },
104
+ { question: '予算が良いか公平かを証明できますか', answer: 'いいえ。入力された数値を説明するだけで、完全性、合法性、効率、公平性、成果は判定しません。' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'テーブルを準備する', text: '同じ通貨と会計基準で、カテゴリと金額を各行に持つ CSV または JSON を作ります。' },
109
+ { name: '文脈を加える', text: '人口、期間、priorAmount、通貨、親カテゴリは意味が一貫するときだけ加えます。' },
110
+ { name: 'ファイルを読み込む', text: 'ファイルをドロップするかサンプルを読み込み、期待される形式を確認します。' },
111
+ { name: '風景を読む', text: '比例バーで構成を、表で値、変化、元データの行を確認します。' },
112
+ { name: '警告を確認する', text: '結論の前に、通貨の混在、重複、負の調整、ゼロの分母、親行を確認します。' },
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: '예산 CSV 또는 JSON 파일을 여기에 놓으세요',
8
+ uploadHelp: '필수 항목: 카테고리와 금액. 선택 항목: 인구, 기간, priorAmount, 통화, 상위 카테고리.',
9
+ loadExample: '예시 예산 불러오기',
10
+ supportedFormat: 'CSV 또는 JSON, 이 브라우저에서만 처리',
11
+ tableHeading: '원본 행과 카테고리 합계',
12
+ categoryLabel: '카테고리',
13
+ amountLabel: '금액',
14
+ populationLabel: '인구',
15
+ sourceRowsLabel: '원본 행',
16
+ analyzeEmpty: '예산을 확인하려면 파일을 선택하거나 예시를 불러오세요.',
17
+ resultHeading: '예산 풍경',
18
+ totalLabel: '총지출',
19
+ perCapitaLabel: '1인당 지출',
20
+ variationLabel: '이전 기간 대비 변화',
21
+ topCategoryLabel: '가장 큰 카테고리',
22
+ shareLabel: '전체 비중',
23
+ sourceLabel: '원본 행',
24
+ noData: '아직 유효한 예산 행이 없습니다.',
25
+ warningsHeading: '확인할 경고',
26
+ errorsHeading: '포함되지 않은 행',
27
+ methodHeading: '적용한 방법',
28
+ methodText: '필수 항목을 확인하고 각 원본 행을 보존하며 동일한 카테고리 경로를 묶어 정규화된 금액으로 합계를 계산합니다. 전체 합계가 양수일 때 카테고리 비중은 카테고리 금액을 전체 합계로 나눈 값입니다. 1인당 지출은 일관된 양의 인구 값을 분모로 사용합니다. 기간 변화는 현재 금액과 이전 금액의 차이를 이전 금액의 절댓값으로 나눈 값입니다.',
29
+ limitsHeading: '이 도구가 하지 않는 일',
30
+ limitsText: '예산이 완전하거나 비교 가능하거나 합법적이거나 효율적이거나 공정하거나 편향이 없거나 올바르게 분류되었다고 증명하지 않습니다. 원본을 감사하지 않고 정책의 질을 평가하지 않으며 통화를 환산하지 않고 각 행이 배정액, 의무액, 지급액 또는 전망치인지 판단하지 않습니다.',
31
+ edgeCasesHeading: '예외 상황과 데이터 경고',
32
+ edgeCasesText: '통화 혼합, 변하는 인구, 중복 카테고리, 음수 조정, 상위 행과 하위 행의 동시 사용, 지역별 숫자 형식, 이전 금액이 0인 경우에는 사람이 확인해야 합니다. 원래 행 번호를 보존하므로 모든 집계의 원본을 추적할 수 있습니다.',
33
+ downloadCsv: '검토한 표 다운로드',
34
+ printAction: '분석 인쇄',
35
+ rowsLabel: '유효한 행',
36
+ categoriesLabel: '카테고리',
37
+ positiveTotalLabel: '시각화한 양의 금액',
38
+ previousTotalLabel: '이전 합계',
39
+ invalidFile: '비어 있지 않은 CSV 또는 JSON 표로 파일을 읽을 수 없습니다.',
40
+ fileReadError: '이 브라우저에서 파일을 읽을 수 없습니다.',
41
+ exampleName: '지방자치단체 예산 예시',
42
+ noPreviousData: '비교할 수 있는 이전 기간 금액이 없습니다.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: '공공 예산 분석 도구',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: '공공 지출, 카테고리 비중, 1인당 금액, 기간별 변화를 로컬에서 확인합니다.',
51
+ url: 'https://gamebob.dev/ko/gonggong-yosan-jichul-bunseok',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: '어떤 열이 필요한가요?', acceptedAnswer: { '@type': 'Answer', text: '각 행에는 카테고리와 숫자 금액이 필요합니다. 인구, 기간, priorAmount, 통화, 상위 카테고리는 선택 사항입니다.' } },
59
+ { '@type': 'Question', name: '1인당 지출은 어떻게 계산하나요?', acceptedAnswer: { '@type': 'Answer', text: '총액을 처음 발견한 일관된 양의 인구 값으로 나눕니다. 분모가 다르면 경고가 표시됩니다.' } },
60
+ { '@type': 'Question', name: '중복 카테고리는 어떻게 되나요?', acceptedAnswer: { '@type': 'Answer', text: '같은 카테고리 경로를 가진 행을 더하고 원본 행 번호를 표시하여 실제 분할과 중복 계산을 구분할 수 있게 합니다.' } },
61
+ { '@type': 'Question', name: '예산이 좋거나 공정하다는 것을 증명하나요?', acceptedAnswer: { '@type': 'Answer', text: '아니요. 입력된 숫자를 설명할 뿐이며 완전성, 합법성, 효율성, 공정성, 분류 또는 결과를 판단하지 않습니다.' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: '공공 예산 표 분석하기',
68
+ step: [
69
+ { '@type': 'HowToStep', name: '표 준비하기', text: '행마다 카테고리와 금액이 있는 CSV 또는 JSON 표를 만드세요. 통화와 회계 기준을 동일하게 유지하세요.' },
70
+ { '@type': 'HowToStep', name: '맥락 추가하기', text: '인구, 기간, priorAmount, 통화, 상위 카테고리는 의미가 일관될 때만 추가하세요.' },
71
+ { '@type': 'HowToStep', name: '파일 불러오기', text: '파일을 도구에 놓거나 예시를 불러와 예상 구조와 로컬 검증 결과를 확인하세요.' },
72
+ { '@type': 'HowToStep', name: '풍경 읽기', text: '구성은 비례 막대로 보고 정확한 금액, 변화, 원본 행은 접근 가능한 표에서 확인하세요.' },
73
+ { '@type': 'HowToStep', name: '경고 검토하기', text: '결론을 내리기 전에 통화 혼합, 중복 경로, 음수 조정, 0인 분모, 상위 행을 확인하세요.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'public-budget-analyzer',
79
+ title: '공공 예산 분석 도구',
80
+ description: '공공 예산 표를 로컬에서 확인하여 총지출, 카테고리 비중, 1인당 지출, 변화, 각 집계의 원본 행을 살펴보세요.',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: '공공 예산 표를 검증 가능한 화면으로 바꾸기', level: 2 },
84
+ { type: 'paragraph', html: '공공 예산 파일은 카테고리 이름, 회계 기간, 인구 분모, 조정액을 한눈에 읽기 어려운 표에 함께 담는 경우가 많습니다. 이 도구는 원본 행을 보존하고 필수 항목을 확인한 뒤 같은 정규화 데이터에서 합계, 비중, 1인당 지출, 기간 변화를 계산합니다.' },
85
+ { type: 'paragraph', html: '결과는 숫자를 설명할 뿐 정책을 평가하지 않습니다. 큰 카테고리는 법적 책임, 일회성 투자, 이전 지출 또는 다른 회계 범위를 나타낼 수 있습니다. 화면은 이런 차이를 드러내므로 원본 자료를 더 정확한 질문으로 다시 확인할 수 있습니다.' },
86
+ { type: 'title', text: '계산 결과의 의미', level: 2 },
87
+ { type: 'paragraph', html: '합계는 음수 조정을 포함한 유효한 숫자 금액의 합입니다. 전체 합계가 양수일 때 카테고리 비중은 묶인 카테고리 금액을 합계로 나눈 값입니다. 양의 금액은 비례 막대로 표시하고 음의 금액은 표에 남깁니다. 양의 면적으로 바꾸면 의미가 달라지기 때문입니다.' },
88
+ { type: 'table', headers: ['결과', '계산', '확인할 질문'], rows: [['총지출', '정규화된 금액의 합', '모든 행이 같은 회계 기준을 사용하나요?'], ['카테고리 비중', '카테고리 금액을 양의 합계로 나눔', '카테고리가 서로 배타적인가요, 상위와 하위가 겹치나요?'], ['1인당 지출', '양의 인구 분모로 합계를 나눔', '인구가 같은 장소와 기간을 나타내나요?'], ['기간 변화', '현재 금액에서 이전 금액을 빼고 이전 절댓값으로 나눔', '기간을 비교할 수 있고 0인 기준을 피했나요?']] },
89
+ { type: 'title', text: '비교 가능한 데이터 준비하기', level: 2 },
90
+ { type: 'paragraph', html: '모든 행에 하나의 통화와 금액의 명확한 의미를 사용하세요. 예산 승인액, 의무액, 지급액, 전망치는 모두 유효한 숫자일 수 있지만 서로 다른 질문에 답합니다. 열 이름만으로 의미를 판단할 수 없으므로 원본 옆에 그 의미를 기록하세요.' },
91
+ { type: 'list', items: ['카테고리마다 한 행을 사용하거나 의도한 계층을 위해 상위 카테고리를 입력하세요.', '인구 값을 일관되게 유지하고 주민, 유권자, 가구, 서비스 이용자를 섞지 마세요.', '이전 기간이 같은 카테고리와 기준을 사용할 때만 priorAmount를 넣으세요.', '우발적인 중복 계산을 막기 위해 중복 경로와 상위 행을 확인하세요.', '검토한 표를 원본과 해석에 사용한 가정과 함께 보관하세요.'] },
92
+ { type: 'tip', title: '비중은 우선순위 점수가 아닙니다', html: '금액이 가장 큰 카테고리가 자동으로 가장 중요하거나 낭비가 많거나 성공적인 것은 아닙니다. 규모와 변화를 찾는 데 사용한 뒤 원본 주석과 서비스 결과를 읽으세요.' },
93
+ { type: 'title', text: '결론 전에 경고 읽기', level: 2 },
94
+ { type: 'paragraph', html: '중복 경로는 합계가 조용히 작아지지 않도록 묶지만 원본 행 목록에서 그 묶음이 의도된 것인지 확인할 수 있습니다. 통화는 변환하지 않습니다. 인구가 0이면 1인당 결과가 사라지고 이전 금액이 0이면 변화율이 사라집니다. 0으로 나누는 것은 의미 있는 해석이 없기 때문입니다.' },
95
+ { type: 'paragraph', html: '중첩된 카테고리는 특히 주의해야 합니다. 표에 교육과 교육 > 학교가 모두 금액으로 들어 있으면 같은 지출을 두 번 계산할 수 있습니다. 상위 행이 소계인지 독립 항목인지는 원본의 방법론을 확인해야 합니다.' },
96
+ { type: 'title', text: '첫 분석 후 할 일', level: 2 },
97
+ { type: 'paragraph', html: '행 번호를 사용해 공식 파일로 돌아가 각 수정이나 해석을 기록하세요. 같은 의미의 기간끼리 비교하고 음수 조정은 조정으로 보존하며 원본이 소계를 이미 포함한다고 확인할 때 소계를 제거한 뒤 다시 분석하세요.' },
98
+ { type: 'tip', title: '데이터의 경계를 보이게 유지하기', html: '이 도구는 로컬 설명 분석입니다. 파일의 완전성, 공식 분류, 통화 조정, 지출과 결과 사이의 인과 관계를 검증하지 않습니다.' },
99
+ ],
100
+ faq: [
101
+ { question: '어떤 열이 필요한가요?', answer: '각 행에는 카테고리와 숫자 금액이 필요합니다. 인구, 기간, priorAmount, 통화, 상위 카테고리는 선택 사항입니다.' },
102
+ { question: '1인당 지출은 어떻게 계산하나요?', answer: '합계를 처음 발견한 일관된 양의 인구로 나눕니다. 분모가 다르면 경고가 표시됩니다.' },
103
+ { question: '중복 카테고리는 어떻게 되나요?', answer: '같은 카테고리 경로를 합산하고 원본 행을 검토할 수 있게 표시합니다.' },
104
+ { question: '예산이 좋거나 공정하다는 것을 증명하나요?', answer: '아니요. 숫자를 설명할 뿐 완전성, 합법성, 효율성, 공정성 또는 결과를 판단할 수 없습니다.' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: '표 준비하기', text: '같은 통화와 회계 기준으로 카테고리와 금액이 있는 CSV 또는 JSON 표를 만드세요.' },
109
+ { name: '맥락 추가하기', text: '인구, 기간, priorAmount, 통화, 상위 카테고리는 의미가 일관될 때만 추가하세요.' },
110
+ { name: '파일 불러오기', text: '파일을 놓거나 예시를 불러와 예상 데이터 구조를 확인하세요.' },
111
+ { name: '풍경 읽기', text: '구성은 비례 막대로, 값과 변화와 원본 행은 표로 확인하세요.' },
112
+ { name: '경고 검토하기', text: '결론 전에 통화 혼합, 중복, 음수 조정, 0인 분모, 상위 행을 확인하세요.' },
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: 'Zet hier een CSV of JSON begrotingsbestand neer',
8
+ uploadHelp: 'Verplichte velden: categorie en bedrag. Optioneel: bevolking, periode, priorAmount, valuta en bovenliggende categorie.',
9
+ loadExample: 'Voorbeeldbegroting laden',
10
+ supportedFormat: 'CSV of JSON, alleen in deze browser verwerkt',
11
+ tableHeading: 'Bronregels en categorietotalen',
12
+ categoryLabel: 'Categorie',
13
+ amountLabel: 'Bedrag',
14
+ populationLabel: 'Bevolking',
15
+ sourceRowsLabel: 'Bronregels',
16
+ analyzeEmpty: 'Kies een bestand of laad het voorbeeld om een begroting te bekijken.',
17
+ resultHeading: 'Begrotingslandschap',
18
+ totalLabel: 'Totale uitgaven',
19
+ perCapitaLabel: 'Uitgaven per persoon',
20
+ variationLabel: 'Verandering ten opzichte van de vorige periode',
21
+ topCategoryLabel: 'Grootste categorie',
22
+ shareLabel: 'Aandeel van totaal',
23
+ sourceLabel: 'Bronregels',
24
+ noData: 'Er zijn nog geen geldige begrotingsregels beschikbaar.',
25
+ warningsHeading: 'Te controleren waarschuwingen',
26
+ errorsHeading: 'Niet opgenomen regels',
27
+ methodHeading: 'Toegepaste methode',
28
+ methodText: 'De tool controleert verplichte velden, bewaart elke bronregel, groepeert exacte categoriepaden en berekent totalen uit genormaliseerde bedragen. Het categoriedeel is het bedrag gedeeld door het totaal wanneer dat positief is. Uitgaven per persoon delen het totaal door de eerste consistente positieve bevolkingsnoemer. De periodeverandering is het verschil gedeeld door de absolute vorige waarde.',
29
+ limitsHeading: 'Wat deze tool niet doet',
30
+ limitsText: 'De tool bewijst niet dat een begroting volledig, vergelijkbaar, wettig, efficiënt, eerlijk, onbevooroordeeld of juist geclassificeerd is. De bron wordt niet gecontroleerd, beleid wordt niet beoordeeld, valuta worden niet omgerekend en de tool bepaalt niet of een regel een begrotingsmachtiging, verplichting, betaling of prognose is.',
31
+ edgeCasesHeading: 'Randgevallen en datameldingen',
32
+ edgeCasesText: 'Gemengde valuta, veranderende bevolkingen, dubbele categorieën, negatieve correcties, bovenliggende regels naast onderliggende regels, lokale getalnotatie en vorige bedragen van nul vragen menselijke controle. De browser bewaart het oorspronkelijke regelnummer zodat elk totaal naar de invoer kan worden teruggevolgd.',
33
+ downloadCsv: 'Gecontroleerde tabel downloaden',
34
+ printAction: 'Analyse afdrukken',
35
+ rowsLabel: 'geldige regels',
36
+ categoriesLabel: 'categorieën',
37
+ positiveTotalLabel: 'gevisualiseerde positieve bedragen',
38
+ previousTotalLabel: 'Vorig totaal',
39
+ invalidFile: 'Het bestand kon niet als een niet-lege CSV of JSON tabel worden gelezen.',
40
+ fileReadError: 'Het bestand kon in deze browser niet worden gelezen.',
41
+ exampleName: 'Voorbeeld van een gemeentebegroting',
42
+ noPreviousData: 'Er is geen vergelijkbaar bedrag uit de vorige periode opgegeven.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: 'Analysator voor openbare begrotingen',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: 'Bekijk openbare uitgaven, categorieaandelen, bedragen per persoon en veranderingen tussen perioden lokaal.',
51
+ url: 'https://gamebob.dev/nl/analyse-openbare-begroting-uitgaven',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: 'Welke kolommen heeft de analysator nodig?', acceptedAnswer: { '@type': 'Answer', text: 'Elke regel heeft een categorie en een numeriek bedrag nodig. Bevolking, periode, priorAmount, valuta en bovenliggende categorie zijn optioneel.' } },
59
+ { '@type': 'Question', name: 'Hoe worden uitgaven per persoon berekend?', acceptedAnswer: { '@type': 'Answer', text: 'Het totale bedrag wordt gedeeld door de eerste consistente positieve bevolkingswaarde. Verschillende noemers blijven zichtbaar en veroorzaken een waarschuwing.' } },
60
+ { '@type': 'Question', name: 'Wat gebeurt er met dubbele categorieën?', acceptedAnswer: { '@type': 'Answer', text: 'Regels met hetzelfde categoriepad worden opgeteld en hun bronregelnummers blijven zichtbaar om een echte verdeling van een dubbele telling te onderscheiden.' } },
61
+ { '@type': 'Question', name: 'Kan dit bewijzen dat een begroting goed of eerlijk is?', acceptedAnswer: { '@type': 'Answer', text: 'Nee. De tool beschrijft de aangeleverde cijfers en stelt volledigheid, wettigheid, efficiëntie, eerlijkheid, classificatie of resultaten niet vast.' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: 'Een openbare begrotingstabel analyseren',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'Tabel voorbereiden', text: 'Maak een CSV of JSON tabel met per regel een categorie en bedrag. Gebruik dezelfde valuta en boekhoudkundige basis.' },
70
+ { '@type': 'HowToStep', name: 'Context toevoegen', text: 'Voeg bevolking, periode, priorAmount, valuta of bovenliggende categorie alleen toe wanneer de betekenis consistent is.' },
71
+ { '@type': 'HowToStep', name: 'Bestand laden', text: 'Zet het bestand in de analysator of laad het voorbeeld om de verwachte structuur en lokale controle te zien.' },
72
+ { '@type': 'HowToStep', name: 'Het landschap lezen', text: 'Gebruik proportionele balken voor de samenstelling en de toegankelijke tabel voor exacte bedragen, veranderingen en bronregels.' },
73
+ { '@type': 'HowToStep', name: 'Waarschuwingen bekijken', text: 'Verduidelijk gemengde valuta, dubbele paden, negatieve correcties, nulnoemers en bovenliggende regels voordat je conclusies trekt.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'analyse-openbare-begroting-uitgaven',
79
+ title: 'Analysator voor openbare begrotingen',
80
+ description: 'Bekijk een openbare begrotingstabel lokaal voor totale uitgaven, categorieaandelen, uitgaven per persoon, veranderingen en de bronregels achter elk totaal.',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: 'Maak van een openbare begrotingstabel een controleerbaar overzicht', level: 2 },
84
+ { type: 'paragraph', html: 'Openbare begrotingsbestanden combineren vaak categorielabels, boekhoudperioden, bevolkingsnoemers en correcties in een tabel die moeilijk snel te lezen is. Deze analysator bewaart de bronregels, controleert de vereiste velden en zet dezelfde genormaliseerde gegevens om in totalen, verhoudingen, uitgaven per persoon en veranderingen per periode.' },
85
+ { type: 'paragraph', html: 'Het resultaat is beschrijvend en geen politiek oordeel. Een grote categorie kan wijzen op een wettelijke taak, een eenmalige investering, een overdracht of een andere boekhoudkundige afbakening. Het overzicht maakt zulke patronen zichtbaar zodat je de bron met een preciezere vraag kunt onderzoeken.' },
86
+ { type: 'title', text: 'Wat de berekeningen betekenen', level: 2 },
87
+ { type: 'paragraph', html: 'Het totaal is de som van alle geldige numerieke bedragen, inclusief negatieve correcties. Een categorieaandeel is het gegroepeerde bedrag gedeeld door het totaal wanneer dat positief is. Positieve bedragen krijgen proportionele balken; negatieve bedragen blijven in de tabel omdat een positieve oppervlakte hun betekenis zou veranderen.' },
88
+ { type: 'table', headers: ['Uitkomst', 'Berekening', 'Controle vraag'], rows: [['Totale uitgaven', 'Som van genormaliseerde bedragen', 'Gebruiken alle regels dezelfde boekhoudkundige basis?'], ['Categorieaandeel', 'Categoriebetrag gedeeld door positief totaal', 'Zijn categorieën exclusief of overlappen ouders en kinderen?'], ['Uitgaven per persoon', 'Totaal gedeeld door positieve bevolkingsnoemer', 'Beschrijft de bevolking dezelfde plaats en periode?'], ['Periodeverandering', 'Huidig bedrag min vorig bedrag gedeeld door absolute vorige waarde', 'Zijn perioden vergelijkbaar en wordt een basis van nul vermeden?']] },
89
+ { type: 'title', text: 'Vergelijkbare gegevens voorbereiden', level: 2 },
90
+ { type: 'paragraph', html: 'Gebruik één valuta en leg de betekenis van het bedrag voor elke regel vast. Een begrotingsmachtiging, verplichting, betaling en prognose kunnen allemaal geldige cijfers zijn maar verschillende vragen beantwoorden. Noteer die betekenis naast de bron, want de analysator leidt haar niet af uit een kolomnaam.' },
91
+ { type: 'list', items: ['Gebruik één regel per categorie of geef een bovenliggende categorie voor een bewuste hiërarchie.', 'Houd bevolkingswaarden consistent en meng geen inwoners, kiesgerechtigden, huishoudens of gebruikers.', 'Gebruik priorAmount alleen als de vorige periode dezelfde categorieën en grondslag heeft.', 'Controleer dubbele categoriepaden en bovenliggende regels op onbedoelde dubbeltelling.', 'Bewaar de gecontroleerde tabel samen met de bron en de gebruikte aannames.'] },
92
+ { type: 'tip', title: 'Een verhouding is geen prioriteitsscore', html: 'De categorie met het grootste bedrag is niet automatisch het belangrijkst, verspillendst of succesvolst. Gebruik het overzicht voor schaal en verandering en lees daarna de bronnotities en dienstresultaten.' },
93
+ { type: 'title', text: 'Lees waarschuwingen vóór je conclusies trekt', level: 2 },
94
+ { type: 'paragraph', html: 'Dubbele paden worden gegroepeerd zodat het totaal niet stilzwijgend te laag wordt, maar de lijst met bronregels laat zien of die groepering bewust was. Gemengde valuta worden nooit omgerekend. Een bevolking van nul verwijdert het resultaat per persoon en een vorige waarde van nul verwijdert het veranderingspercentage omdat delen door nul geen betekenisvolle interpretatie heeft.' },
95
+ { type: 'paragraph', html: 'Geneste categorieën vragen extra aandacht. Als een tabel zowel Onderwijs als Onderwijs > Scholen als bedrag bevat, kan optellen dezelfde uitgaven tweemaal tellen. De tool waarschuwt voor geneste paden, maar alleen de methode van de bron kan aangeven of de ouderregel een subtotaal of een zelfstandige post is.' },
96
+ { type: 'title', text: 'Wat te doen na de eerste analyse', level: 2 },
97
+ { type: 'paragraph', html: 'Gebruik de regelnummers om terug te gaan naar het officiële bestand en elke correctie of interpretatie te documenteren. Vergelijk gelijke perioden, behoud negatieve correcties als correcties en voer de analyse opnieuw uit nadat je subtotalen verwijdert wanneer de bron bevestigt dat ze al zijn opgenomen.' },
98
+ { type: 'tip', title: 'Houd de gegevensgrens zichtbaar', html: 'Dit is een lokale beschrijvende analyse. Ze controleert niet of het bestand volledig is, classificeert uitgaven niet volgens een officiële standaard, verzoent valuta niet en bewijst geen oorzakelijk verband tussen uitgaven en resultaten.' },
99
+ ],
100
+ faq: [
101
+ { question: 'Welke kolommen heeft de analysator nodig?', answer: 'Elke regel heeft een categorie en numeriek bedrag nodig. Bevolking, periode, priorAmount, valuta en bovenliggende categorie zijn optioneel.' },
102
+ { question: 'Hoe worden uitgaven per persoon berekend?', answer: 'Het totaal wordt gedeeld door de eerste consistente positieve bevolkingswaarde. Verschillende noemers geven een waarschuwing.' },
103
+ { question: 'Wat gebeurt er met dubbele categorieën?', answer: 'Dezelfde categoriepaden worden opgeteld en hun bronregels blijven zichtbaar voor controle.' },
104
+ { question: 'Kan dit bewijzen dat een begroting goed of eerlijk is?', answer: 'Nee. Het beschrijft de aangeleverde cijfers en kan volledigheid, wettigheid, efficiëntie, eerlijkheid of resultaten niet vaststellen.' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'Tabel voorbereiden', text: 'Maak een CSV of JSON tabel met categorie en bedrag per regel, met dezelfde valuta en boekhoudkundige basis.' },
109
+ { name: 'Context toevoegen', text: 'Voeg bevolking, periode, priorAmount, valuta of bovenliggende categorie alleen toe als de betekenis consistent is.' },
110
+ { name: 'Bestand laden', text: 'Zet het bestand neer of laad het voorbeeld om de verwachte structuur te zien.' },
111
+ { name: 'Het landschap lezen', text: 'Gebruik proportionele balken voor samenstelling en de tabel voor waarden, veranderingen en bronregels.' },
112
+ { name: 'Waarschuwingen bekijken', text: 'Verduidelijk gemengde valuta, duplicaten, negatieve correcties, nulnoemers en ouderregels vóór je conclusies trekt.' },
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: 'Upuść tutaj plik CSV lub JSON z budżetem',
8
+ uploadHelp: 'Pola wymagane: kategoria i kwota. Opcjonalne: ludność, okres, priorAmount, waluta i kategoria nadrzędna.',
9
+ loadExample: 'Wczytaj przykładowy budżet',
10
+ supportedFormat: 'CSV lub JSON, przetwarzany tylko w tej przeglądarce',
11
+ tableHeading: 'Wiersze źródłowe i sumy kategorii',
12
+ categoryLabel: 'Kategoria',
13
+ amountLabel: 'Kwota',
14
+ populationLabel: 'Ludność',
15
+ sourceRowsLabel: 'Wiersze źródłowe',
16
+ analyzeEmpty: 'Wybierz plik lub wczytaj przykład, aby przeanalizować budżet.',
17
+ resultHeading: 'Krajobraz budżetu',
18
+ totalLabel: 'Wydatki ogółem',
19
+ perCapitaLabel: 'Wydatki na osobę',
20
+ variationLabel: 'Zmiana względem poprzedniego okresu',
21
+ topCategoryLabel: 'Największa kategoria',
22
+ shareLabel: 'Udział w sumie',
23
+ sourceLabel: 'Wiersze źródłowe',
24
+ noData: 'Nie ma jeszcze prawidłowych wierszy budżetu.',
25
+ warningsHeading: 'Ostrzeżenia do sprawdzenia',
26
+ errorsHeading: 'Wiersze nieuwzględnione',
27
+ methodHeading: 'Zastosowana metoda',
28
+ methodText: 'Narzędzie sprawdza wymagane pola, zachowuje każdy wiersz źródłowy, grupuje identyczne ścieżki kategorii i oblicza sumy ze znormalizowanych kwot. Udział kategorii to jej kwota podzielona przez sumę, gdy suma jest dodatnia. Wydatki na osobę dzielą sumę przez pierwszą zgodną dodatnią wartość ludności. Zmiana okresu to różnica podzielona przez wartość bezwzględną poprzedniej kwoty.',
29
+ limitsHeading: 'Czego to narzędzie nie robi',
30
+ limitsText: 'Nie dowodzi, że budżet jest kompletny, porównywalny, legalny, wydajny, sprawiedliwy, bezstronny ani poprawnie sklasyfikowany. Nie audytuje źródła, nie ocenia polityki, nie przelicza walut i nie rozpoznaje, czy wiersz oznacza przyznane środki, zobowiązanie, płatność lub prognozę.',
31
+ edgeCasesHeading: 'Przypadki brzegowe i ostrzeżenia danych',
32
+ edgeCasesText: 'Mieszane waluty, zmienna ludność, zduplikowane kategorie, ujemne korekty, wiersze nadrzędne obok podrzędnych, lokalne formaty liczb i poprzednie kwoty równe zero wymagają kontroli człowieka. Przeglądarka zachowuje oryginalny numer wiersza, aby każdy agregat można było prześledzić do danych wejściowych.',
33
+ downloadCsv: 'Pobierz sprawdzoną tabelę',
34
+ printAction: 'Drukuj analizę',
35
+ rowsLabel: 'prawidłowych wierszy',
36
+ categoriesLabel: 'kategorii',
37
+ positiveTotalLabel: 'zwizualizowane kwoty dodatnie',
38
+ previousTotalLabel: 'Poprzednia suma',
39
+ invalidFile: 'Nie udało się odczytać pliku jako niepustej tabeli CSV lub JSON.',
40
+ fileReadError: 'Nie udało się odczytać pliku w tej przeglądarce.',
41
+ exampleName: 'Przykładowy budżet gminy',
42
+ noPreviousData: 'Nie podano porównywalnej kwoty z poprzedniego okresu.',
43
+ };
44
+
45
+ const softwareApplication: SoftwareApplication = {
46
+ '@type': 'SoftwareApplication',
47
+ name: 'Analizator budżetu publicznego',
48
+ applicationCategory: 'EducationalApplication',
49
+ operatingSystem: 'Any',
50
+ description: 'Lokalnie analizuj wydatki publiczne, udziały kategorii, kwoty na osobę i zmiany między okresami.',
51
+ url: 'https://gamebob.dev/pl/analizator-budzetu-publicznego-wydatki',
52
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
53
+ };
54
+
55
+ const faqPage: FAQPage = {
56
+ '@type': 'FAQPage',
57
+ mainEntity: [
58
+ { '@type': 'Question', name: 'Jakich kolumn potrzebuje analizator?', acceptedAnswer: { '@type': 'Answer', text: 'Każdy wiersz potrzebuje kategorii i liczbowej kwoty. Ludność, okres, priorAmount, waluta i kategoria nadrzędna są opcjonalne.' } },
59
+ { '@type': 'Question', name: 'Jak obliczane są wydatki na osobę?', acceptedAnswer: { '@type': 'Answer', text: 'Suma jest dzielona przez pierwszą zgodną dodatnią wartość ludności. Różne mianowniki pozostają widoczne i powodują ostrzeżenie.' } },
60
+ { '@type': 'Question', name: 'Co dzieje się ze zduplikowanymi kategoriami?', acceptedAnswer: { '@type': 'Answer', text: 'Wiersze z tą samą ścieżką kategorii są dodawane, a numery wierszy źródłowych pozostają widoczne, aby rozróżnić podział od podwójnego liczenia.' } },
61
+ { '@type': 'Question', name: 'Czy narzędzie dowodzi, że budżet jest dobry lub sprawiedliwy?', acceptedAnswer: { '@type': 'Answer', text: 'Nie. Opisuje podane liczby i nie ustala kompletności, legalności, wydajności, sprawiedliwości, klasyfikacji ani wyników.' } },
62
+ ],
63
+ };
64
+
65
+ const howTo: HowTo = {
66
+ '@type': 'HowTo',
67
+ name: 'Analizowanie tabeli budżetu publicznego',
68
+ step: [
69
+ { '@type': 'HowToStep', name: 'Przygotuj tabelę', text: 'Utwórz tabelę CSV lub JSON z jedną kategorią i kwotą w każdym wierszu. Zachowaj tę samą walutę i podstawę księgową.' },
70
+ { '@type': 'HowToStep', name: 'Dodaj kontekst', text: 'Dodaj ludność, okres, priorAmount, walutę lub kategorię nadrzędną tylko wtedy, gdy ich znaczenie jest spójne.' },
71
+ { '@type': 'HowToStep', name: 'Wczytaj plik', text: 'Upuść plik w analizatorze lub wczytaj przykład, aby zobaczyć oczekiwany układ i lokalny wynik kontroli.' },
72
+ { '@type': 'HowToStep', name: 'Odczytaj krajobraz', text: 'Użyj proporcjonalnych pasków do składu budżetu, a dostępnej tabeli do dokładnych kwot, zmian i wierszy źródłowych.' },
73
+ { '@type': 'HowToStep', name: 'Sprawdź ostrzeżenia', text: 'Wyjaśnij mieszane waluty, zduplikowane ścieżki, ujemne korekty, zerowe mianowniki i wiersze nadrzędne przed wyciągnięciem wniosków.' },
74
+ ],
75
+ };
76
+
77
+ export const content: PublicBudgetLocaleContent = {
78
+ slug: 'analizator-budzetu-publicznego-wydatki',
79
+ title: 'Analizator budżetu publicznego',
80
+ description: 'Analizuj lokalnie tabelę budżetu publicznego, aby zobaczyć wydatki ogółem, udziały kategorii, wydatki na osobę, zmiany i wiersze źródłowe za każdym agregatem.',
81
+ ui,
82
+ seo: [
83
+ { type: 'title', text: 'Zamień tabelę budżetu publicznego w sprawdzalny widok', level: 2 },
84
+ { type: 'paragraph', html: 'Pliki budżetów publicznych często łączą etykiety kategorii, okresy księgowe, mianowniki ludności i korekty w tabeli trudnej do szybkiego odczytania. Ten analizator zachowuje wiersze źródłowe, sprawdza wymagane pola i tworzy z tych samych znormalizowanych danych sumy, proporcje, wydatki na osobę oraz zmiany między okresami.' },
85
+ { type: 'paragraph', html: 'Wynik jest opisowy, a nie polityczny. Duża kategoria może odzwierciedlać ustawowe zadanie, jednorazową inwestycję, transfer albo inną granicę księgową. Widok uwidacznia te wzorce, aby osoba sprawdzająca mogła wrócić do źródła z lepiej postawionym pytaniem.' },
86
+ { type: 'title', text: 'Znaczenie obliczeń', level: 2 },
87
+ { type: 'paragraph', html: 'Suma obejmuje wszystkie prawidłowe kwoty liczbowe, w tym ujemne korekty. Udział kategorii to jej zgrupowana kwota podzielona przez sumę, gdy suma jest dodatnia. Dodatnie kwoty otrzymują proporcjonalne paski, a ujemne pozostają w tabeli i są oznaczane, ponieważ dodatnia powierzchnia zmieniłaby ich znaczenie.' },
88
+ { type: 'table', headers: ['Wynik', 'Obliczenie', 'Pytanie kontrolne'], rows: [['Wydatki ogółem', 'Suma znormalizowanych kwot', 'Czy wszystkie wiersze mają tę samą podstawę księgową?'], ['Udział kategorii', 'Kwota kategorii podzielona przez sumę dodatnią', 'Czy kategorie są rozłączne, czy rodzice nakładają się na dzieci?'], ['Wydatki na osobę', 'Suma podzielona przez dodatni mianownik ludności', 'Czy ludność opisuje to samo miejsce i okres?'], ['Zmiana okresu', 'Bieżąca kwota minus poprzednia podzielone przez bezwzględną poprzednią', 'Czy okresy są porównywalne i unikamy podstawy równej zero?']] },
89
+ { type: 'title', text: 'Przygotuj porównywalne dane', level: 2 },
90
+ { type: 'paragraph', html: 'Użyj jednej waluty i jasno określ znaczenie kwoty w każdym wierszu. Przyznane środki, zobowiązanie, płatność i prognoza mogą być prawidłowymi liczbami, ale odpowiadają na różne pytania. Zapisz to znaczenie obok źródła, ponieważ analizator nie odgaduje go z nazwy kolumny.' },
91
+ { type: 'list', items: ['Użyj jednego wiersza na kategorię albo podaj kategorię nadrzędną dla zamierzonej hierarchii.', 'Zachowaj spójne wartości ludności i nie mieszaj mieszkańców, wyborców, gospodarstw ani użytkowników usług.', 'Dodaj priorAmount tylko wtedy, gdy poprzedni okres ma te same kategorie i podstawę.', 'Sprawdź zduplikowane ścieżki i wiersze nadrzędne pod kątem przypadkowego podwójnego liczenia.', 'Zachowaj sprawdzoną tabelę razem ze źródłem i przyjętymi założeniami.'] },
92
+ { type: 'tip', title: 'Udział nie jest oceną priorytetu', html: 'Kategoria z największą kwotą nie jest automatycznie najważniejsza, najbardziej rozrzutna ani najskuteczniejsza. Użyj widoku, aby znaleźć skalę i zmiany, a następnie przeczytaj noty źródłowe i wyniki usługi.' },
93
+ { type: 'title', text: 'Czytaj ostrzeżenia przed wnioskami', level: 2 },
94
+ { type: 'paragraph', html: 'Zduplikowane ścieżki są grupowane, aby agregat nie został po cichu zaniżony, ale lista wierszy źródłowych pozwala sprawdzić, czy grupowanie było zamierzone. Mieszane waluty nigdy nie są przeliczane. Ludność równa zero usuwa wynik na osobę, a poprzednia kwota równa zero usuwa zmianę procentową, ponieważ dzielenie przez zero nie ma sensownej interpretacji.' },
95
+ { type: 'paragraph', html: 'Kategorie zagnieżdżone wymagają szczególnej uwagi. Jeśli tabela zawiera jednocześnie Edukację i Edukację > Szkoły jako kwoty, ich dodanie może policzyć te same wydatki dwa razy. Narzędzie ostrzega o zagnieżdżonych ścieżkach, ale tylko metodyka źródła może wskazać, czy wiersz nadrzędny jest sumą częściową, czy niezależną pozycją.' },
96
+ { type: 'title', text: 'Co zrobić po pierwszym przejściu', level: 2 },
97
+ { type: 'paragraph', html: 'Użyj numerów wierszy, aby wrócić do oficjalnego pliku i udokumentować każdą korektę lub interpretację. Porównuj podobne okresy, zachowuj ujemne korekty jako korekty i uruchom analizę ponownie po usunięciu sum częściowych, gdy źródło potwierdza, że są już zawarte.' },
98
+ { type: 'tip', title: 'Zachowaj widoczną granicę danych', html: 'To lokalna analiza opisowa. Nie sprawdza kompletności pliku, nie klasyfikuje wydatków według oficjalnego standardu, nie uzgadnia walut i nie dowodzi związku przyczynowego między wydatkami a wynikami.' },
99
+ ],
100
+ faq: [
101
+ { question: 'Jakich kolumn potrzebuje analizator?', answer: 'Każdy wiersz potrzebuje kategorii i kwoty liczbowej. Ludność, okres, priorAmount, waluta i kategoria nadrzędna są opcjonalne.' },
102
+ { question: 'Jak obliczane są wydatki na osobę?', answer: 'Suma jest dzielona przez pierwszą zgodną dodatnią wartość ludności. Różne mianowniki wywołują ostrzeżenie.' },
103
+ { question: 'Co dzieje się ze zduplikowanymi kategoriami?', answer: 'Te same ścieżki kategorii są sumowane, a ich wiersze źródłowe pozostają widoczne do kontroli.' },
104
+ { question: 'Czy narzędzie dowodzi, że budżet jest dobry lub sprawiedliwy?', answer: 'Nie. Opisuje podane liczby i nie może ustalić kompletności, legalności, wydajności, sprawiedliwości ani wyników.' },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ { name: 'Przygotuj tabelę', text: 'Utwórz tabelę CSV lub JSON z kategorią i kwotą w każdym wierszu, przy tej samej walucie i podstawie księgowej.' },
109
+ { name: 'Dodaj kontekst', text: 'Dodaj ludność, okres, priorAmount, walutę lub kategorię nadrzędną tylko przy spójnym znaczeniu.' },
110
+ { name: 'Wczytaj plik', text: 'Upuść plik lub wczytaj przykład, aby zobaczyć oczekiwany układ.' },
111
+ { name: 'Odczytaj krajobraz', text: 'Użyj proporcjonalnych pasków do składu i tabeli do wartości, zmian oraz wierszy źródłowych.' },
112
+ { name: 'Sprawdź ostrzeżenia', text: 'Wyjaśnij mieszane waluty, duplikaty, ujemne korekty, zerowe mianowniki i wiersze nadrzędne przed wnioskami.' },
113
+ ],
114
+ schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
115
+ };