153 Commits

Autor SHA1 Nachricht Datum
2afb2da489 Promote develop → main (2026-07-25 22:22 UTC) 2026-07-26 00:22:09 +02:00
a032366d5d Release-Notes: Neue Zugänge, bessere Navigation & UI-Verbesserungen 2026-07-26 00:22:06 +02:00
claude-dev
485638ab3b fix(dashboard): Kachel Artikel-Uebersetzung erneut entfernt
Der Uebertrag-Commit 9bf3adb hat die parallel gelandete Entfernung
16a9b9c versehentlich rueckgaengig gemacht (Komplett-Datei-Upload aus
einem aelteren Arbeitsstand). Diese Wiederholung stellt den gewollten
Zustand wieder her, Karte + JS-Block sind wieder raus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 21:53:37 +00:00
claude-dev
9bf3adbacb feat(abrechnung): Credits-Uebertrag komplett entfernt
Produktentscheidung 07/2026: ungenutzte Credits verfallen zum
Periodenende. Uebertrag-Checkbox aus allen drei Formularen
(Kontingent bearbeiten, Lizenz anlegen, Org anlegen) samt
Ausgrau-Logik raus, credits_rollover/credits_carried aus Modellen,
Endpoints (overview/current/PUT budget) und insert_license_row raus,
Anzeige inkl. Uebertrag im Org-Detail raus. Migrationsskript legt die
beiden Spalten nicht mehr an. Gegenstueck zum Monitor-Commit f8499c4,
Promote-Reihenfolge wie immer Monitor VOR Portal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 21:51:02 +00:00
claude-dev
16a9b9c436 refactor(dashboard): Kachel Artikel-Uebersetzung entfernt
Die Kachel wird nicht mehr gebraucht, die Uebersetzungs-Einstellungen im
Monitor bleiben unveraendert (global TRANSLATOR_ENABLED=false, Override
pro Organisation weiterhin wirksam).

- Markup der Karte translationCard aus dashboard.html entfernt.
- Zugehoerigen JS-Block aus app.js entfernt (setupTranslation,
  renderTranslation, loadTranslationStatus, pollTranslation,
  startTranslation, cancelTranslation, formatDuration) samt der drei
  Aufrufstellen beim Start und beim Wechsel auf den Dashboard-Tab.

Die API-Endpoints unter /api/translation und translation_agent.py
bleiben bestehen, sie haben jetzt nur keine Oberflaeche mehr.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 21:37:14 +00:00
claude-dev
c5e761899a feat(ui): schwebende Scroll-Leiste + breitere Inhaltsflaeche
- Die Quellenliste hat jetzt eine dauerhaft sichtbare Scroll-Leiste, die
  am unteren Bildschirmrand schwebt, solange die Tabelle im Bild ist
  (Proxy-Element, beidseitig synchronisiert, blendet sich aus wenn
  nichts zu scrollen ist). Scroll-Leisten der Tabellen sind sichtbarer
  gestylt, Daumen faerbt sich beim Ueberfahren gold.
- app-content von 1200 auf 1720 Pixel Maximalbreite. Ein breiteres
  Fenster zeigt jetzt wirklich mehr Tabelle statt leerer Raender.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:44:28 +00:00
claude-dev
c35a30a823 feat(quellen): leichteres Seitwaerts-Scrollen in der Quellenliste
- Name-Spalte (und bei Kundenquellen-Filter die Checkbox-Spalte) bleibt
  links angepinnt, die Aktionen-Spalte rechts. Solide Hintergruende und
  weiche Trennkanten, damit nichts durchscheint (Dark + Light).
- Kategorie-Ueberschriften und Ausklapp-Inhalte (Notizen, Health-Details)
  bleiben beim Scrollen im sichtbaren Bereich (position sticky).
- Ziehen-zum-Scrollen: die Tabelle laesst sich mit gedrueckter Maustaste
  greifen und seitwaerts ziehen (generischer Helper enableDragScroll,
  Knoepfe/Checkboxen bleiben normal bedienbar, nach echtem Ziehen wird
  der Klick geschluckt).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:39:58 +00:00
