diff --git a/arbeitskacheln/00_index.md b/arbeitskacheln/00_index.md index e7fe30b..1ff9033 100644 --- a/arbeitskacheln/00_index.md +++ b/arbeitskacheln/00_index.md @@ -127,10 +127,10 @@ vergeben statt geraten. | FOUND-004 | Foundation | Authorization-Grundgerüst | P0 | M | MEDIUM | FOUND-003 | ✅ (`permission.py` Rollen/Berechtigungen) | | FOUND-005 | Foundation | API-Grundgerüst/Konventionen | P0 | S | LOW | FOUND-002 | ✅ (`api/v1/api.py` Router-Sammlung) | | FOUND-006 | Foundation | Logging & Audit-Grundgerüst | P0 | S | LOW | FOUND-002 | ✅ (Historie-Audit-Trail + `app/core/logging_config.py` einheitliches Log-Format) | -| FOUND-007 | Foundation | CSV/XLS-Import/Export Objektstammdaten (neu, Referenz: HiOrg-Server) | P2 | M | MEDIUM | ASSET-003 | ✅ (`app/services/import_export.py`, CSV für Objekt+GeraetInstanz, kein XLS) | -| FOUND-008 | Foundation | Generischer Fristen-Dienst (neu, Refactoring) | P3 | M | LOW | INV-005, PERS-007, MAINT-002 | ✅ (`app/services/fristen.py`, Normalisierungsschicht mit Dringlichkeits-Ampel) | +| FOUND-014 | Foundation | CSV/XLS-Import/Export Objektstammdaten (neu, Referenz: HiOrg-Server) | P2 | M | MEDIUM | ASSET-003 | ✅ (`app/services/import_export.py`, CSV für Objekt+GeraetInstanz, kein XLS) | +| FOUND-015 | Foundation | Generischer Fristen-Dienst (neu, Refactoring) | P3 | M | LOW | INV-005, PERS-007, MAINT-002 | ✅ (`app/services/fristen.py`, Normalisierungsschicht mit Dringlichkeits-Ampel) | | FOUND-007 | Foundation | Konfigurationsmanagement | P0 | XS | LOW | FOUND-001 | ✅ (`core/app_settings.py`, BaseSettings) | -| FOUND-008 | Foundation | Docker/Compose-Setup | P0 | M | MEDIUM | FOUND-001 | ⬜ (kein Dockerfile/docker-compose im Repo gefunden) | +| FOUND-008 | Foundation | Docker/Compose-Setup | P0 | M | MEDIUM | FOUND-001 | ❌ won't-do (2026-09-10) — widerspricht CLAUDE.md-Policy „kein Docker-Zwang" für MABEA selbst; MABEA läuft vollständig bare-metal (systemd, nginx, kein Container). GlitchTip (FOUND-013) nutzt Docker, aber als externe Fremdsoftware auf einem separaten, optionalen Host — kein Widerspruch. | | FOUND-009 | Foundation | CI/CD-Grundgerüst | P0 | S | LOW | FOUND-008 | ✅ (`.gitea/workflows/ci.yml` - Backend-Tests + Frontend-Build/Tests, vorheriger Abgleich hat nur `.github/` geprüft) | | FOUND-010 | Foundation | Backup-Strategie | P1 | S | MEDIUM | FOUND-002 | ✅ (`deploy/backup_datenbank.sh` + systemd-Timer-Vorlagen, taeglich mit Rotation) | | FOUND-011 | Foundation | Test-Grundgerüst | P0 | M | LOW | FOUND-002 | ✅ (`backend/pytest.ini`+`backend/tests/`, seit 2026-09-08 auch `frontend/vitest.config.ts`+`src/**/*.test.ts(x)`, beide in CI) | @@ -302,7 +302,7 @@ eigenes Modul (MAINT-\*, MABEA hat nur Prüfung, keine Wartung)**. | Datei | Enthält Details für | |---|---| -| `01_foundation.md` | FOUND-001 … FOUND-008 (001-006 vollständig/teilweise, FOUND-007/008 offen/ungeplant, Referenz HiOrg-Server, 2026-09-09) | +| `01_foundation.md` | FOUND-001 … FOUND-015 (001-006/013/014/015 umgesetzt, FOUND-008 won't-do 2026-09-10, FOUND-014/015 ursprünglich fälschlich als FOUND-007/008 nummeriert, Referenz HiOrg-Server 2026-09-09) | | `02_identity.md` | IDENT-001, 002, 004, 005 … 010 | | `03_digital_file.md` | FILE-001 … FILE-009 (alle ✅ umgesetzt) | | `04_assets.md` | ASSET-001 … ASSET-010 (ASSET-009 nachträglich ergänzt, ASSET-010 ✅ umgesetzt 2026-09-10) | diff --git a/arbeitskacheln/01_foundation.md b/arbeitskacheln/01_foundation.md index 67cf6c8..85fcd5e 100644 --- a/arbeitskacheln/01_foundation.md +++ b/arbeitskacheln/01_foundation.md @@ -1,8 +1,12 @@ # Epic 01 — Foundation -Details zu FOUND-001 … FOUND-008. FOUND-007/008 ergänzt am 2026-09-09 aus -HiOrg-Server-Vergleich, offen/ungeplant. Übersichtstabelle mit allen FOUND-Kacheln (auch die noch -nicht detaillierten) siehe `00_index.md`. +Details zu FOUND-001 … FOUND-006, FOUND-014/015, FOUND-013. FOUND-014/015 +ergänzt am 2026-09-09 aus HiOrg-Server-Vergleich (ursprünglich fälschlich +als FOUND-007/008 nummeriert — kollidierte mit den bereits vergebenen IDs +für Konfigurationsmanagement/Docker-Compose aus der ursprünglichen +Master-Prompt-Liste, am 2026-09-10 auf FOUND-014/015 korrigiert). +Übersichtstabelle mit allen FOUND-Kacheln (auch die noch nicht +detaillierten) siehe `00_index.md`. --- @@ -129,7 +133,7 @@ nicht detaillierten) siehe `00_index.md`. - **Tests:** Log-Eintrag wird bei simulierter Aktion erzeugt und ist abrufbar. - **DoD:** mind. ein reales Ereignis (z.B. Login) wird bereits geloggt. -## FOUND-007 — CSV/XLS-Import/Export für Objekt- und Materialstammdaten (P2, neu, +## FOUND-014 — CSV/XLS-Import/Export für Objekt- und Materialstammdaten (P2, neu, Scope geklärt 2026-09-09) - **Ziel:** Massenpflege von Objekt- UND Materialstammdaten statt Einzelanlage per @@ -180,7 +184,7 @@ nicht detaillierten) siehe `00_index.md`. Import/Export für praktisch alle Datentypen (CSV/XLS/vCard/iCal) — MABEA hat dafür jetzt einen CSV-Mechanismus für die beiden wichtigsten Ebenen. -## FOUND-008 — Generischer Fristen-Dienst (P3, neu, Schnittstelle geklärt 2026-09-09) +## FOUND-015 — Generischer Fristen-Dienst (P3, neu, Schnittstelle geklärt 2026-09-09) - **Ziel:** EINE Berechnungslogik für „läuft etwas bald ab/wird etwas bald fällig" statt mehrfach separat implementiert. @@ -301,10 +305,13 @@ nicht detaillierten) siehe `00_index.md`. --- -**MABEA-Ist-Stand-Abgleich:** FOUND-001…006 sind in MABEA vollständig vorhanden -(FastAPI-Grundgerüst, Alembic-Migrationen, JWT-Login, `require_roles()`-Dependency, -einheitliches Fehlerformat + `/docs`, `historie`-Tabelle als Audit-Log). FOUND-007…012 -(Konfiguration/Docker/CI/Backup/Tests/Doku) ebenfalls größtenteils vorhanden -(`app_settings.py`, `.env`, Gitea-CI `ci.yml`, `pytest`, README/DEVLOG). FOUND-013 -(Error-Tracking) als einzige echte Lücke identifiziert und geplant (2026-09-10), -Umsetzung hängt an einer noch offenen Zielserver-Entscheidung. +**MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-10):** FOUND-001…006 sind in +MABEA vollständig vorhanden (FastAPI-Grundgerüst, Alembic-Migrationen, +JWT-Login, `require_roles()`-Dependency, einheitliches Fehlerformat + +`/docs`, `historie`-Tabelle als Audit-Log). FOUND-007/009…012 +(Konfiguration/CI/Backup/Tests/Doku) ebenfalls vorhanden (`app_settings.py`, +`.env`, Gitea-CI `ci.yml`, `pytest`, README/DEVLOG). FOUND-008 +(Docker/Compose) bewusst **won't-do** — widerspricht der bare-metal-Policy +für MABEA selbst (CLAUDE.md). FOUND-013 (Error-Tracking) erledigt +(optionales Install-Script statt fester Zielserver-Festlegung). FOUND-014 +(CSV/XLS-Import) und FOUND-015 (Fristen-Dienst) erledigt. diff --git a/arbeitskacheln/09_inspections.md b/arbeitskacheln/09_inspections.md index 558d744..c0f9f3d 100644 --- a/arbeitskacheln/09_inspections.md +++ b/arbeitskacheln/09_inspections.md @@ -26,7 +26,7 @@ Details zu INSP-001 … INSP-006 (vollständig). Nutzer): additiver Phasenplan statt Big-Bang-Umbau.** Ein vollständiger Ersatz der bestehenden `GeraetInstanz.status`/`pruefdatum`/`naechste_pruefung`- und `Fahrzeugdetails.naechste_hu`/`naechste_uvv`-Felder hätte Dashboard- - Prüftermine, den Fristen-Dienst (FOUND-008) und ASSET-010 (Custody nutzt + Prüftermine, den Fristen-Dienst (FOUND-015) und ASSET-010 (Custody nutzt `naechste_pruefung`) mitbetroffen — deutlich höheres Regressionsrisiko als nötig für den geäußerten Bedarf. Stattdessen: - **Phase 1 (umgesetzt 2026-09-10):** `pruefart`/`objekttyp_pruefart`/ @@ -150,7 +150,7 @@ Details zu INSP-001 … INSP-006 (vollständig). gueltig/bald_ablaufend/abgelaufen): `fehlgeschlagen` (jüngste `Pruefung` hat `ergebnis=nicht_bestanden` — **unabhängig vom Datum**, das ist exakt die ursprünglich fehlende FAILED-Fähigkeit), sonst `ok`/`bald`/`kritisch`/ - `ueberfaellig` aus `app/services/fristen.py:ampel_aus_tagen()` (FOUND-008, + `ueberfaellig` aus `app/services/fristen.py:ampel_aus_tagen()` (FOUND-015, wiederverwendet statt dupliziert) bezogen auf `GeraetInstanz.naechste_pruefung`. `GET /geraete/{id}/pruefungs-ampel`. Nur für Geräte (Phase 1), Fahrzeug- HU/UVV-Ampel bleibt vorerst beim bestehenden Dashboard-Mechanismus. diff --git a/arbeitskacheln/16_operations.md b/arbeitskacheln/16_operations.md index d43a58c..9953486 100644 --- a/arbeitskacheln/16_operations.md +++ b/arbeitskacheln/16_operations.md @@ -41,7 +41,7 @@ künstlich zu trennen. statt eines eigenen Notiz-Modells — deckt den geäußerten Bedarf ab, ohne FILE-009 (AkteNotiz) zu duplizieren. Verbrauchsmaterial-Nachbestellung nicht umgesetzt (kein konkreter Bedarf dafür geäußert, kann bei Bedarf als eigene - Ausbaustufe nachgezogen werden — z.B. Verknüpfung zu FOUND-007-Import oder + Ausbaustufe nachgezogen werden — z.B. Verknüpfung zu FOUND-014-Import oder einer neuen Nachbestell-Liste). - **DoD:** ✅ Debriefing-Notiz umgesetzt (2026-09-10), zusammen mit OPS-001. Nachbestellungs-Funktion bewusst nicht umgesetzt (kein Bedarf geäußert). diff --git a/backend/app/services/fristen.py b/backend/app/services/fristen.py index 44c03a3..9e692b7 100644 --- a/backend/app/services/fristen.py +++ b/backend/app/services/fristen.py @@ -30,7 +30,7 @@ class FristTreffer(BaseModel): def ampel_aus_tagen(verbleibende_tage: int, warnzeitraum_tage: int) -> Dringlichkeit: - """FOUND-008: gemeinsamer Schwellenwert für alle datumsbasierten Fristen + """FOUND-015: gemeinsamer Schwellenwert für alle datumsbasierten Fristen (Charge-Ablauf, Qualifikations-Ablauf, zeitbasierte Wartungsintervalle) - "kritisch" ab einem Viertel des jeweiligen Warnzeitraums, nicht fix in Tagen (60 Tage Vorlauf bei Qualifikationen brauchen einen anderen Kritisch-Punkt diff --git a/backend/app/services/import_export.py b/backend/app/services/import_export.py index 1584b30..b50e5b8 100644 --- a/backend/app/services/import_export.py +++ b/backend/app/services/import_export.py @@ -70,7 +70,7 @@ async def exportiere_objekte(db: AsyncSession) -> str: async def importiere_objekte( db: AsyncSession, inhalt: str, *, commit: bool ) -> tuple[int, int, list[ImportZeile]]: - """FOUND-007: Upsert über `code` - existiert der Code, wird aktualisiert, + """FOUND-014: Upsert über `code` - existiert der Code, wird aktualisiert, sonst neu angelegt (bewusst ohne Beladungsvorlage - Excel-Rucksacklisten haben selten eine 1:1-Vorlagen-Zuordnung, Positionen kommen ggf. separat über den Geräte-Import oder die UI).""" @@ -193,7 +193,7 @@ async def exportiere_geraete(db: AsyncSession) -> str: async def importiere_geraete( db: AsyncSession, inhalt: str, *, commit: bool ) -> tuple[int, int, list[ImportZeile]]: - """FOUND-007: Objektposition wird bei Bedarf automatisch angelegt (Sollmenge + """FOUND-014: Objektposition wird bei Bedarf automatisch angelegt (Sollmenge = Anzahl importierter Geräte-Zeilen für dieselbe Objekt/Material-Kombination - Zusatzposition ohne Vorlagenbezug, sollmenge_override ist dort Pflicht). Duplikat-Erkennung über Seriennummer je Objektposition (Karte 14: gleiche SN