Files
bundeshaushalt/README.md
2025-10-21 11:03:40 +02:00

167 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OpenBudget.DE Monorepo (App Scaffold + Data Extractor)
This repository contains:
- A modern React + Vite TypeScript singlepage application scaffold located in `openbudget-app-scaffold/`.
- A Python utility script to extract and transform official German federal budget (Bundeshaushalt) XML data into JSON, located at the repository root.
The goal is to make the federal budget searchable, explorable, and comparable using open data and reproducible tooling.
## Stack detection
- Language(s):
- TypeScript/JavaScript (frontend)
- Python 3 (data extraction helper)
- Frameworks & tooling (frontend):
- React 18, React Router 6
- Vite 7 (dev server/build/preview)
- Tailwind CSS 3 (via PostCSS + Autoprefixer)
- Zustand, TanStack Table, Recharts, Framer Motion, i18next, zod
- Vitest (configured via `test` script)
- Package manager: npm (packageManager set to `npm@11.6.1`)
- Entry points (frontend):
- HTML: `openbudget-app-scaffold/index.html` (mounts `#root`)
- App bootstrap: `openbudget-app-scaffold/src/main.tsx`
- Router: `openbudget-app-scaffold/src/app/routes.tsx`
- Layout shell: `openbudget-app-scaffold/src/design-system/layout/AppShell.tsx`
- Dev server: Vite, default port set to 5173 in `vite.config.ts`.
## Requirements
- Node.js 18+ (recommended) and npm (repo expects npm v11 as per `packageManager`)
- Python 3.9+ (for running the `extract_hh2026.py` helper)
- Optional: `lxml` Python package for XML parsing (required by the script)
## Setup and run (frontend app)
From the `openbudget-app-scaffold/` directory:
1) Install dependencies
- `npm i`
2) Start the dev server
- `npm run dev`
- App runs at http://localhost:5173
3) Build for production
- `npm run build`
4) Preview the production build locally
- `npm run preview`
Quick start (as seen in the app scaffold README):
- `npm i`
- `npm run dev`
- Upload `HH2026_titel_eur.json` in the Explorer (once you generated it; see Data section below).
## NPM scripts (frontend)
Defined in `openbudget-app-scaffold/package.json`:
- `dev` — Start Vite dev server
- `build` — Build the app with Vite
- `preview` — Preview the built app
- `test` — Run tests with Vitest
## Environment variables
- No usage of `import.meta.env` or `.env` files was detected in the codebase.
- TODO: If the app will require configuration (e.g., data endpoints), introduce Vite env variables (e.g., `VITE_API_URL`) and document them here.
## Testing
- Test runner: Vitest (configured via `npm test`).
- No test files were found in the repository at the time of writing.
- TODO: Add unit/integration tests under `openbudget-app-scaffold/src/**/__tests__` or `*.test.ts(x)` and update this section with guidance.
## Data: Bundeshaushalt extraction helper
The repository includes a Python script for converting the federal budget XML (e.g., Regierungsentwurf 2026) into JSON suitable for exploration in the app.
Script: `extract_hh2026.py`
Capabilities:
- Parses hierarchy: Einzelplan → Kapitel → Titel
- Converts values to EUR (XML uses thousands of EUR)
- Optional category tagging via keyword rules
- Outputs JSON files such as:
- `HH2026_titel_eur.json` (full titles)
- `EP01_24_Summen_Mrd.json` (EP 0124 totals)
- `EP{EP}_TopN_Titel.json` (per-EP top N list)
Usage (from repo root):
```
python extract_hh2026.py --xml regierungsentwurf_2026.xml --outdir ./out --topN 50 --tag
```
Arguments (see `--help` for the full list):
- `--xml` Path to the input XML
- `--outdir` Output directory (e.g., `./out`)
- `--topN` Optional top-N per Einzelplan
- `--tag` Enable category tagging based on keywords
Generated files can be uploaded/ingested by the app (e.g., upload `HH2026_titel_eur.json` in the Explorer view).
Python dependencies:
- Requires `lxml`. Install via:
```
pip install lxml
```
## Project structure (high level)
```
/ (repo root)
├─ README.md # This file
├─ extract_hh2026.py # Python helper to convert XML → JSON
├─ HH2026_titel_eur.json # Example/expected data file (output of the script)
├─ out/ # Example output directory (generated JSON)
└─ openbudget-app-scaffold/ # Frontend web app
├─ README.md # App-specific quick start (kept)
├─ index.html # Vite HTML entry (mounts #root)
├─ vite.config.ts # Vite config (alias @ → src, port 5173)
├─ package.json # npm scripts/dev deps
├─ postcss.config.js # Tailwind + Autoprefixer
├─ tailwind.config.ts # Tailwind config (incl. Deutschland colors)
└─ src/
├─ main.tsx # App bootstrap
├─ styles.css # Tailwind directives + utilities
├─ app/
│ ├─ routes.tsx # React Router routes
│ ├─ providers.tsx # App providers
│ └─ ErrorBoundary.tsx
├─ design-system/
│ └─ layout/AppShell.tsx # Navigation shell + footer
└─ features/
├─ landing/pages/LandingPage.tsx # Landing (route index)
├─ explorer/pages/ExplorerPage.tsx # Data explorer (expects JSON)
├─ reform/pages/ReformDesignerPage.tsx
├─ convert/pages/ConvertPage.tsx
├─ compare/pages/ComparePage.tsx
└─ about/pages/AboutPage.tsx # About (mentions MIT / amtliche Werke)
```
Note: Some feature files are referenced by the router. If any are missing in your local clone, create placeholders or pull the latest changes.
## Development notes
- Aliases: `@` resolves to `openbudget-app-scaffold/src` (see `vite.config.ts`). You can import like `import X from '@/path/to/X'`.
- Styling: Tailwind CSS is enabled. Utility classes are used extensively; see `tailwind.config.ts` and `src/styles.css`.
- Routing: See `src/app/routes.tsx` for routes including `/convert`, `/explorer`, `/reform`, `/compare`, `/about`, and a 404 fallback. The layout is provided by `AppShell`.
## License
- Code: The About page mentions MIT for code.
- TODO: Add an explicit LICENSE file (MIT) at the repository root and in the app package if desired.
- Data: “Amtliche Werke” (official works). Confirm exact data licensing/usage conditions for redistributed datasets and document here.
## Contributing
- TODO: Add contribution guidelines, code style, and branching strategy.
## FAQ / Troubleshooting
- Dev server port: If 5173 is occupied, either stop the other process or change `server.port` in `vite.config.ts`.
- Node version: If you encounter install issues, ensure Node 18+ and npm 11.x are used.
- Missing JSON: Generate data with `extract_hh2026.py` and upload it via the Explorer page in the app.
## Changelog
- TODO: Add basic release notes once versions are tagged.