claude-dev
bb11e05fed fix(zugaenge): echte Marken-Glyphen fuer X und Telegram
Das Lucide-X sah aus wie ein Schliessen-Symbol, der einfache
Papierflieger traf das Telegram-Logo nicht. Jetzt die bekannten
einfarbigen Marken-Pfade (X-Wortmarke, Telegram-Kreis mit Flieger),
beide in currentColor, damit sie in Dark und Light passen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:20:38 +00:00
claude-dev
842641562b feat(zugaenge): X-Zugang und Telegram-Zugang als gleichwertige Dienst-Karten
Beide Dienste erscheinen als Karte mit Lucide-Icon im Titel (X-Kreuz,
Telegram-Papierflieger) und derselben Tabellenstruktur (Benutzername,
E-Mail bzw. Telefon, Status, Anfragen, Letzte Nutzung/Pruefung, Aktionen).
Die nackte Konten-Zaehlung entfaellt, die X-Knoepfe ziehen in den
Kartenkopf. Telegram-Zeile zeigt Konto, Telefonnummer (Monitor-Commit
5450fd2), Status und letzte Pruefung.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:16:21 +00:00
claude-dev
16250cd8f5 feat(zugaenge): Telegram-Session-Status im Reiter Recherche-Zugaenge
Der Reiter X-Recherche-Konten heisst jetzt Recherche-Zugaenge und zeigt
oben eine Telegram-Karte: Session gueltig/Problem, verbunden als, Stand.
Die Daten meldet der Monitor (Commit 7dae63e) in die geteilte Tabelle
system_status, das Portal liest nur an (GET /api/x-scraper/telegram-status,
tolerant wenn Tabelle/Eintrag fehlt). Migration fuer die
Portal-Staging-DB liegt bei. Promote-Reihenfolge: Monitor VOR Portal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:07:01 +00:00
claude-dev
14546f7c0a chore(sources): Erklaertext im Reiter X-Recherche-Konten entfernt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:59:23 +00:00
claude-dev
ae4fb106ad feat(sources): Sammel-Bearbeitung fuer Vorschlaege im Aufgaben-Reiter
Die Vorschlags-Tabelle hat jetzt eine Checkbox-Spalte mit Alle-auswaehlen
(wirkt auf die gefilterten Zeilen) und zwei Knoepfe Ausgewaehlte annehmen /
Ausgewaehlte ablehnen. Noetig geworden, weil ein Pruefaluf hunderte
Vorschlaege erzeugen kann und Einzelklicks mit Dialog dann nicht praktikabel
sind. Neuer Endpoint PUT /suggestions/bulk nutzt exakt dieselbe
Entscheidungslogik wie der Einzel-Endpoint (gemeinsamer Helper
_apply_suggestion_decision, inkl. Auto-Reject und Duplikat-Schutz),
bereits erledigte IDs werden uebersprungen statt als Fehler gewertet.
Ein Audit-Eintrag pro Sammelaktion mit Zaehlern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:54:43 +00:00
claude-dev
c5f63b1d14 fix(sources): Feinschliff nach Konsistenz-Pruefung + UI-Rueckmeldungen
Echte Fehler:
- esc() maskiert jetzt auch Anfuehrungszeichen. Quellennamen mit
  Apostroph (z.B. LExpress) brachen sonst die Zeilen-Knoepfe.
- formatDateTime parst SQLite-UTC-Zeitstempel jetzt als UTC statt
  Lokalzeit (Zeiten waren um den Zeitzonen-Offset verschoben).
- Audit-Filter Bis-Datum schliesst den gewaehlten Tag jetzt komplett ein.

UI-Rueckmeldungen:
- Beschreibung in der Vorschlags-Tabelle bricht mehrzeilig um statt
  abgeschnitten zu werden.
- Bestaetigen-Knopf im Dialog ist standardmaessig Gold, Rot nur noch bei
  destruktiven Aktionen (Org/Nutzer/Quelle loeschen, X-Konto entfernen).
- Alle >= 0.85 genehmigen ist ausgegraut, solange keine Klassifikationen
  ausstehen.

Konsistenz:
- GET /suggestions deckelt pending nicht mehr auf 50 (Badge und Tabelle
  liefen auseinander), bearbeitete weiterhin letzte 50.
- /stats zaehlt jetzt alle Quellen wie die Liste (nicht nur aktive),
  Grundquellen/Kundenquellen-Aufteilung wird immer angezeigt.
- Health-Spalte sortiert nach Schweregrad statt alphabetisch.
- Aufgaben-Badge laedt schon beim Seitenstart, nicht erst beim Reiterklick.
- Loesung-suchen-Knopf stellt nach Fehler das Icon wieder her, native
  confirm()-Dialoge durch showConfirm ersetzt.
- Tote Endpoints GET /health (Alt-Liste) und GET /classification/stats
  entfernt, tote CSS-Bloecke (activity-*, badge-health-*,
  review-conf-filter) geloescht.
