# FamilyDashboard

Lokale iPad-PWA für Emilia und Valerie gemäss `docs/Bauplan_FamilyDashboard.txt`.

## Stack

- Backend: FastAPI + SQLModel + SQLite
- Frontend: React + Vite + TypeScript + Tailwind CSS
- Betrieb: Docker Compose, später optional Tailscale Serve / Caddy

## Lokal starten

Docker installieren: siehe `docs/docker-install-linux-mint.md`.

```bash
docker compose up --build
```

- Frontend: http://localhost:5173
  - Bei Portkonflikt: `FRONTEND_PORT=5174 docker compose up --build`
- Backend Health: http://localhost:8000/api/health
- Kinder Seed: http://localhost:8000/api/children

## Stoppen

```bash
docker compose down
```

## Logs

```bash
docker compose logs -f backend
docker compose logs -f frontend
```

## Lokale Backend-Tests ohne Docker

```bash
cd backend
uv venv
uv pip install -e '.[dev]'
uv run pytest
```

## Playwright Smoke Tests

Docker Compose muss laufen, z.B. auf Port 5174:

```bash
FRONTEND_PORT=5174 docker compose up --build -d
cd frontend
FAMILYDASHBOARD_E2E_BASE_URL=http://localhost:5174 npm run test:e2e
```

## Backup / Restore

Lokales Backup erstellen:

```bash
scripts/backup.sh
```

Restore:

```bash
scripts/restore.sh backups/familydashboard_YYYYMMDD_HHMMSS.db
```

Details: `docs/backup-restore.md`.

## iPad PWA Setup

Safari auf dem iPad öffnen und die laufende App aufrufen, z.B.:

```text
http://<server-ip>:5174
```

Dann:

1. Teilen-Button antippen.
2. **Zum Home-Bildschirm** wählen.
3. `FamilyDashboard` bestätigen.
4. Im Querformat starten.

Details inkl. Tailscale Serve: `docs/ipad-pwa-tailscale-setup.md`.

## Phasenstatus

- Phase 0 / Auftrag 1: Projekt-Skeleton, Docker Compose, Backend Health, Frontend-Startseite.
- Phase 1 / Auftrag 1-2 Basis: modulare Backend-Struktur, SQLite-Verbindung, `/api/children` mit Seed-Daten.
- Phase 2 / Auftrag 2: Kern-Datenmodell, idempotente Seeds, gehashte initiale Admin-PIN, Basis-Constraints und Tests.
- Auftrag 3 Grundlage: `/api/dashboard?date=YYYY-MM-DD` mit Lazy-Task-Instanzen, Timeline, Tasks und CoinSummary.
- Auftrag 4: iPad-Pro-2020-optimierte Home/Todo-Ansicht mit Tagesumschaltung und Komponentenstruktur.
- Auftrag 5: Task Complete/Undo, idempotenter CoinLedger, Ledger-API und Frontend-Actions.
- Auftrag 6: Lazy-Tagesabschluss für vergangene Tage, Pflicht-Penalties und Penalty-Reversal bei nachträglichem Erledigen.
- Auftrag 7: Kalender, Prüfungen und Lernplan-Generator.
- Auftrag 8: Benefits, Reservierungen und Ledger-Capture/Release.
- Auftrag 9: PIN-geschützte Admin Auth und Admin Layout.
- Auftrag 10: Admin CRUD MVP für Kinder, TaskTemplates, Benefits, Coins, Prüfungen, Stundenplan, Spezialtage und Settings.
- Auftrag 11: PWA/iPad-Optimierung mit Manifest, Apple Touch Icon, Service Worker, Offline-Hinweis und Tailscale-Serve-Doku.
- Auftrag 12: Tests, Backup und Stabilisierung mit Playwright Smoke, Backup-/Restore-Skripten, Restore-Doku, Logging und Docker-Persistenzcheck.

## Wichtige Betriebsnotizen

- Produktivdaten liegen sichtbar im Projekt unter `./data/familydashboard.db` und werden nach `/data/familydashboard.db` gemountet.
- Keine echten Secrets ins Repository committen.
- PWA MVP bietet eine Offline-App-Shell, aber keinen vollständigen Offline-Sync.


## Stundenplan

Die App enthält einen integrierten Stundenplan:

- Kinderansicht: Menüpunkt **Stundenplan** / Pfad `/schedule`.
- Read-only Wochenraster Montag bis Freitag mit Emilia/Valerie-Unterspalten.
- Zeitachse links, Mittagspause als neutraler Trenner, Schulblöcke und externe Aktivitäten farblich unterscheidbar.
- Admin: PIN-geschütztes **Stundenplan bearbeiten** im Adminportal.
- Admin kann Blöcke hinzufügen, bearbeiten und löschen; Zeiten laufen über grosse Select-Felder statt winziger Inputs.

Backend-APIs:

- `GET /api/schedule/current` — aktueller Wochenstundenplan.
- `GET /api/schedule/summary?date=YYYY-MM-DD` — Tageslogik pro Kind.
- `GET /api/admin/schedule` — Admin-Daten für Editor.
- `GET/POST/PATCH /api/admin/schedule/time-slots` — Zeitraster.
- `POST/PATCH/DELETE /api/admin/schedule/blocks` — Stundenplanblöcke.

Tageslogik:

- Schulbeginn = erster aktiver Block mit `counts_as_school=true`.
- Schulende = letzter aktiver Block mit `counts_as_school=true`.
- Loslaufen = Schulbeginn minus 15 Minuten.
- `Turnen`/`sports` aktiviert den Turnzeug-Hinweis.
- Externe Aktivitäten wie Gitarre, Klavier oder Mädchenriege werden angezeigt, zählen aber nicht automatisch als Schulunterricht.

Siehe auch `docs/seed-notes.md`.


## Datenpersistenz und Backups

Die produktive SQLite-Datenbank liegt bewusst sichtbar im Projekt unter `./data/familydashboard.db` und wird im Backend-Container nach `/data/familydashboard.db` gebind-mountet. Dadurch bleiben Stundenplan- und Admin-Daten bei `docker compose down` und Rebuilds erhalten und können direkt gesichert werden.

Wichtig: **niemals `docker compose down -v` verwenden**, ausser es sollen bewusst alle Daten gelöscht werden. Für normale Deploys/Rebuilds verwenden:

```bash
docker compose up -d --build
```

Vor Rebuilds oder Migrationen ein DB-Backup erstellen:

```bash
scripts/backup-db.sh
```

Diagnose bei Persistenz-Verdacht:

```bash
scripts/db-doctor.sh
```

Backups liegen unter `./data/backups/` und werden nicht in Git committed. Restore nur bewusst nach vorherigem Backup, z. B. durch Kopieren einer geprüften Backup-Datei nach `data/familydashboard.db`. Details: `docs/OPERATIONS_PERSISTENCE.md`.
