Metadata-Version: 2.5
Name: kommunalassist-frist
Version: 0.1.0
Summary: FristAssist der Kommunalassist-Familie: Frist, Aktion, offene Unterlagen, Ampel und Fristüberwachung
Author-email: Achim Dehnert <achim.dehnert@iil.gmbh>
License-Expression: LicenseRef-Proprietary
License-File: LICENSE
Requires-Python: >=3.12
Requires-Dist: django<6.0,>=5.0
Requires-Dist: kommunalassist-core<0.6,>=0.5.0
Provides-Extra: dev
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-django; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Description-Content-Type: text/markdown

# kommunalassist-frist

**FristAssist** der Kommunalassist-Familie: die Frist, die Handlung an ihr, die
offenen Unterlagen am Fall, die Ampel und der zeitgetriebene Überwachungslauf.

Ein zweiter bayerischer Landkreis nutzt dieses Paket **unverändert** — das ist die
Trennregel aus `meiki:ADR-043`. Was sich je Haus unterscheidet, ist eine Zeile in
Postgres, kein Code (`meiki:ADR-044` § 3).

## Was hier liegt

| Modul | Inhalt |
|---|---|
| `assist_frist.models` | `Frist`, `Aktion`, `OffeneUnterlage`, `VerarbeitetesEvent`, `Ampel` |
| `assist_frist.ueberwachung` | Ampel-Bewertung und Eskalation (UC-14) |
| `assist_frist.unterlagen` | offene Unterlagen: Liste, Rendern, HiL-Bestätigung |
| `assist_frist.arbeitsplatz` | Worklist, Wiedervorlagen, Ampel-Verteilung, Überfälligkeit |
| `assist_frist.mandant` | Mandanten-Kontext — **ohne** Rückfall auf einen Default |

## Was hier nicht liegt

**Die Rechnung.** Fristberechnung, Werktage, Feiertagsprofil, Regelauflösung und
Serie liegen in [`kommunalassist-core`](https://github.com/iilgmbh/iil-assist-core),
weil sie zwei Konsumenten haben (`meiki:ADR-022` v1.1 — FristAssist und
StatistikAssist). Läge die Engine hinter FristAssist, bräuchte StatistikAssist
FristAssist. Genau das schließt `meiki:ADR-044` aus (Prüfstein P7).

**Hausinhalt.** Kein Fristwert, keine Hausbezeichnung, keine Vorlage, kein
Deployment (Prüfstein P6).

**Die Darstellung.** Templates, Routen und Rechteprüfung liegen im Host. Dieses
Paket liefert die Sichten als Daten.

## Der Mandant ist ein Argument

Jede Funktion, die Daten anfasst, nimmt `tenant_id` entgegen. Es gibt keinen
Rückfall auf ein Setting:

```python
from assist_frist.arbeitsplatz import ampel_verteilung
from assist_frist.ueberwachung import bewerte_und_eskaliere

ampel_verteilung(tenant_id=4711)
bewerte_und_eskaliere(tenant_id=4711)
```

Der Grund ist der `single`-Betrieb des Piloten: dort haben alle dieselbe Nummer,
also fällt ein geratener Mandant nie auf — und im zweiten Haus erledigt er die
Arbeit des einen unter dem Namen des anderen. Der Host beantwortet die Frage
*welcher Mandant*; das Produkt fragt sie.

## Einbinden

```python
INSTALLED_APPS = [
    ...,
    "assist_core",
    "assist_frist",
]
```

Die Tabellen heißen `assist_frist_*`. Ein Host, der die Modelle vorher selbst
führte, braucht eine umbenennende Migration — siehe `kommunalassist-core` ADR-001,
dieselbe Entscheidung gilt hier.

## Tests

```bash
pip install -e ".[dev]" 'psycopg[binary]'
pytest -q                      # SQLite in-memory
POSTGRES_HOST=127.0.0.1 pytest -q   # Postgres, der eigentliche Maßstab
```

## Lizenz

Proprietär, IIL GmbH — siehe [LICENSE](LICENSE).