- Smoke-Test deckt jetzt alle Klassifikations-/Upload-/Sync-Endpoints ab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:48:16 +00:00
claude-dev
bc3b0bb9ee feat(ui): Filter als Checkbox-Dropdowns (Knopf klappt Mehrfachauswahl auf)
Auf Nutzerwunsch statt offen liegender Checkbox-Reihen: jeder Filter ist
jetzt ein Dropdown-Knopf, der beim Klick eine Checkbox-Liste aufklappt.
Der Knopf zeigt die Anzahl der gesetzten Haken als goldene Plakette,
Klick daneben schliesst das Panel, nichts angehakt = alle. Gilt ueberall
(Quellenliste, Aufgaben, Audit-Log), da zentral in renderFilterGroup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:27:42 +00:00
claude-dev
2df2fa1cfa feat(ui): alle Filter als Checkbox-Gruppen statt Dropdowns + Aufgaben-Filter
- Neuer wiederverwendbarer Helper renderFilterGroup (app.js) + filter-bar-CSS.
  Mehrfachauswahl per Checkbox, nichts angehakt = alle, Gold-Akzent.
- Quellenliste: Herkunft/Typ/Status/Kategorie/Sprache als Checkbox-Leiste
  unter der Action-Bar. Checkbox-Spalte + Bulk-Promote erscheinen, wenn der
  Herkunfts-Filter ausschliesslich auf Kundenquellen steht.
- Aufgaben ist jetzt filterbar: Vorschlagstyp und Prioritaet fuer die
  Vorschlags-Tabelle, Konfidenz-Stufen (ab 85, 70 bis 85, 50 bis 70,
  unter 50 Prozent) fuer die Klassifikations-Karten. Das alte
  Mindest-Konfidenz-Dropdown entfaellt, die Queue laedt einmal komplett
  und filtert clientseitig.
- Audit-Log: Aktion/Ressource/Admin als Checkbox-Gruppen, Backend
  akzeptiert dafuer kommagetrennte Mehrfachwerte (IN-Filter,
  Einzelwert bleibt kompatibel). Ressourcen-ID und Datumsfelder bleiben
  Eingabefelder.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:23:27 +00:00
claude-dev
14e766173c feat(sources): Knopf Jetzt pruefen startet den Health-Check aus dem Portal
- POST /api/sources/health/run (202, bei laufendem Run 409) stoesst den
  Lauf als BackgroundTask an: eigene DB-Connection, run_health_checks +
  generate_suggestions aus den geteilten Diensten, exakt nach dem Vorbild
  des Monitor-Nachtjobs daily_source_health_check. Kein Code-Duplikat.
- GET /api/sources/health/run-status liefert den In-Memory-Status
  (health_run.py, pure Funktionen mit Doppelstart-Sperre, unit-getestet).
  Nach einem Neustart ist der Status idle, ein partieller Stand wird vom
  naechsten Lauf archiviert und ueberschrieben (wie beim Nachtjob).
- Frontend: Knopf Jetzt pruefen + Zuletzt geprueft in der Stats-Leiste
  der Quellenliste, Polling alle 4 s, Abschluss-Toast mit geprueft/
  Probleme/neue Vorschlaege, danach Liste + Aufgaben-Badge neu laden.
  Beim Oeffnen des Reiters wird ein laufender Run aus anderer Session
  erkannt und weiterverfolgt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:14:14 +00:00
claude-dev
bcfdac158e feat(sources): Aufgaben-Posteingang ersetzt Quellen-Health und Klassifikation
- Neuer Unterreiter Aufgaben buendelt Health-Vorschlaege (Tabelle inkl.
  Loesung-suchen), Klassifikations-Review-Karten und den eingeklappten
  Verlauf (erledigte Vorschlaege + letzte Prueflaeufe). Die dritte
  Navigationsebene (healthSubTabs) entfaellt komplett.
- Badge zeigt die Summe aus offenen Vorschlaegen und ausstehenden
  Klassifikationen, gespeist vom neuen billigen GET /api/sources/tasks/summary
  (gleiche Bedingung wie /classification/stats, laeuft nie auseinander).
  Badge laedt jetzt schon beim Klick auf den Quellen-Hauptreiter.
- aufgaben.js NEU (uebernimmt Vorschlags-/Verlauf-Rendering aus
  source-health.js und den kompletten Klassifikations-Block aus sources.js),
  source-health.js GELOESCHT (60s-Cache, Checks-Tabelle mit eigener
  Pagination und Filtern entfaellt, die Details stecken jetzt als
  Ausklapp-Zeile in der Quellenliste).
- Quellen hat damit 3 statt 5 Unterreiter: Quellenliste, Aufgaben,
  X-Recherche-Konten.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:11:19 +00:00
claude-dev
bbbcc51fc2 feat(sources): vereinte Quellenliste (Grund- + Kundenquellen in einer Tabelle)
- GET /api/sources mit scope=all|global|tenant ersetzt GET /global und
  GET /tenant. Liefert org_name (LEFT JOIN organizations) und wie bisher
  health_status + Artikel-Aktivitaet fuer ALLE Quellen.
