CodamAIDocs
Themafertig

Ein Kunde kündigt

Der Mandant wird gesperrt und später geschlossen. Was mit Anmeldungen, laufenden Anfragen und der Datenbank passiert.

Ausprägungen
Gültigkeitsfenster zum Vertragsendesofort sperrenschließendie Personen des Kundender Kunde kommt zurück

Worum es geht

nordbau kündigt zum 31. Dezember. Ab dem 1. Januar soll niemand mehr arbeiten können, die Daten sollen aber erst einmal vollständig bleiben – für Rückfragen, für die Aufbewahrung, für einen möglichen Rückzieher.

Alles, was dafür nötig ist, geschieht in CIAS, am Datensatz des Mandanten. CDMS erfährt davon nichts: Es fragt bei jeder Anfrage am Mandanten-Tor nach, ob dieser Mandant heute bedient wird, und richtet sich nach der Antwort.

Drei Wege, den Betrieb zu beenden

Welcher Handgriff passt zu welchem Anlass
Gültigkeitsfenster
POST …/{id}/validity
  • „gültig bis 31.12.“, der Stichtag wirkt von selbst
  • der Mandant bleibt ACTIVE, wird aber nicht mehr bedient
  • der richtige Weg, wenn das Ende feststeht
  • lässt sich durch ein neues Fenster wieder öffnen
Sperren
POST …/{id}/suspend
  • sofort außer Betrieb, Stellung SUSPENDED
  • der richtige Weg bei offener Rechnung oder einem Vorfall
  • umkehrbar: entsperren (…/resume) setzt ihn wieder in Betrieb
  • nur Entsperren hebt die Sperre auf, Aktivieren lehnt mit 409 ab
Schließen
POST …/{id}/close
  • endgültig, Stellung CLOSED
  • danach lehnen aktivieren, entsperren und sperren mit 409 ab
  • der Schlüssel bleibt belegt und ist für keinen neuen Kunden zu haben
  • der Datensatz bleibt, damit das Audit weiß, wem alte Einträge gehören

Der Zeitstrahl

gantt
    dateFormat YYYY-MM-DD
    axisFormat %d.%m.
    section nordbau
    wird bedient (ACTIVE, im Fenster)   :active, 2026-11-01, 2026-12-31
    nicht mehr bedient (Fenster vorbei) :crit, 2026-12-31, 2027-02-01
    geschlossen (CLOSED)                :crit, 2027-02-01, 2027-03-01

Am 31.12. wird noch bedient: Beide Grenzen des Fensters sind Tage und zählen mit. Am 1.1. antwortet das Tor „nicht bedient“, ohne dass jemand etwas tun muss. Das Schließen kommt später, wenn feststeht, dass der Kunde nicht zurückkommt.

Die Stationen eines gekündigten Vertrags
  1. 1
    Admin→CIAS
    setzt das Gültigkeitsfenster auf validUntil = 2026-12-31
    Der Aufruf ersetzt immer das ganze Fenster: Ein leerer Wert heißt „offen“, nicht „wie bisher“.
  2. 2
    CIAS
    Das Tor antwortet ab dem 1.1. „nicht bedient“, spätestens 30 Sekunden nach dem Stichtag überall
  3. 3
    Admin→CIAS
    schließt den Mandanten: POST /cias/admin/tenants/{id}/close
  4. 4
    CIAS
    Stellung CLOSED, Ereignis Closed im Audit
    Ergebnis: Die Datenbank des Kunden, seine Dateien, seine Konten und das Audit bleiben unverändert liegen.

Die {id} ist die technische ID, nicht der Schlüssel. Sie liefert GET /cias/admin/tenants/by-key?key=nordbau.

Was in der Sekunde danach passiert

Das Tor merkt sich jede Antwort eine kurze Zeit, standardmäßig 30 Sekunden (codamai.cias.tenant-gate.ttl), und zwar je Knoten der Anwendung. Deshalb hört der Betrieb nicht schlagartig auf:

sequenceDiagram
    participant A as Admin
    participant C as CIAS
    participant G as Mandanten-Tor
    participant K as Client von nordbau
    K->>G: Anfrage (0 s)
    G->>C: Wird nordbau bedient?
    C-->>G: ja, für 30 s gemerkt
    A->>C: nordbau sperren (10 s)
    K->>G: Anfrage (20 s)
    G-->>K: gemerkt: ja, läuft durch
    K->>G: Anfrage (35 s)
    G->>C: Wird nordbau bedient?
    C-->>G: nein
    G-->>K: 403 tenant-not-served
