M1: Grundgerüst, Datenmodell und Admin

Django-5.2-Projekt mit uv, django-environ und Docker-Compose-Setup
(web + Postgres, WeasyPrint-Systembibliotheken im Image). Vollständiges
Datenmodell (Firma, Therapeut, Auftraggeber, Teilnehmer, Leistungsart,
Leistung, InvoiceLog, InvoiceCounter) mit Admin, Login-Flow und
Platzhalter-Dashboard. Fortschritt in FORTSCHRITT.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yy3uodsai6Ytt3GJ7tBdz
This commit is contained in:
Claude
2026-07-10 23:53:56 +00:00
parent 7b60be2933
commit cfa2266dd9
31 changed files with 2044 additions and 0 deletions

61
FORTSCHRITT.md Normal file
View File

@@ -0,0 +1,61 @@
# Umsetzungsfortschritt (Meilensteine)
> Ausführungsplan für das MVP aus [`SPEZIFIKATION.md`](./SPEZIFIKATION.md) /
> [`UMSETZUNGSPLAN.md`](./UMSETZUNGSPLAN.md). Diese Datei hält den Fortschritt fest,
> damit die Arbeit später fortgesetzt werden kann.
**Auslieferung:** in Meilenstein-Checkpoints (nach jedem Meilenstein Review).
**Kanonische Laufzeit:** Docker Compose (`web` + Postgres). WeasyPrint-Systembibliotheken
kommen aus dem Docker-Image, nicht vom Host.
## Status
| MS | Inhalt | Status |
|----|--------|--------|
| **M1** | Grundgerüst + Datenmodell + Admin | ✅ **fertig** |
| **M2** | Auth + Leistungserfassung (Monatsblatt-Grid) | ⬜ offen |
| **M3** | On-the-fly Rechnungslegung + ZUGFeRD | ⬜ offen |
| **M4** | Storno / Korrektur-Workflow | ⬜ offen |
| **M5** | Dashboard (Controlling) + Test-Suite | ⬜ offen |
## M1 — erledigt
- `uv`-Projekt (`pyproject.toml`, `uv.lock`, `.python-version`=3.13), Django 5.2, psycopg3,
WeasyPrint, drafthorse, factur-x, crispy-forms/bootstrap5, django-tables2, whitenoise, pytest-django.
- `config/` (Settings via `django-environ`, `DATABASE_URL`, deutsche Lokalisierung).
- Datenmodell `abrechnung/models.py`: `Firma` (Singleton), `Therapeut`, `Auftraggeber`,
`Teilnehmer` (fest 1 Therapeut), `Leistungsart`, `InvoiceLog` (Journal, keine Dokumente),
`Leistung` (ehem. `TherapySession`; `auftraggeber` über Teilnehmer abgeleitet; `betrag`),
`InvoiceCounter` (Zähler-Zeile für lückenlose Nummern in M3).
- Admin für alle Entitäten; `Firma` auf eine Instanz begrenzt.
- Auth (Login/Logout), `base.html`, Platzhalter-Dashboard.
- Docker: multi-stage `Dockerfile` (uv-Builder → schlanke Runtime mit pango/cairo/gdk-pixbuf +
Fonts), `entrypoint.sh` (wait-for-db → migrate → collectstatic → gunicorn),
`docker-compose.yml` (web + postgres:16) + Dev-Override, `.dockerignore`, `.env.example`.
**Verifiziert:** `manage.py check` sauber; Migrationen erzeugt+angewandt; HTTP-Smoketest
(Login 200, `/` anon→Login 302 / auth 200, Admin 200); `pytest` grün (3 Modelltests);
`docker compose config` valide.
**Offen (Umgebung ohne Docker-Daemon):** `docker compose up` (Image-Build + web+db live)
muss in einer Umgebung mit laufendem Docker-Daemon bestätigt werden.
## Als Nächstes: M2
Django-Login-Flow steht bereits. Zu bauen: gruppierte Erfassungs-View
**Therapeut + Monat** → je zugeordnetem Teilnehmer ein einklappbares Monatsblatt
(`modelformset_factory(Leistung)`: Datum · Leistungsart · Stunden · Satz · Beschreibung),
Stundensatz aus Leistungsart vorbelegt, Bestandseinträge vorgeladen, minimales JS
(`static/abrechnung/monatsblatt.js`: Zeilen klonen, Tab/Enter-Navigation, Live-Summen).
## Lokaler Start (Entwicklung)
```bash
uv sync
uv run python manage.py migrate # nutzt SQLite, wenn keine DATABASE_URL gesetzt
uv run python manage.py createsuperuser
uv run python manage.py runserver
```
## Start via Docker (kanonisch)
```bash
cp .env.example .env # Werte anpassen
docker compose up --build
docker compose exec web python manage.py createsuperuser
```