- GET /global/stats wird GET /stats (zaehlt jetzt beide Herkuenfte,
  neu by_origin und last_check), GET /global/languages wird GET /languages.
- PUT /global/{id} akzeptiert jetzt auch Kundenquellen (Guard ohne
  tenant_id-Filter), damit der Deaktivieren-Knopf fuer beide funktioniert.
  DELETE bleibt bewusst global-only.
- Neu GET /{source_id}/health fuer die Ausklapp-Details je Quelle.
- Frontend: EIN Render-/Filter-/Sortier-Pfad statt zwei (Tenant-Kette
  komplett entfernt, ~200 Zeilen). Herkunfts-Filter, Organisations-Spalte,
  Checkbox-Spalte + Bulk-Promote nur bei Herkunft Kundenquellen.
- Health-Badge ist klickbar und klappt eine gemeinsame Detailzeile aus
  (Notizen + Checks mit Meldung und Zeitpunkt) mit Deaktivieren-Knopf.
  Klickweg kaputte Quelle finden und deaktivieren: 3 statt 8 bis 10 Klicks.
- Unterreiter Kundenquellen entfaellt, erster Reiter heisst Quellenliste.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 18:06:35 +00:00
claude-dev
1a08facb64 fix(sources): Meta-Reparatur (telegram/x/x_account/pdf_document) + toten Code entfernt
- source_meta.py kennt jetzt den echten Bestand: Kategorien telegram (107 Quellen)
  und x (40), Typen x_account und pdf_document. Die 10 nie belegten
  Lagen-Kategorien und der ungenutzte Typ excluded sind raus.
- Pydantic-Pattern source_type um x_account ergaenzt, excluded raus.
  Behebt 422 beim Speichern von 40 X-Account-Quellen.
- Modal-Selects (Typ, Kategorie, PDF-Kategorie) werden aus /api/sources/meta
  befuellt statt hartkodiert. Submit sendet category/source_type nur noch,
  wenn nicht leer. Behebt stilles Loeschen der Kategorie bei Telegram-Quellen.
- source_suggester: Import auf shared.agents.claude_client angepasst
  (war im Portal seit jeher kaputt, Konvention wie source_classifier).
- Toter Code raus: POST /health/run-stream (147 Z. SSE-Duplikat),
  runHealthCheck() im Frontend, excluded_counts-CTE + Sperren-Spalte
  (immer 0), Trend-Delta (braucht 2 Runs, es gibt 1), Alignment-Chips
  (source_alignments ist leer), doppeltes formatDateTime, redundanter
  setupHealthTab-Listener, toter healthContent-Zugriff.