WasWirkung
Anfragen, die das Tor schon passiert habenlaufen ganz zu Ende, samt Schreibvorgang und Transaktion
neue Anfragenbis zu 30 Sekunden noch aus dem Gedächtnis zugelassen, danach 403 cias.authentication.tenant-not-served
Anmeldung bei Keycloakgelingt weiter. Keycloak weiß nichts von der Sperre, die Konten sind ja unverändert
Anfragen an CIAS selbst, etwa /cias/meebenfalls 403: Das Tor steht vor jeder Anfrage, deren Token diesen Mandanten nennt
Zeitgeber und Nachrichtenempfängerarbeiten nicht mehr für diesen Mandanten, sofern sie wie vorgesehen über TenantScope laufen: Das fragt dasselbe Tor
andere Mandantengar nicht betroffen

Die Merkzeit ist damit eine Sicherheitseinstellung: Sie legt fest, wie lange ein eben gesperrter Kunde noch weiterarbeitet.

Eine Anfrage von nordbau nach der Sperre
  1. CIAS
    Token prüfen
    Signatur und Ablauf gültig?
    ↳ nein 401
  2. CIAS
    Mandant bestimmen
    Welcher Mandant ist gemeint?
    ↳ nein 403 tenant-unresolved
  3. CIAS
    Mandanten-Tor
    Wird nordbau heute bedient?
    ↳ nein 403 cias.authentication.tenant-not-served – hier endet jetzt alles
  4. erreicht CDMS gar nicht mehr

Für alle Ablehnungen gibt es nur diesen einen Schlüssel: gesperrt, geschlossen, abgelaufen und unbekannt sehen von außen gleich aus. Sonst könnte jeder mit einem gültigen Token Firmennamen durchprobieren und daraus die Kundenliste ablesen.

Was bleibt und was weg ist

Nach dem Schließen von nordbau
Bleibt
unverändert
  • die Datenbank des Mandanten mit allen Tabellen, Zeilen und Revisionen
  • alle Dateien im Dateispeicher
  • die Konten der Personen in Keycloak, aktiv, samt Mitgliedschaft in der Organisation
  • die Benutzerdatensätze und Rollenvergaben in CIAS
  • das CIAS-Audit in der System-Datenbank, mit Suspended und Closed
  • der Mandantendatensatz samt Schlüssel
Ist weg
nur der Zugang
  • jede Anfrage, die diesen Mandanten nennt
  • jede Arbeit ohne Anfrage für diesen Mandanten
  • nach einer Weile ohne Zugriff auch Verbindungspool und Hibernate-Objekte, die CDMS für ihn bereithielt

Der letzte Punkt ist reine Aufräumarbeit: CDMS räumt einen Mandanten, der länger nicht gebraucht wurde, aus seinem Vorrat (standardmäßig nach 1800 Sekunden). Die Datenbank selbst bleibt davon unberührt – CDMS löscht nie eine Datenbank. Sie zu entfernen ist ein eigener, bewusster Schritt außerhalb der API.

Die Personen des Kunden

Ein gesperrter Mandant nimmt niemandem sein Konto. Die Personen von nordbau können sich weiter anmelden, bekommen Tokens und laufen bei jeder Anfrage ins Tor. Wenn ihre Konten auch enden sollen, ist das ein eigener Handgriff je Person:

Wie weit soll es gehen?
ZielHandgriff
Der Kunde soll nicht mehr arbeiten könnenMandant sperren. Wirkt nach höchstens 30 Sekunden für alle
Niemand des Kunden soll sich mehr anmelden könnenzusätzlich jedes Konto sperren oder schließen, siehe Eine Person verlässt die Firma
Der Kunde könnte zurückkommensperren statt schließen, oder nur das Gültigkeitsfenster setzen
Der Kunde ist endgültig wegschließen. Danach führt kein Weg zurück

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-tenancy – TenantAdminController (/{id}/suspend, /{id}/close, /{id}/validity, /by-key; kein DELETE), TenantService (suspend, resume, close, changeValidity), Tenant (isServedOn, resume, activate nur mit PROVISIONED und nicht aus SUSPENDED), TenantStatus, TenantEvent (Suspended, Resumed, Closed)
  • CIAS/cias-authentication – TenantGate (admit, Merkzeit), TenantGateProperties (codamai.cias.tenant-gate.ttl 30s, max-entries 10000), TokenParser.admit, RequestAdmission.TENANT_NOT_SERVED, JwtSessionFilter (/cias/** nicht ausgenommen)
  • CIAS/cias-kernel – TenantScope (Arbeit ohne Anfrage fragt dasselbe Tor)
  • commons-persistence – DataSourceManager, TenantEntityManagerFactory (sweepIdle, kein Löschen von Datenbanken), PersistenceProperties (Factory-Cache 100 / 1800 s)
  • CIAS/cias-audit – AuditEntry (Einträge bleiben in der System-Datenbank)
  • CIAS/cias-tenancy/docs/adr – ADR-016, ADR-020; CIAS/cias-authentication/docs/adr – ADR-021
Suchen