# 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 ```