- Tests: Kategorien-/Typen-Sets neu gepinnt, Smoke-Karteileichen entfernt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 17:58:08 +00:00
claude-dev
68fc1794a9 feat(org-detail): Slug aus der Oberfläche, Info-Zeile im Kopf entfernt
Der Slug ist eine rein technische Kennung und verschwindet aus Tabelle,
Kopfzeile und Anlege-Formular. Beim Anlegen wird er unsichtbar aus dem
Namen erzeugt, bei Kollision hängt das Portal selbstständig eine Nummer
an. Die Info-Zeile unter dem Org-Namen (Slug, Nutzer, Lizenz,
Kontingent) entfällt komplett, dieselben Werte stehen direkt darunter
in der Übersicht und der Bearbeiten-Karte.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 17:01:40 +00:00
claude-dev
15cea7cb3b feat(dashboard): Karte Letzte Aktivität entfernt
Die Detailansicht dafür ist das Audit-Log, die Dashboard-Dublette ist
auf Nutzerwunsch raus. Bald ablaufende Lizenzen läuft jetzt volle Breite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:57:40 +00:00
claude-dev
4302a11d1e feat(dashboard): Kosten-Kachel nennt den Monat beim Namen (z.B. Juli 26)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:56:37 +00:00
claude-dev
7336ba8ad0 feat(dashboard): Kosten-Kachel zeigt den aktuellen Monat
Die Kachel heißt jetzt API-Kosten aktueller Monat (Läufe des Monats und
Lebenszeit-Summe klein in der Unterzeile) statt der nackten
Gesamtsumme. Datenquelle ist der Statistik-Endpoint in einem Aufruf.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:54:40 +00:00
claude-dev
9d76fb994a feat(dashboard): Vorfälle-Kachel entfernt
Lagen werden ausschließlich im Monitor verwaltet, die Kachel im Portal
war ein reiner Zähler ohne Ziel und ist auf Nutzerwunsch raus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:47:40 +00:00
claude-dev
888a405a54 feat(org-detail): Bereich Verbrauch & Kontingent heißt jetzt Übersicht
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:45:27 +00:00
claude-dev
50a8237e96 feat(org-detail): Verbrauchs-Korrektur direkt an der Kachel, Zahlenfelder ohne Pfeile
Die Korrektur des Verbrauchszählers sitzt jetzt direkt an der Kachel
"Verbrauchte Credits", wo man den Zähler sieht, als Eingabefeld mit
Korrigieren-Knopf und Sicherheitsrückfrage. Das Feld im Kontingent-
Formular entfällt dafür. Außerdem sind die Hochzähl-Pfeile an allen
Zahlenfeldern des Portals entfernt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:33:24 +00:00
claude-dev
73ae7be76d feat(org-detail): Verbrauch korrigieren sichtbar statt eingeklappt
Auf Nutzerwunsch ist das Korrektur-Feld (Kulanz, Fehlbereinigung) jetzt
ein normales sichtbares Formularfeld neben der Warnschwelle, mit
deutlichem Hinweistext, statt in einem Aufklapp-Bereich zu stecken.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:30:01 +00:00
claude-dev
e302261314 feat(org-detail): Altmodus-Felder aus allen Formularen entfernt
Kosten pro Credit (USD) und Budget-Limit (USD) gehörten zum
abgeschalteten Altmodus (BILLING_MODE=actual) und sind aus dem
Kontingent-Formular, dem Lizenz-Modal und der Org-Anlage entfernt.
Der Erweitert-Bereich heißt jetzt "Verbrauch korrigieren" und enthält
nur noch das Eingriffsfeld für den Verbrauchszähler. Die DB-Spalten,
die API-Felder und der Rückfallmodus im Monitor bleiben unangetastet,
falls der Altmodus je reaktiviert wird, setzt man die Werte per API.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:26:51 +00:00
claude-dev
e9395f33eb feat(org-detail): Nutzer-Verwaltung in die Lizenz- und Kontingent-Karte
Die Karte heißt jetzt "Lizenz, Nutzer & Credits-Kontingent bearbeiten"
und enthält alles Einstellbare einer Organisation untereinander,
Lizenz-Tabelle, Nutzer-Verwaltung (Limit-Anzeige, Nutzer anlegen,
Nutzerliste) und das Kontingent-Formular. Der separate Nutzer-Block
entfällt, das Org-Detail ist damit ein einziger Bereich.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:57:57 +00:00
claude-dev
83af0d6897 feat(org-detail): Widerrufen-Knopf entfernt, Warnschwelle 0 = aus
Zwei Rückmeldungen des Nutzers.

- Der Widerrufen-Knopf in der Lizenz-Tabelle ist raus. Eine neue Lizenz
  widerruft die alte automatisch, und einen Kunden abschalten erledigt
  der prominente Org-Status-Umschalter. Der API-Endpoint /revoke bleibt.
- Die Warnschwelle lässt sich jetzt abschalten, 0 = aus, in allen drei
  Formularen (Budget, Neue Lizenz, Org-Anlage) samt Modell- und
  Endpoint-Validierung. Gegenstück im Monitor ist Commit 17b1886
  (bisher fiel eine 0 dort still auf die Voreinstellung 80 zurück).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:52:40 +00:00
claude-dev
db0a8c1d9e feat(org-detail): Org-Status als prominenter Umschalter in der Kopfzeile
Statt des kleinen Auswahlfelds neben dem Namen jetzt ein deutlich
sichtbarer Zwei-Knopf-Umschalter (Aktiv grün mit Haken, Deaktiviert rot
mit Sperr-Symbol), der aktive Zustand ist farbig gefüllt, Klick
speichert sofort wie bisher.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:49:38 +00:00
claude-dev
f301e22c6b feat(org-detail): Max Nutzer inline editierbar, Org-Status in die Kopfzeile
Zwei Verbesserungen auf Nutzer-Rückmeldung.

- Max Nutzer war nach dem Anlegen einer Lizenz nirgends mehr änderbar.
  In der aktiven Lizenz-Zeile ist es jetzt ein Zahlenfeld mit
  Sofort-Speicherung (der generische Lizenz-Updater akzeptiert max_users
  mit Prüfung 1 bis 1000), die Limit-Anzeige über der Nutzerliste zieht
  mit.
- "Status" (Lizenz) direkt neben "Org-Status" war verwirrend. Der
  Org-Status sitzt jetzt als Umschalter in der Kopfzeile der
  Organisation (an der Stelle des bisherigen Abzeichens), die Tabelle
  behält nur noch Lizenz-Status und Pipeline-Sprache.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:46:51 +00:00
claude-dev
2c3087e389 feat(org-detail): Einstellungen-Block aufgelöst, alles direkt einstellbar
Der frühere Bereich Einstellungen ist weg, seine Inhalte sind dorthin
gewandert, wo man sie sieht.

- Org-Status (Aktiv/Deaktiviert) und Pipeline-Sprache sind neue Spalten
  in der Lizenz-Tabelle, in der aktiven Zeile direkt umschaltbar mit
  Sofort-Speicherung und Toast, widerrufene Zeilen zeigen einen Strich.
- Umbenennen (kleines Modal) und Organisation löschen (mit Rückfrage)
  sitzen als Knöpfe in der Kopfzeile der Organisation.
- Das Org-Detail besteht damit nur noch aus zwei Bereichen, Verbrauch &
  Kontingent und Nutzer. Kein Backend-Change nötig, PUT /api/orgs/{id}
  konnte Name, Status und Sprache schon immer einzeln ändern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:42:42 +00:00
claude-dev
863e8835e4 feat(org-detail): Verbrauch weiter aufgeräumt, Lizenz und Kontingent in einer Karte
Auf Nutzerwunsch vier Änderungen im Org-Detail.

1. Kundensicht (Credits) und interner Einkauf (USD) stehen in EINER
   Karten-Reihe (Verbraucht, Verbleibend, API-Kosten Monat). Die Karte
   "Budget-Limit (USD, Altmodus)" entfällt in der Anzeige, das Feld
   bleibt im Erweitert-Bereich des Formulars erhalten.
2. Die Laufzeitwerte-Karte (Übertrag, laufende Periode, Verfügbar
   gesamt) ist raus. Der Übertrag bleibt im Verbleibend-Wert als
   Zusatz "(inkl. X Übertrag)" sichtbar.
3. "Lizenz & Credits-Kontingent bearbeiten" steht jetzt an zweiter
   Stelle direkt unter der Karten-Reihe und enthält BEIDES, die
   Lizenz-Verwaltung (Tabelle, Neue Lizenz, Verlängern, Widerrufen)
   und darunter das Kontingent-Formular. Der eigene Lizenzen-Block
   entfällt, der Monatliche Verlauf rückt ans Ende.
4. Die Sprungmarken-Leiste (Verbrauch/Nutzer/Lizenzen/Einstellungen)
   oben im Org-Detail ist entfernt, die Seite ist kurz genug.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:22:45 +00:00
claude-dev
25ec80c8e4 feat(statistik): Hauptreiter Statistik mit kompletter Betriebsstatistik
Neuer Reiter zwischen Audit-Log und Verbrauchsrechner, Anlass war die
Dashboard-Kachel API-Kosten gesamt, die nirgendwo hinführte (sie springt
jetzt hierher). Kennzahlen-Set nach Betreiber-Best-Practices für
nutzungsbasierte KI-Produkte (Kostenverlauf, Marge je Kunde, Betrieb).

- GET /api/statistik?months=N liefert alles in einem JSON. Kosten und
  Läufe je Monat und Lagentyp (führende Quelle refresh_log mit
  lückenlosem incidents-Join), Quellen-Split aus token_usage_monthly,
  Erfolgsquote, normalisiertes Fehler-Ranking, Dauer je Typ, Wachstum,
  MAU/DAU aus user_activity_days und je Organisation Ist-Kosten plus
  Margen-Schätzung zu heutigen Sätzen (Recherche-Anlage zählt dreifach,
  weil der Multi-Pass nur eine Log-Zeile erzeugt). Aggregation als pure,
  unit-getestete Funktionen, Monatsachse lückenlos gefüllt, Mediane nur
  über Läufe mit Kosten (Erfassung begann erst 03/2026).
- statistik.js injiziert sich selbst nach dem rechner.js-Muster,
  Platzierung doppelt gesichert (Ladereihenfolge mit async=false plus
  insertBefore). Charts als Inline-SVG ohne Bibliothek, eine Achse je
  Chart, Hover-Titel mit großen Trefferflächen, Legenden, Serienfarben
  je Theme mit dem dataviz-Palette-Validator geprüft (alle Checks PASS).
  Zeitraum 6/12/Alles, Datenstand-Hinweis, ehrliche Fußnote unter der
  Margen-Tabelle, Leerzustand für die junge Aktivitäts-Erfassung.
- Migration user_activity_days für die Portal-Staging-DB (auf Live legt
  sie der Monitor an, dort läuft die Erfassung in get_current_user).
- 10 neue Unit-Tests plus Auth-Smoke für den Endpoint, 96 Tests grün
  (die zwei bekannten shared-Import-Fehlschläge bestehen unverändert).

Gegenstück im Monitor: Commit d367c60 (Aktivitäts-Erfassung).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:09:34 +00:00
claude-dev
5fd4e64b4c docs: pricing-Router und billing_tariff-Migration in der Projektstruktur
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:32:47 +00:00
claude-dev
c4ea949f91 feat(pricing): Sätze kommen aus der Preistabelle, Rechner kann sie speichern
Die Credits-Sätze sind im Portal nicht mehr hart codiert. Neuer Endpoint
GET /api/pricing/tariff liest die geteilte Tabelle billing_tariff (mit
den beschlossenen Werten als Rückfallebene, falls die Tabelle fehlt),
PUT /api/pricing/tariff schreibt sie mit Validierung und Audit-Eintrag.

- Die Infozeile im Verbrauch-Bereich rendert ihre Zahlen aus der Tabelle,
  der statische Text bleibt nur als Rückfallebene stehen.
- Die Rechner-Regler starten auf den aktiven Preisen, der Hinweis nennt
  die tatsächlich abgerechneten Sätze, und der neue Knopf "Diese Sätze
  als aktive Preise speichern" schreibt sie nach Rückfrage in die
  Tabelle. Der Monitor bucht ab der nächsten Aktion mit den neuen Werten.
- Migration migrations/2026-07-25_billing_tariff.py für die eigene
  Staging-DB (auf Live legt die Tabelle der Monitor an und befüllt sie
  mit seinen wirksamen Konfigurationswerten).

Gegenstück im Monitor: Commit 027244a (billing_tariff als Quelle der
Buchung). Promote-Reihenfolge bleibt, erst Monitor, dann Verwaltung.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:32:25 +00:00
claude-dev
a639579366 feat(struktur): weniger Klicks, Org-Detail als eine Seite, Kontingent in der Übersicht
Drei Vereinfachungen auf Nutzerwunsch.

1. Das Org-Detail hat keine Unterreiter mehr. Verbrauch & Kontingent,
   Nutzer, Lizenzen und Einstellungen stehen untereinander auf einer
   Seite (Verbrauch optisch zuerst, per CSS-Order ohne Block-Verschiebung),
   die bisherigen Reiter sind Sprungmarken, die nur scrollen. Alle
   Bereiche laden sofort, der Org-Kopf zeigt den Kontingent-Stand als
   Kurzinfo.
2. Die Organisations-Tabelle bekommt eine Kontingent-Spalte mit
   Verbraucht/Verfügbar und Mini-Balken (gelb ab 50, rot ab 80 Prozent),
   Datenquelle ist die vorhandene Overview-API. Ganze Zeile klickbar.
3. Der globale Hauptreiter "Lizenzen" entfällt, er zeigte nur die
   Ablauf-Liste, die bereits auf dem Dashboard steht. Die Einträge dort
   öffnen jetzt direkt die jeweilige Organisation, die Kachel "Aktive
   Lizenzen" führt zur Organisations-Verwaltung. loadExpiringLicenses
   bleibt als abgesicherter No-op für Alt-Aufrufer erhalten.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:21:57 +00:00
claude-dev
7751657444 feat(dashboard): Kacheln und Karten verlinken auf ihre Bereiche
Die Statistik-Kacheln springen jetzt zu ihren Zielen. Organisationen und
Nutzer zur Organisations-Verwaltung, Aktive Lizenzen zum Lizenzen-Tab,
Vorfälle öffnen den Monitor in einem neuen Tab (im Portal gibt es keine
Vorfalls-Seite). Die Karte "Bald ablaufende Lizenzen" führt zum
Lizenzen-Tab, "Letzte Aktivität" zum Audit-Log. Hover-Optik mit
Gold-Rahmen und Chevron, bedienbar auch per Tastatur (Enter/Leertaste).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:07:55 +00:00
claude-dev
8fd087ea0c feat(design): AegisSight-Design, Lucide-Icons und aufgeräumter Verbrauchs-Bereich
Drei Pakete auf Nutzerwunsch.

1. Design-Angleichung an das AegisSight-Design-System. Navy/Gold-Token
   statt Slate/Amber, Light- UND Dark-Theme mit goldenem Schiebeschalter
   oben rechts (Dark = Standard, Wahl persistiert), Barrierefreiheits-
   Panel über js/a11y.js (identische Datei wie im Monitor), echtes Logo
   mit heller Plakette in Kopfzeile und Login, Poppins/Inter-Typografie,
   Radius 6/8 nach Styleguide. Automatisch erzeugte Light-Theme-
   Überschreibungen für alle Badge-Pastelltöne.
2. Lucide-Icons (Inline-SVG, keine externen Quellen) für alle
   Navigations-Tabs inkl. nachgeladenem Verbrauchsrechner, die
   Anlege-Knöpfe, Abmelden und Speichern.
3. Verbrauchs-Bereich aufgeräumt. Reiter heißt jetzt Verbrauch,
   Statistik in Kundensicht (Credits) und Interne Kosten (Einkauf, USD)
   getrennt, Leiste heißt Kontingent-Auslastung, Sätze-Infozeile mit
   Sprung zum Verbrauchsrechner, Altmodus-Felder (USD) und die
   Verbrauchs-Korrektur liegen in einem eingeklappten Bereich
   Erweitert mit Erklärtext. Der Rechner trägt einen deutlichen
   Simulations-Hinweis. Lizenz verlängern nutzt ein eigenes Modal
   statt des Browser-prompt().

Cache-Buster auf 20260725 gebumpt, alle Restfarben tokenisiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:57:59 +00:00
claude-dev
eeb74c74c1 fix(kontingent): Übertrag in den Folgemonat standardmäßig aus
Auf Nutzerwunsch findet ohne bewusste Entscheidung kein Übertrag statt.
Modell-Default, beide Checkboxen (Lizenz-Modal, Org-Modal) und der
Modell-Test stehen jetzt auf aus, der Übertrag bleibt pro Kunde
zuschaltbar. Der DB-Spalten-Default stand ohnehin schon auf 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:22:54 +00:00
claude-dev
e0c39de21f feat(kontingent): Credits-Stellwerte je Lizenz + Lizenz beim Org-Anlegen
Bedienseite für das Credits-Monatskontingent des Monitors. Das Portal
setzt jetzt alle Stellwerte, der Monitor bleibt Herr der Laufzeitfelder.

- Lizenz-Modal und Budget-Formular um Abrechnungszeitraum (monthly/total),
  Übertrag-Checkbox und Warnschwelle erweitert, Vorbelegungen auf das
  beschlossene Modell (10.000 Credits, monatlich, Übertrag an, 0,20 USD).
- Neue Organisation kann direkt eine Lizenz mit Kontingent anlegen
  (OrgCreate.license, verschachtelt). Org- und Lizenz-Insert laufen in
  EINER Transaktion, schlägt der Lizenz-Teil fehl, entsteht keine
  halbe Organisation. Gemeinsamer Helper insert_license_row statt
  Duplikation der Widerruf- und Audit-Logik.
- PUT /api/token-usage/budget validiert credits_period (monthly|total)
  und budget_warning_percent (1 bis 100), credits_rollover wird wie
  unlimited_budget normalisiert. Laufzeitfelder bleiben bewusst
  außerhalb der Whitelist.
- Overview und Org-Detail rechnen den Rest jetzt gegen verfügbar =
  Kontingent + Übertrag, dieselbe Bezugsgröße wie der Hard-Stop im
  Monitor. Neuer read-only Block Laufzeitwerte im Token-Subtab.
- Startup-Check loggt einen deutlichen Fehler, wenn die licenses-Tabelle
  die Credits-Spalten noch nicht hat (falsche Deploy-Reihenfolge).
- Migration migrations/2026-07-25_credits_period.py (idempotent,
  wortgleich mit der Monitor-Migration) für die Portal-Staging-DB,
  auf Live gilt: Monitor VOR Portal promoten.
- 13 neue Modell-Tests, pytest grün (die zwei bekannten
  shared-Import-Fehlschläge bestehen unverändert seit vorher).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:11:02 +00:00
8dde6b24f2 Promote develop → main (2026-07-24 20:37 UTC) 2026-07-24 22:37:51 +02:00
c95903fb3a Release-Notes: Neuer Verbrauchsrechner im Verwaltungsbereich 2026-07-24 22:37:48 +02:00
Claude
5c34bc7638 fix(rechner): Aktualisierung in den Regler-Beschriftungen sichtbar machen
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 20:31:20 +00:00
Claude
607da8f43d feat(rechner): Saetze per Regler einstellbar mit Empfehlung aus 30-Tage-API-Kosten
Neuer Router pricing.py (GET /api/pricing/cost-basis), liest die geteilte
Live-DB read-only und liefert Median-Kosten je Lagentyp plus Credit-Empfehlung.
main.py um den Router erweitert. Frontend rechner.js mit Reglern statt fester
Saetze und Empfehlungsanzeige je Aktion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 20:19:58 +00:00
Claude
6ce42a8809 feat(rechner): Grundwerte-Karten mit grossen Credits-Saetzen ueber dem Rechner
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 20:06:55 +00:00
Claude
706479721a feat(rechner): Verbrauchsrechner-Tab mit Posten-Modell (Credits-Saetze 45/40/120/1)
Eigenstaendiges Modul rechner.js, injiziert Tab, Bereich und Styles selbst.
dashboard.html und main.py bleiben unveraendert, damit der Staging-Deploy
nicht mit dem lokalen KB-Arbeitsstand kollidiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 17:35:07 +00:00
000b4ef526 Promote develop → main (2026-05-22 12:41 UTC) 2026-05-22 14:41:18 +02:00
52f5debe44 Release-Notes: X-Recherche-Konten im Verwaltungsportal verwalten 2026-05-22 14:41:16 +02:00